diff --git a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPStackFrame.java b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPStackFrame.java index 01dbf76d8..9583ea39a 100644 --- a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPStackFrame.java +++ b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPStackFrame.java @@ -26,6 +26,9 @@ import org.eclipse.lsp4j.debug.StackFrame; public class DSPStackFrame extends DSPDebugElement implements IStackFrame { + + private static final IRegisterGroup[] NO_REGISTER_GROUPS = new IRegisterGroup[0]; + private final DSPThread thread; private StackFrame stackFrame; private final int depth; @@ -157,7 +160,7 @@ public DSPThread getThread() { @Override public IRegisterGroup[] getRegisterGroups() throws DebugException { - return new IRegisterGroup[0]; + return NO_REGISTER_GROUPS; } @Override diff --git a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPThread.java b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPThread.java index 5661d21f1..aae65fab0 100644 --- a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPThread.java +++ b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPThread.java @@ -35,6 +35,10 @@ import org.eclipse.lsp4j.debug.Thread; public class DSPThread extends DSPDebugElement implements IThread { + + private static final IStackFrame[] NO_STACK_FRAMES = new IStackFrame[0]; + private static final IBreakpoint[] NO_BREAKPOINTS = new IBreakpoint[0]; + private final Integer id; /** * The name may not be known, if it is requested we will ask for it from the @@ -232,7 +236,7 @@ public boolean hasStackFrames() throws DebugException { @Override public IStackFrame[] getStackFrames() throws DebugException { if (!isSuspended()) { - return new IStackFrame[0]; + return NO_STACK_FRAMES; } if (!refreshFrames.getAndSet(false)) { synchronized (frames) { @@ -263,12 +267,12 @@ public IStackFrame[] getStackFrames() throws DebugException { return future.get(); } catch (RuntimeException | ExecutionException e) { if (isTerminated()) { - return new DSPStackFrame[0]; + return NO_STACK_FRAMES; } throw newTargetRequestFailedException(e.getMessage(), e); } catch (InterruptedException e) { java.lang.Thread.currentThread().interrupt(); - return new DSPStackFrame[0]; + return NO_STACK_FRAMES; } } @@ -291,7 +295,7 @@ public String getName() { @Override public IBreakpoint[] getBreakpoints() { // TODO update breakpoints from stopped messages from server - return new IBreakpoint[0]; + return NO_BREAKPOINTS; } public Integer getId() { diff --git a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPValue.java b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPValue.java index 8ff0d70d3..76c49c222 100644 --- a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPValue.java +++ b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/debugmodel/DSPValue.java @@ -19,6 +19,8 @@ public final class DSPValue extends DSPDebugElement implements IValue { + private static final IVariable[] NO_VARIABLES = new IVariable[0]; + private final @Nullable DSPVariable modelVariable; private final Integer variablesReference; private final String value; @@ -41,7 +43,7 @@ public DSPValue(DSPDebugTarget debugger, Integer variablesReference, String valu @Override public IVariable @Nullable [] getVariables() throws DebugException { if (!hasVariables()) { - return new IVariable[0]; + return NO_VARIABLES; } if (cachedVariables == null) { final var arguments = new VariablesArguments(); diff --git a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/presentation/DAPWatchExpression.java b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/presentation/DAPWatchExpression.java index 85a43d7e0..dd4442aec 100644 --- a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/presentation/DAPWatchExpression.java +++ b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/presentation/DAPWatchExpression.java @@ -8,6 +8,7 @@ *******************************************************************************/ package org.eclipse.lsp4e.debug.presentation; +import static org.eclipse.lsp4e.internal.ArrayUtil.NO_STRINGS; import static org.eclipse.lsp4e.internal.NullSafetyHelper.castNonNull; import org.eclipse.core.runtime.Adapters; @@ -21,6 +22,7 @@ import org.eclipse.lsp4e.debug.debugmodel.DSPDebugTarget; import org.eclipse.lsp4e.debug.debugmodel.DSPStackFrame; import org.eclipse.lsp4e.debug.debugmodel.DSPValue; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.lsp4j.debug.EvaluateArguments; import org.eclipse.lsp4j.debug.EvaluateResponse; @@ -63,7 +65,7 @@ public String getExpressionText() { @Override public String[] getErrorMessages() { - return new String[0]; + return NO_STRINGS; } }; } diff --git a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/sourcelookup/AbsolutePathSourceContainer.java b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/sourcelookup/AbsolutePathSourceContainer.java index ff262e6cc..b4986ab62 100644 --- a/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/sourcelookup/AbsolutePathSourceContainer.java +++ b/org.eclipse.lsp4e.debug/src/org/eclipse/lsp4e/debug/sourcelookup/AbsolutePathSourceContainer.java @@ -8,6 +8,8 @@ *******************************************************************************/ package org.eclipse.lsp4e.debug.sourcelookup; +import static org.eclipse.lsp4e.internal.ArrayUtil.NO_OBJECTS; + import java.nio.file.Paths; import org.eclipse.core.runtime.CoreException; @@ -23,7 +25,7 @@ public Object[] findSourceElements(String name) throws CoreException { if (name != null && Paths.get(name).isAbsolute()) { return new Object[] { name }; } - return new Object[0]; + return NO_OBJECTS; } @Override diff --git a/org.eclipse.lsp4e.jdt/src/org/eclipse/lsp4e/jdt/LspJavaQuickAssistProcessor.java b/org.eclipse.lsp4e.jdt/src/org/eclipse/lsp4e/jdt/LspJavaQuickAssistProcessor.java index 4494cad38..abc4c5893 100644 --- a/org.eclipse.lsp4e.jdt/src/org/eclipse/lsp4e/jdt/LspJavaQuickAssistProcessor.java +++ b/org.eclipse.lsp4e.jdt/src/org/eclipse/lsp4e/jdt/LspJavaQuickAssistProcessor.java @@ -30,6 +30,7 @@ public class LspJavaQuickAssistProcessor extends LSPCodeActionQuickAssistProcessor implements IQuickAssistProcessor { private static final int RELEVANCE = 100; + private static final IJavaCompletionProposal[] NO_JAVA_COMPLETION_PROPOSALS = new IJavaCompletionProposal[0]; private IQuickAssistInvocationContext getContext(IInvocationContext context) { return new IQuickAssistInvocationContext() { @@ -63,7 +64,7 @@ public boolean hasAssists(@NonNullByDefault({}) IInvocationContext context) thro ICompletionProposal[] proposals = computeQuickAssistProposals(getContext(context)); if (proposals == null) - return new IJavaCompletionProposal[0]; + return NO_JAVA_COMPLETION_PROPOSALS; final var javaProposals = new IJavaCompletionProposal[proposals.length]; for (int i = 0; i < proposals.length; i++) { diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LaunchConfigurationStreamProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LaunchConfigurationStreamProvider.java index 3a0725982..328e1662b 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LaunchConfigurationStreamProvider.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LaunchConfigurationStreamProvider.java @@ -12,6 +12,7 @@ *******************************************************************************/ package org.eclipse.lsp4e; +import static org.eclipse.lsp4e.internal.ArrayUtil.NO_BYTES; import static org.eclipse.lsp4e.internal.NullSafetyHelper.castNonNull; import java.io.IOException; @@ -60,11 +61,10 @@ public class LaunchConfigurationStreamProvider implements StreamConnectionProvid protected static class StreamProxyInputStream extends InputStream implements IStreamListener { private static final int EOF = -1; - private static final byte[] NO_DATA = new byte[0]; private final ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<>(); private final IProcess process; - private byte[] currentBuffer = NO_DATA; + private byte[] currentBuffer = NO_BYTES; private int currentBufferPos = 0; public StreamProxyInputStream(IProcess process) { diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/callhierarchy/CallHierarchyContentProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/callhierarchy/CallHierarchyContentProvider.java index f372b4d27..c8f4ca0d6 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/callhierarchy/CallHierarchyContentProvider.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/callhierarchy/CallHierarchyContentProvider.java @@ -26,6 +26,7 @@ import org.eclipse.lsp4e.LanguageServerWrapper; import org.eclipse.lsp4e.LanguageServers; import org.eclipse.lsp4e.LanguageServers.LanguageServerDocumentExecutor; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.lsp4e.internal.Pair; import org.eclipse.lsp4e.ui.Messages; import org.eclipse.lsp4e.ui.views.HierarchyViewInput; @@ -59,7 +60,7 @@ public Object[] getChildren(final Object parentElement) { if (parentElement instanceof CallHierarchyViewTreeNode treeNode) { return findCallers(treeNode); } else { - return new Object[0]; + return ArrayUtil.NO_OBJECTS; } } diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/internal/ArrayUtil.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/internal/ArrayUtil.java new file mode 100644 index 000000000..b2b314296 --- /dev/null +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/internal/ArrayUtil.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2024 Sebastian Thomschke and others. + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Sebastian Thomschke - initial implementation + *******************************************************************************/ +package org.eclipse.lsp4e.internal; + +public class ArrayUtil { + + /** reusable empty byte array */ + public static final byte[] NO_BYTES = new byte[0]; + + /** reusable empty char array */ + public static final char[] NO_CHARS = new char[0]; + + /** reusable empty {@link Object} array */ + public static final Object[] NO_OBJECTS = new Object[0]; + + /** reusable empty {@link String} array */ + public static final String[] NO_STRINGS = new String[0]; + + private ArrayUtil() { + } +} diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/CommandMarkerResolution.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/CommandMarkerResolution.java index d41179ae0..8bee83832 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/CommandMarkerResolution.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/CommandMarkerResolution.java @@ -31,6 +31,8 @@ public class CommandMarkerResolution extends WorkbenchMarkerResolution implements IMarkerResolution { + private static final IMarker[] NO_MARKERS = new IMarker[0]; + private final Command command; public CommandMarkerResolution(Command command) { @@ -80,7 +82,7 @@ public String getDescription() { @Override public IMarker[] findOtherMarkers(IMarker[] markers) { - return new IMarker[0]; + return NO_MARKERS; } } diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/LSPCodeActionMarkerResolution.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/LSPCodeActionMarkerResolution.java index 411d99520..6dbadd468 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/LSPCodeActionMarkerResolution.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/codeactions/LSPCodeActionMarkerResolution.java @@ -68,6 +68,8 @@ public class LSPCodeActionMarkerResolution implements IMarkerResolutionGenerator2 { + private static final IMarkerResolution[] NO_MARKER_RESOLUTIONS = new IMarkerResolution[0]; + private static final String LSP_REMEDIATION = "lspCodeActions"; //$NON-NLS-1$ private static final IMarkerResolution2 COMPUTING = new IMarkerResolution2() { @@ -106,15 +108,15 @@ public IMarkerResolution[] getResolutions(IMarker marker) { } catch (InterruptedException e) { LanguageServerPlugin.logError(e); Thread.currentThread().interrupt(); - return new IMarkerResolution[0]; + return NO_MARKER_RESOLUTIONS; } catch (Exception e) { LanguageServerPlugin.logError(e); - return new IMarkerResolution[0]; + return NO_MARKER_RESOLUTIONS; } if (att == COMPUTING) { return new IMarkerResolution[] { COMPUTING }; } else if (att == null) { - return new IMarkerResolution[0]; + return NO_MARKER_RESOLUTIONS; } return ((List>) att).stream().filter(LSPCodeActionMarkerResolution::canPerform) .map(command -> command.map(CommandMarkerResolution::new, CodeActionMarkerResolution::new)) diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/completion/LSContentAssistProcessor.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/completion/LSContentAssistProcessor.java index d958368e1..201ceaf52 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/completion/LSContentAssistProcessor.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/completion/LSContentAssistProcessor.java @@ -13,6 +13,7 @@ *******************************************************************************/ package org.eclipse.lsp4e.operations.completion; +import static org.eclipse.lsp4e.internal.ArrayUtil.NO_CHARS; import static org.eclipse.lsp4e.internal.NullSafetyHelper.castNonNull; import java.net.URI; @@ -68,17 +69,19 @@ public class LSContentAssistProcessor implements IContentAssistProcessor { + private static final ICompletionProposal[] NO_COMPLETION_PROPOSALS = new ICompletionProposal[0]; private static final long TRIGGERS_TIMEOUT = 50; private static final long CONTEXT_INFORMATION_TIMEOUT = 1000; + private @Nullable IDocument currentDocument; private @Nullable String errorMessage; private final boolean errorAsCompletionItem; private @Nullable CompletableFuture> completionLanguageServersFuture; private final Object completionTriggerCharsSemaphore = new Object(); - private char[] completionTriggerChars = new char[0]; + private char[] completionTriggerChars = NO_CHARS; private @Nullable CompletableFuture> contextInformationLanguageServersFuture; private final Object contextTriggerCharsSemaphore = new Object(); - private char[] contextTriggerChars = new char[0]; + private char[] contextTriggerChars = NO_CHARS; private final boolean incompleteAsCompletionItem; /** @@ -107,12 +110,12 @@ public LSContentAssistProcessor(boolean errorAsCompletionItem, boolean incomplet public ICompletionProposal @Nullable [] computeCompletionProposals(ITextViewer viewer, int offset) { IDocument document = viewer.getDocument(); if (document == null) { - return new LSCompletionProposal[0]; + return NO_COMPLETION_PROPOSALS; } URI uri = LSPEclipseUtils.toUri(document); if (uri == null) { - return new LSCompletionProposal[0]; + return NO_COMPLETION_PROPOSALS; } initiateLanguageServers(document); @@ -201,7 +204,7 @@ private ICompletionProposal[] createErrorProposal(int offset, Exception ex) { return new ICompletionProposal[] { new CompletionProposal("", offset, 0, 0, null, Messages.completionError, null, ex.getMessage()) }; //$NON-NLS-1$ } else { - return new ICompletionProposal[0]; + return NO_COMPLETION_PROPOSALS; } } @@ -214,7 +217,7 @@ private ICompletionProposal[] createIncompleProposal(int offset, boolean incompl return new ICompletionProposal[] { new CompletionProposal("", offset, 0, 0, null, //$NON-NLS-1$ Messages.completionIncomplete, null, Messages.continueIncomplete) }; } - return new ICompletionProposal[0]; + return NO_COMPLETION_PROPOSALS; } private void initiateLanguageServers(IDocument document) { @@ -234,8 +237,8 @@ private void initiateLanguageServers(IDocument document) { // nothing } } - this.completionTriggerChars = new char[0]; - this.contextTriggerChars = new char[0]; + this.completionTriggerChars = NO_CHARS; + this.contextTriggerChars = NO_CHARS; this.completionLanguageServersFuture = LanguageServers.forDocument(document) .withFilter(capabilities -> capabilities.getCompletionProvider() != null) // @@ -368,7 +371,7 @@ private void getFuture(@Nullable CompletableFuture> future) { private static char[] mergeTriggers(char @Nullable [] initialArray, @Nullable Collection additionalTriggers) { if (initialArray == null) { - initialArray = new char[0]; + initialArray = NO_CHARS; } if (additionalTriggers == null) { additionalTriggers = Collections.emptySet(); diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/folding/LSPFoldingReconcilingStrategy.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/folding/LSPFoldingReconcilingStrategy.java index 6eb279456..5680aed92 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/folding/LSPFoldingReconcilingStrategy.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/folding/LSPFoldingReconcilingStrategy.java @@ -59,6 +59,8 @@ public class LSPFoldingReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension, IProjectionListener, ITextViewerLifecycle { + private static final Annotation[] NO_ANNOTATIONS = new Annotation[0]; + private @Nullable IDocument document; private @Nullable ProjectionAnnotationModel projectionAnnotationModel; private @Nullable ProjectionViewer viewer; @@ -181,7 +183,7 @@ private void applyFolding(@Nullable List ranges) { // send the calculated updates to the annotations to the // annotation model theProjectionAnnotationModel.modifyAnnotations(deletions.toArray(Annotation[]::new), additions, - new Annotation[0]); + NO_ANNOTATIONS); } } diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/references/LSSearchResult.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/references/LSSearchResult.java index f5a1902d4..248ec62a0 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/references/LSSearchResult.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/references/LSSearchResult.java @@ -39,7 +39,7 @@ public LSSearchResult(LSSearchQuery query) { super(query); } - private static final Match[] EMPTY_ARR= new Match[0]; + private static final Match[] NO_MATCHES = new Match[0]; private final Set nonFileElements = ConcurrentHashMap.newKeySet(); @Override @@ -68,7 +68,7 @@ public Match[] computeContainedMatches(AbstractTextSearchResult result, IEditorP } else if (ei instanceof IURIEditorInput uriInput) { return getMatches(uriInput.getURI()); } - return EMPTY_ARR; + return NO_MATCHES; } @Override diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/references/LSSearchResultPage.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/references/LSSearchResultPage.java index 00d0144fb..afbf405da 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/references/LSSearchResultPage.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/references/LSSearchResultPage.java @@ -19,6 +19,7 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.lsp4e.LSPEclipseUtils; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.lsp4e.operations.references.FileAndURIMatchLabelProvider.FileAndURIMatchBaseLabelProvider; import org.eclipse.search.internal.ui.text.DecoratingFileSearchLabelProvider; import org.eclipse.search.internal.ui.text.FileMatch; @@ -81,7 +82,7 @@ protected void elementsChanged(Object[] objects) { @Override protected void clear() { - getViewer().setInput(new Object[0]); + getViewer().setInput(ArrayUtil.NO_OBJECTS); } @Override diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java index 88941f932..33ac4c71f 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/symbols/WorkspaceSymbolsQuickAccessProvider.java @@ -35,11 +35,13 @@ public class WorkspaceSymbolsQuickAccessProvider implements IQuickAccessComputer, IQuickAccessComputerExtension { + private static final QuickAccessElement[] NO_QUICK_ACCESS_ELEMENTS = new QuickAccessElement[0]; + private @Nullable List usedLanguageServerWrappers; @Override public QuickAccessElement[] computeElements() { - return new QuickAccessElement[0]; + return NO_QUICK_ACCESS_ELEMENTS; } @Override @@ -58,7 +60,7 @@ public QuickAccessElement[] computeElements(String query, IProgressMonitor monit final var usedLanguageServerWrappers = this.usedLanguageServerWrappers = LanguageServiceAccessor .getStartedWrappers(capabilities -> LSPEclipseUtils.hasCapability(capabilities.getWorkspaceSymbolProvider()), true); if (usedLanguageServerWrappers.isEmpty()) { - return new QuickAccessElement[0]; + return NO_QUICK_ACCESS_ELEMENTS; } final var params = new WorkspaceSymbolParams(query); final var res = Collections.synchronizedList(new ArrayList()); diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeHierarchyContentProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeHierarchyContentProvider.java index 11cc14af6..0d09c2237 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeHierarchyContentProvider.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeHierarchyContentProvider.java @@ -8,6 +8,7 @@ *******************************************************************************/ package org.eclipse.lsp4e.operations.typeHierarchy; +import static org.eclipse.lsp4e.internal.ArrayUtil.NO_OBJECTS; import static org.eclipse.lsp4e.internal.NullSafetyHelper.lateNonNull; import java.util.AbstractMap.SimpleEntry; @@ -49,7 +50,7 @@ public Object[] getElements(@Nullable Object inputElement) { try { final var identifier = LSPEclipseUtils.toTextDocumentIdentifier(document); if (identifier == null) { - return new Object[0]; + return NO_OBJECTS; } Position position = LSPEclipseUtils.toPosition(textSelection.getOffset(), document); final var prepare = new TypeHierarchyPrepareParams(identifier, position); @@ -57,13 +58,13 @@ public Object[] getElements(@Nullable Object inputElement) { .computeFirst((wrapper, ls) -> ls.getTextDocumentService().prepareTypeHierarchy(prepare).thenApply(items -> new SimpleEntry<>(wrapper, items))) .thenApply(entry -> { wrapper = entry.map(Entry::getKey).orElse(null); - return entry.map(Entry::getValue).map(list -> list.toArray()).orElse(new Object[0]); + return entry.map(Entry::getValue).map(list -> list.toArray()).orElse(NO_OBJECTS); }).get(500, TimeUnit.MILLISECONDS); } catch (Exception e) { LanguageServerPlugin.logError(e); } } - return new Object[0]; + return NO_OBJECTS; } @Override @@ -77,13 +78,13 @@ public Object[] getChildren(Object parentElement) { ? textDocumentService.typeHierarchySupertypes(new TypeHierarchySupertypesParams(parentItem)) : textDocumentService.typeHierarchySubtypes(new TypeHierarchySubtypesParams(parentItem)); }) - .thenApply(list -> list == null ? new Object[0] : list.toArray()) + .thenApply(list -> list == null ? NO_OBJECTS : list.toArray()) .get(500, TimeUnit.MILLISECONDS); } catch (Exception e) { LanguageServerPlugin.logError(e); } } - return new Object[0]; + return NO_OBJECTS; } @Override diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeHierarchyViewContentProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeHierarchyViewContentProvider.java index b5608d05f..ae36538a0 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeHierarchyViewContentProvider.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeHierarchyViewContentProvider.java @@ -11,6 +11,8 @@ *******************************************************************************/ package org.eclipse.lsp4e.operations.typeHierarchy; +import static org.eclipse.lsp4e.internal.ArrayUtil.NO_OBJECTS; + import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; @@ -27,6 +29,7 @@ import org.eclipse.lsp4e.LanguageServerWrapper; import org.eclipse.lsp4e.LanguageServers; import org.eclipse.lsp4e.LanguageServers.LanguageServerDocumentExecutor; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.lsp4e.internal.Pair; import org.eclipse.lsp4e.ui.Messages; import org.eclipse.lsp4e.ui.views.HierarchyViewInput; @@ -66,13 +69,13 @@ public Object[] getChildren(Object parentElement) { ? textDocumentService.typeHierarchySupertypes(new TypeHierarchySupertypesParams(parentItem)) : textDocumentService.typeHierarchySubtypes(new TypeHierarchySubtypesParams(parentItem)); }) - .thenApply(list -> list == null ? new Object[0] : list.toArray()) + .thenApply(list -> list == null ? NO_OBJECTS : list.toArray()) .get(500, TimeUnit.MILLISECONDS); } catch (Exception e) { LanguageServerPlugin.logError(e); } } - return new Object[0]; + return NO_OBJECTS; } @Override diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeMemberContentProvider.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeMemberContentProvider.java index 2bdd1f9dc..90b3934d6 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeMemberContentProvider.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/operations/typeHierarchy/TypeMemberContentProvider.java @@ -11,6 +11,9 @@ *******************************************************************************/ package org.eclipse.lsp4e.operations.typeHierarchy; + +import static org.eclipse.lsp4e.internal.ArrayUtil.NO_OBJECTS; + import java.net.URI; import java.util.List; @@ -20,14 +23,13 @@ import org.eclipse.lsp4j.DocumentSymbol; public class TypeMemberContentProvider implements IStructuredContentProvider { - private static final Object[] NO_CHILDREN = new Object[0]; @Override public Object[] getElements(@Nullable Object inputElement) { if (inputElement instanceof DocumentSymbolWithURI symbolContainer) { return toContainer(symbolContainer.symbol.getChildren(), symbolContainer.uri); } - return NO_CHILDREN; + return NO_OBJECTS; } private Object[] toContainer(@Nullable List symbols, URI uri) { @@ -38,7 +40,7 @@ private Object[] toContainer(@Nullable List symbols, URI uri) { } return container; } - return NO_CHILDREN; + return NO_OBJECTS; } } diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsModel.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsModel.java index 10fca7c1b..30784d0c0 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsModel.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsModel.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.eclipse.lsp4e.outline; +import static org.eclipse.lsp4e.internal.ArrayUtil.NO_OBJECTS; import static org.eclipse.lsp4e.internal.NullSafetyHelper.*; import java.net.URI; @@ -36,7 +37,6 @@ public class SymbolsModel { private static final SymbolInformation ROOT_SYMBOL_INFORMATION = new SymbolInformation(); - private static final Object[] EMPTY = new Object[0]; private volatile Map> childrenMap = Collections.emptyMap(); private volatile List rootSymbols = Collections.emptyList(); @@ -190,7 +190,7 @@ public Object[] getChildren(@Nullable Object parentElement) { } } } - return EMPTY; + return NO_OBJECTS; } public boolean hasChildren(@Nullable Object parentElement) { diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ui/NewContentTypeLSPLaunchDialog.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ui/NewContentTypeLSPLaunchDialog.java index 07f3c2902..70f73423b 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ui/NewContentTypeLSPLaunchDialog.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ui/NewContentTypeLSPLaunchDialog.java @@ -11,6 +11,7 @@ *******************************************************************************/ package org.eclipse.lsp4e.ui; +import static org.eclipse.lsp4e.internal.ArrayUtil.NO_OBJECTS; import static org.eclipse.lsp4e.internal.NullSafetyHelper.castNonNull; import java.util.ArrayList; @@ -74,7 +75,7 @@ private static final class ContentTypesContentProvider implements ITreeContentPr public Object[] getChildren(@Nullable Object parentElement) { final var manager = this.manager; if(manager == null) - return new Object[0]; + return NO_OBJECTS; final var elements = new ArrayList(); final var baseType = (IContentType) parentElement; IContentType[] contentTypes = manager.getAllContentTypes();