From a70b030e1d83b8718488137a5012f671011d598b Mon Sep 17 00:00:00 2001 From: Sebastian Thomschke Date: Fri, 23 Aug 2024 14:51:38 +0200 Subject: [PATCH] perf: reuse empty arrays --- .../lsp4e/debug/debugmodel/DSPStackFrame.java | 5 +++- .../lsp4e/debug/debugmodel/DSPThread.java | 12 +++++--- .../lsp4e/debug/debugmodel/DSPValue.java | 4 ++- .../presentation/DAPWatchExpression.java | 3 +- .../AbsolutePathSourceContainer.java | 3 +- .../jdt/LspJavaQuickAssistProcessor.java | 3 +- .../LaunchConfigurationStreamProvider.java | 4 +-- .../CallHierarchyContentProvider.java | 3 +- .../org/eclipse/lsp4e/internal/ArrayUtil.java | 30 +++++++++++++++++++ .../codeactions/CommandMarkerResolution.java | 4 ++- .../LSPCodeActionMarkerResolution.java | 8 +++-- .../completion/LSContentAssistProcessor.java | 21 +++++++------ .../LSPFoldingReconcilingStrategy.java | 4 ++- .../operations/references/LSSearchResult.java | 4 +-- .../references/LSSearchResultPage.java | 3 +- .../WorkspaceSymbolsQuickAccessProvider.java | 6 ++-- .../TypeHierarchyContentProvider.java | 11 +++---- .../TypeHierarchyViewContentProvider.java | 5 ++-- .../TypeMemberContentProvider.java | 6 ++-- .../eclipse/lsp4e/outline/SymbolsModel.java | 4 +-- .../ui/NewContentTypeLSPLaunchDialog.java | 3 +- 21 files changed, 102 insertions(+), 44 deletions(-) create mode 100644 org.eclipse.lsp4e/src/org/eclipse/lsp4e/internal/ArrayUtil.java 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..5ca545be8 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[] ZERO_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 ZERO_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..958c5dee5 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[] ZERO_STACK_FRAMES = new IStackFrame[0]; + private static final IBreakpoint[] ZERO_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 ZERO_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 ZERO_STACK_FRAMES; } throw newTargetRequestFailedException(e.getMessage(), e); } catch (InterruptedException e) { java.lang.Thread.currentThread().interrupt(); - return new DSPStackFrame[0]; + return ZERO_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 ZERO_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..98f0eff01 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[] ZERO_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 ZERO_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..74ff152b7 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 @@ -21,6 +21,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 +64,7 @@ public String getExpressionText() { @Override public String[] getErrorMessages() { - return new String[0]; + return ArrayUtil.ZERO_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..6a8ecfc37 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 @@ -15,6 +15,7 @@ import org.eclipse.debug.core.sourcelookup.ISourceContainerType; import org.eclipse.debug.core.sourcelookup.containers.AbstractSourceContainer; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.lsp4e.internal.ArrayUtil; public class AbsolutePathSourceContainer extends AbstractSourceContainer implements ISourceContainer { @@ -23,7 +24,7 @@ public Object[] findSourceElements(String name) throws CoreException { if (name != null && Paths.get(name).isAbsolute()) { return new Object[] { name }; } - return new Object[0]; + return ArrayUtil.ZERO_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..7508a3e9e 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[] ZERO_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 ZERO_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..94b008fcf 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LaunchConfigurationStreamProvider.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/LaunchConfigurationStreamProvider.java @@ -41,6 +41,7 @@ import org.eclipse.debug.internal.core.IInternalDebugCoreConstants; import org.eclipse.debug.internal.core.Preferences; import org.eclipse.jdt.annotation.Nullable; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.lsp4e.server.StreamConnectionProvider; /** @@ -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 = ArrayUtil.ZERO_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..1b1fc1ffa 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.ZERO_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..99df3a755 --- /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 { + + /** empty byte array */ + public static final byte[] ZERO_BYTES = new byte[0]; + + /** empty char array */ + public static final char[] ZERO_CHARS = new char[0]; + + /** empty {@link Object} array */ + public static final Object[] ZERO_OBJECTS = new Object[0]; + + /** empty {@link String} array */ + public static final String[] ZERO_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..bef0edf26 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[] ZERO_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 ZERO_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..7f4be6ed0 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[] ZERO_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 ZERO_MARKER_RESOLUTIONS; } catch (Exception e) { LanguageServerPlugin.logError(e); - return new IMarkerResolution[0]; + return ZERO_MARKER_RESOLUTIONS; } if (att == COMPUTING) { return new IMarkerResolution[] { COMPUTING }; } else if (att == null) { - return new IMarkerResolution[0]; + return ZERO_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..2bf8b2df0 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 @@ -47,6 +47,7 @@ import org.eclipse.lsp4e.LanguageServerPlugin; import org.eclipse.lsp4e.LanguageServerWrapper; import org.eclipse.lsp4e.LanguageServers; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.lsp4e.internal.CancellationSupport; import org.eclipse.lsp4e.internal.CancellationUtil; import org.eclipse.lsp4e.ui.Messages; @@ -68,17 +69,19 @@ public class LSContentAssistProcessor implements IContentAssistProcessor { + private static final ICompletionProposal[] ZERO_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 = ArrayUtil.ZERO_CHARS; private @Nullable CompletableFuture> contextInformationLanguageServersFuture; private final Object contextTriggerCharsSemaphore = new Object(); - private char[] contextTriggerChars = new char[0]; + private char[] contextTriggerChars = ArrayUtil.ZERO_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 ZERO_COMPLETION_PROPOSALS; } URI uri = LSPEclipseUtils.toUri(document); if (uri == null) { - return new LSCompletionProposal[0]; + return ZERO_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 ZERO_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 ZERO_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 = ArrayUtil.ZERO_CHARS; + this.contextTriggerChars = ArrayUtil.ZERO_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 = ArrayUtil.ZERO_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..fb2e00053 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[] ZERO_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]); + ZERO_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..e602783c2 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[] ZERO_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 ZERO_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..593d86fc2 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.ZERO_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..a2b807fd3 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[] ZERO_QUICK_ACCESS_ELEMENTS = new QuickAccessElement[0]; + private @Nullable List usedLanguageServerWrappers; @Override public QuickAccessElement[] computeElements() { - return new QuickAccessElement[0]; + return ZERO_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 ZERO_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..379688e39 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 @@ -23,6 +23,7 @@ import org.eclipse.lsp4e.LanguageServerWrapper; import org.eclipse.lsp4e.LanguageServers; import org.eclipse.lsp4e.LanguageServersRegistry.LanguageServerDefinition; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.TypeHierarchyItem; import org.eclipse.lsp4j.TypeHierarchyPrepareParams; @@ -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 ArrayUtil.ZERO_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(ArrayUtil.ZERO_OBJECTS); }).get(500, TimeUnit.MILLISECONDS); } catch (Exception e) { LanguageServerPlugin.logError(e); } } - return new Object[0]; + return ArrayUtil.ZERO_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 ? ArrayUtil.ZERO_OBJECTS : list.toArray()) .get(500, TimeUnit.MILLISECONDS); } catch (Exception e) { LanguageServerPlugin.logError(e); } } - return new Object[0]; + return ArrayUtil.ZERO_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..97739d55b 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 @@ -27,6 +27,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 +67,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 ? ArrayUtil.ZERO_OBJECTS : list.toArray()) .get(500, TimeUnit.MILLISECONDS); } catch (Exception e) { LanguageServerPlugin.logError(e); } } - return new Object[0]; + return ArrayUtil.ZERO_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..179e6e9ea 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 @@ -16,18 +16,18 @@ import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.viewers.IStructuredContentProvider; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.lsp4e.outline.SymbolsModel.DocumentSymbolWithURI; 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 ArrayUtil.ZERO_OBJECTS; } private Object[] toContainer(@Nullable List symbols, URI uri) { @@ -38,7 +38,7 @@ private Object[] toContainer(@Nullable List symbols, URI uri) { } return container; } - return NO_CHILDREN; + return ArrayUtil.ZERO_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..d4d024aa1 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsModel.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/outline/SymbolsModel.java @@ -27,6 +27,7 @@ import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.viewers.TreePath; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.lsp4j.DocumentSymbol; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.Position; @@ -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 ArrayUtil.ZERO_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..ff73c12af 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ui/NewContentTypeLSPLaunchDialog.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/ui/NewContentTypeLSPLaunchDialog.java @@ -42,6 +42,7 @@ import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.lsp4e.LanguageServerPlugin; +import org.eclipse.lsp4e.internal.ArrayUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -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 ArrayUtil.ZERO_OBJECTS; final var elements = new ArrayList(); final var baseType = (IContentType) parentElement; IContentType[] contentTypes = manager.getAllContentTypes();