From b83a5926837df337c007dab50906329b4bb76093 Mon Sep 17 00:00:00 2001 From: Gesa HENTSCHKE Date: Fri, 2 Jun 2023 15:59:34 +0200 Subject: [PATCH] [#105] Move and rename DefaultCLanguageServerProvider fixes #105 --- .../META-INF/MANIFEST.MF | 3 +- bundles/org.eclipse.cdt.lsp.clangd/plugin.xml | 2 +- .../BaseClangdLanguageServerProvider.java} | 35 ++++++++++++------- .../clangd/ClangdFallbackManager.java | 4 +-- ...java => ClangdLanguageServerProvider.java} | 5 +-- .../preferences/LspEditorPreferencePage.java | 21 +++++++---- .../server/MockCLanguageServerProvider.java | 32 +++++++++++++++-- .../editor/CEditorAssociationOverride.java | 2 ++ .../server/CLanguageServerRegistry.java | 4 +-- ...anguageServerStreamConnectionProvider.java | 5 +-- 10 files changed, 80 insertions(+), 33 deletions(-) rename bundles/{org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/server/DefaultCLanguageServerProvider.java => org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/clangd/BaseClangdLanguageServerProvider.java} (69%) rename bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/{internal => }/clangd/ClangdFallbackManager.java (97%) rename bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/{CdtCLanguageServerProvider.java => ClangdLanguageServerProvider.java} (92%) diff --git a/bundles/org.eclipse.cdt.lsp.clangd/META-INF/MANIFEST.MF b/bundles/org.eclipse.cdt.lsp.clangd/META-INF/MANIFEST.MF index 9aac5683..31ca56de 100644 --- a/bundles/org.eclipse.cdt.lsp.clangd/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.cdt.lsp.clangd/META-INF/MANIFEST.MF @@ -4,7 +4,8 @@ Bundle-ActivationPolicy: lazy Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.cdt.lsp.clangd;singleton:=true Bundle-Version: 1.0.0.qualifier -Export-Package: org.eclipse.cdt.lsp.internal.clangd;x-internal:=true, +Export-Package: org.eclipse.cdt.lsp.clangd;x-internal:=true, + org.eclipse.cdt.lsp.internal.clangd;x-internal:=true, org.eclipse.cdt.lsp.internal.clangd.editor;x-internal:=true, org.eclipse.cdt.lsp.internal.clangd.editor.expressions;x-internal:=true, org.eclipse.cdt.lsp.internal.clangd.editor.handlers;x-internal:=true, diff --git a/bundles/org.eclipse.cdt.lsp.clangd/plugin.xml b/bundles/org.eclipse.cdt.lsp.clangd/plugin.xml index 98395e8f..89d4e2b4 100644 --- a/bundles/org.eclipse.cdt.lsp.clangd/plugin.xml +++ b/bundles/org.eclipse.cdt.lsp.clangd/plugin.xml @@ -63,7 +63,7 @@ commands; protected EnableExpression enableExpression; - public DefaultCLanguageServerProvider() { + public BaseClangdLanguageServerProvider() { commands = createCommands(); } @@ -46,17 +52,19 @@ public void setCommands(List commands) { protected List createCommands() { List commands = new ArrayList<>(); - IPath clangdLocation = PathUtil.findProgramLocation("clangd", null); //in case pathStr is null environment variable ${PATH} is inspected + IPath clangdLocation = PathUtil.findProgramLocation("clangd", null); // in case pathStr is null environment //$NON-NLS-1$ + // variable ${PATH} is inspected if (clangdLocation != null) { commands.add(clangdLocation.toOSString()); commands.add(CLANG_TIDY); commands.add(BACKGROUND_INDEX); commands.add(COMPLETION_STYLE); commands.add(PRETTY); - // clangd will execute drivers and fetch necessary include paths to compile your code: - IPath compilerLocation = PathUtil.findProgramLocation("gcc", null); + // clangd will execute drivers and fetch necessary include paths to compile your + // code: + IPath compilerLocation = PathUtil.findProgramLocation("gcc", null); //$NON-NLS-1$ if (compilerLocation != null) { - commands.add(QUERY_DRIVER + compilerLocation.removeLastSegments(1).append(IPath.SEPARATOR + "*")); + commands.add(QUERY_DRIVER + compilerLocation.removeLastSegments(1).append(IPath.SEPARATOR + "*")); //$NON-NLS-1$ } } return commands; @@ -77,7 +85,8 @@ public boolean isEnabledFor(IProject project) { if (enableExpression != null) { return enableExpression.evaluate(project); } - //language server is always enabled when no enable expression has been defined in the extension point: + // language server is always enabled when no enable expression has been defined + // in the extension point: return true; } } diff --git a/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/ClangdFallbackManager.java b/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/clangd/ClangdFallbackManager.java similarity index 97% rename from bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/ClangdFallbackManager.java rename to bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/clangd/ClangdFallbackManager.java index 4e1ab3c5..15070ece 100644 --- a/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/ClangdFallbackManager.java +++ b/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/clangd/ClangdFallbackManager.java @@ -10,7 +10,7 @@ * Gesa Hentschke (Bachmann electronic GmbH) - initial implementation *******************************************************************************/ -package org.eclipse.cdt.lsp.internal.clangd; +package org.eclipse.cdt.lsp.clangd; import java.util.Optional; @@ -23,7 +23,7 @@ import org.eclipse.osgi.service.environment.Constants; /** - * Used to set the clangd fallbackFlags. + * Used to create and set the clangd fallbackFlags. * This is needed for Windows OS to allow clangd to determine the system includes in case no compile_commands.json can be found. * see also: https://clangd.llvm.org/extensions#compilation-commands * diff --git a/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/CdtCLanguageServerProvider.java b/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/ClangdLanguageServerProvider.java similarity index 92% rename from bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/CdtCLanguageServerProvider.java rename to bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/ClangdLanguageServerProvider.java index fea17bb0..33e1caa7 100644 --- a/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/CdtCLanguageServerProvider.java +++ b/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/ClangdLanguageServerProvider.java @@ -18,13 +18,14 @@ import java.util.Arrays; import java.util.List; +import org.eclipse.cdt.lsp.clangd.BaseClangdLanguageServerProvider; +import org.eclipse.cdt.lsp.clangd.ClangdFallbackManager; import org.eclipse.cdt.lsp.internal.clangd.editor.LspEditorUiPlugin; import org.eclipse.cdt.lsp.internal.clangd.editor.preferences.LspEditorPreferences; -import org.eclipse.cdt.lsp.server.DefaultCLanguageServerProvider; import org.eclipse.cdt.utils.CommandLineUtil; import org.eclipse.jface.preference.IPreferenceStore; -public class CdtCLanguageServerProvider extends DefaultCLanguageServerProvider { +public class ClangdLanguageServerProvider extends BaseClangdLanguageServerProvider { //FIXME: AF: rework to core preferences private static final IPreferenceStore preferenceStore = LspEditorUiPlugin.getDefault().getLsPreferences(); private final ClangdFallbackManager clangdFallbackManager = new ClangdFallbackManager(); diff --git a/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/editor/preferences/LspEditorPreferencePage.java b/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/editor/preferences/LspEditorPreferencePage.java index b294c72f..5b3d13b8 100644 --- a/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/editor/preferences/LspEditorPreferencePage.java +++ b/bundles/org.eclipse.cdt.lsp.clangd/src/org/eclipse/cdt/lsp/internal/clangd/editor/preferences/LspEditorPreferencePage.java @@ -13,16 +13,16 @@ package org.eclipse.cdt.lsp.internal.clangd.editor.preferences; -import org.eclipse.cdt.ui.newui.MultiLineTextFieldEditor; -import org.eclipse.cdt.utils.CommandLineUtil; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Optional; import org.eclipse.cdt.lsp.LspPlugin; import org.eclipse.cdt.lsp.internal.clangd.editor.LspEditorUiMessages; import org.eclipse.cdt.lsp.internal.clangd.editor.LspEditorUiPlugin; +import org.eclipse.cdt.ui.newui.MultiLineTextFieldEditor; +import org.eclipse.cdt.utils.CommandLineUtil; import org.eclipse.core.runtime.preferences.PreferenceMetadata; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; @@ -70,28 +70,35 @@ private void writeServerPathToProvider(String path) { if (path == null || path.isBlank()) { return; } - List commands = LspPlugin.getDefault().getCLanguageServerProvider().getCommands(); + List commands = Optional.ofNullable(LspPlugin.getDefault()) + .map(plugin -> plugin.getCLanguageServerProvider()).map(provider -> provider.getCommands()) + .orElse(null); if (commands != null && !commands.isEmpty()) { commands.set(0, path); } else if (commands == null) { commands = new ArrayList<>(); commands.add(path); } - LspPlugin.getDefault().getCLanguageServerProvider().setCommands(commands); + final List finalCommands = commands; + Optional.ofNullable(LspPlugin.getDefault()).map(plugin -> plugin.getCLanguageServerProvider()) + .ifPresent(provider -> provider.setCommands(finalCommands)); } private void writeServerOptionsToProvider(String options) { if (options == null) { return; } - List commands = LspPlugin.getDefault().getCLanguageServerProvider().getCommands(); + List commands = Optional.ofNullable(LspPlugin.getDefault()) + .map(plugin -> plugin.getCLanguageServerProvider()).map(provider -> provider.getCommands()) + .orElse(null); if (commands != null && !commands.isEmpty()) { String serverPath = commands.get(0); // save server path commands.clear(); // clear all old options commands.add(serverPath); commands.addAll(Arrays.asList(CommandLineUtil.argumentsToArray(options))); + Optional.ofNullable(LspPlugin.getDefault()).map(plugin -> plugin.getCLanguageServerProvider()) + .ifPresent(provider -> provider.setCommands(commands)); } - LspPlugin.getDefault().getCLanguageServerProvider().setCommands(commands); } } diff --git a/bundles/org.eclipse.cdt.lsp.test/src/org/eclipse/cdt/lsp/test/server/MockCLanguageServerProvider.java b/bundles/org.eclipse.cdt.lsp.test/src/org/eclipse/cdt/lsp/test/server/MockCLanguageServerProvider.java index f5385bb7..940fdb46 100644 --- a/bundles/org.eclipse.cdt.lsp.test/src/org/eclipse/cdt/lsp/test/server/MockCLanguageServerProvider.java +++ b/bundles/org.eclipse.cdt.lsp.test/src/org/eclipse/cdt/lsp/test/server/MockCLanguageServerProvider.java @@ -12,8 +12,36 @@ package org.eclipse.cdt.lsp.test.server; -import org.eclipse.cdt.lsp.server.DefaultCLanguageServerProvider; +import java.util.List; -public class MockCLanguageServerProvider extends DefaultCLanguageServerProvider { +import org.eclipse.cdt.lsp.server.EnableExpression; +import org.eclipse.cdt.lsp.server.ICLanguageServerProvider; +import org.eclipse.core.resources.IProject; + +public class MockCLanguageServerProvider implements ICLanguageServerProvider { + + @Override + public List getCommands() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void setCommands(List commands) { + // TODO Auto-generated method stub + + } + + @Override + public void setEnableExpression(EnableExpression enableExpression) { + // TODO Auto-generated method stub + + } + + @Override + public boolean isEnabledFor(IProject project) { + // TODO Auto-generated method stub + return false; + } } diff --git a/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/editor/CEditorAssociationOverride.java b/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/editor/CEditorAssociationOverride.java index 0e2feb30..63b21a09 100644 --- a/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/editor/CEditorAssociationOverride.java +++ b/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/editor/CEditorAssociationOverride.java @@ -76,6 +76,8 @@ public IEditorDescriptor overrideDefaultEditor(String fileName, IContentType con } private boolean isEnabledFor(IEditorInput editorInput) { + if (cLanguageServerProvider == null) + return false; IResource resource = editorInput.getAdapter(IResource.class); if (resource != null) { return cLanguageServerProvider.isEnabledFor(resource.getProject()); diff --git a/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/internal/server/CLanguageServerRegistry.java b/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/internal/server/CLanguageServerRegistry.java index 79d1c995..99f941d3 100644 --- a/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/internal/server/CLanguageServerRegistry.java +++ b/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/internal/server/CLanguageServerRegistry.java @@ -17,7 +17,6 @@ import java.util.Optional; import org.eclipse.cdt.lsp.LspPlugin; -import org.eclipse.cdt.lsp.server.DefaultCLanguageServerProvider; import org.eclipse.cdt.lsp.server.EnableExpression; import org.eclipse.cdt.lsp.server.ICLanguageServerProvider; import org.eclipse.core.expressions.ExpressionConverter; @@ -51,7 +50,7 @@ public CLanguageServerRegistry() { public ICLanguageServerProvider createCLanguageServerProvider() { prioritizedProvider = null; highestPrio = Priority.low; - HashMap providers = new HashMap(); + HashMap providers = new HashMap<>(); for (IConfigurationElement configurationElement : cExtensionPoint.getConfigurationElements()) { if (SERVER_ELEMENT.equals(configurationElement.getName())) { ICLanguageServerProvider provider = (ICLanguageServerProvider) getInstanceFromExtension( @@ -84,7 +83,6 @@ public ICLanguageServerProvider createCLanguageServerProvider() { } if (providers.isEmpty()) { Platform.getLog(getClass()).warn("No C/C++ language server defined"); - prioritizedProvider = new DefaultCLanguageServerProvider(); } else { // get provider with highest priority: providers.forEach((key, value) -> { diff --git a/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/internal/server/CLanguageServerStreamConnectionProvider.java b/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/internal/server/CLanguageServerStreamConnectionProvider.java index 52504910..25376424 100644 --- a/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/internal/server/CLanguageServerStreamConnectionProvider.java +++ b/bundles/org.eclipse.cdt.lsp/src/org/eclipse/cdt/lsp/internal/server/CLanguageServerStreamConnectionProvider.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.lsp.internal.server; import java.net.URI; +import java.util.Optional; import org.eclipse.cdt.lsp.LspPlugin; import org.eclipse.cdt.lsp.server.ICLanguageServerProvider; @@ -23,7 +24,7 @@ public class CLanguageServerStreamConnectionProvider extends ProcessStreamConnec public CLanguageServerStreamConnectionProvider() { this.cLanguageServerProvider = LspPlugin.getDefault().getCLanguageServerProvider(); - setCommands(cLanguageServerProvider.getCommands()); + Optional.ofNullable(cLanguageServerProvider).ifPresent(p -> setCommands(p.getCommands())); // set the working directory for the Java process which runs the C/C++ language server: setWorkingDirectory(System.getProperty("user.dir")); //$NON-NLS-1$ @@ -31,7 +32,7 @@ public CLanguageServerStreamConnectionProvider() { @Override public Object getInitializationOptions(URI rootUri) { - return this.cLanguageServerProvider.getInitializationOptions(rootUri); + return Optional.ofNullable(cLanguageServerProvider).map(p -> p.getInitializationOptions(rootUri)).orElse(null); } }