diff --git a/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/text/tests/ResolveDocumentUriTest.java b/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/internal/core/workspace/tests/ResolveDocumentUriTest.java similarity index 92% rename from lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/text/tests/ResolveDocumentUriTest.java rename to lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/internal/core/workspace/tests/ResolveDocumentUriTest.java index b86f2ff590b..57748574576 100644 --- a/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/text/tests/ResolveDocumentUriTest.java +++ b/lsp/org.eclipse.cdt.lsp.core.tests/src/org/eclipse/cdt/lsp/internal/core/workspace/tests/ResolveDocumentUriTest.java @@ -11,11 +11,11 @@ * Contributors: * Alexander Fedorov (ArSysOp) - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.lsp.text.tests; +package org.eclipse.cdt.lsp.internal.core.workspace.tests; import static org.junit.Assert.assertFalse; -import org.eclipse.cdt.lsp.internal.text.ResolveDocumentUri; +import org.eclipse.cdt.lsp.internal.core.workspace.ResolveDocumentUri; import org.eclipse.core.filebuffers.FileBuffers; import org.eclipse.core.filebuffers.LocationKind; import org.eclipse.core.runtime.Path; diff --git a/lsp/org.eclipse.cdt.lsp.core/META-INF/MANIFEST.MF b/lsp/org.eclipse.cdt.lsp.core/META-INF/MANIFEST.MF index 0276ea5901d..6bb75e77bfe 100644 --- a/lsp/org.eclipse.cdt.lsp.core/META-INF/MANIFEST.MF +++ b/lsp/org.eclipse.cdt.lsp.core/META-INF/MANIFEST.MF @@ -8,6 +8,7 @@ Bundle-Vendor: %Bundle-Vendor Bundle-RequiredExecutionEnvironment: JavaSE-11 Require-Bundle: com.google.gson;bundle-version="2.8.2", org.eclipse.cdt.core, + org.eclipse.core.filebuffers;bundle-version="3.6.1000", org.eclipse.core.resources, org.eclipse.core.runtime, org.eclipse.lsp4e, @@ -18,8 +19,10 @@ Require-Bundle: com.google.gson;bundle-version="2.8.2", org.eclipse.ui Export-Package: org.eclipse.cdt.lsp;x-friends:="org.eclipse.cdt.lsp.ui,org.eclipse.cdt.lsp.clangd", org.eclipse.cdt.lsp.core;x-friends:="org.eclipse.cdt.lsp.ui", + org.eclipse.cdt.lsp.core.preferences;x-friends:="org.eclipse.cdt.lsp.ui", org.eclipse.cdt.lsp.internal.core;x-internal:=true, - org.eclipse.cdt.lsp.internal.text;x-friends:="org.eclipse.cdt.lsp.ui" + org.eclipse.cdt.lsp.internal.core.preferences;x-friends:="org.eclipse.cdt.lsp.ui", + org.eclipse.cdt.lsp.internal.core.workspace;x-friends:="org.eclipse.cdt.lsp.ui" Bundle-Activator: org.eclipse.cdt.lsp.core.Activator Bundle-ActivationPolicy: lazy Service-Component: OSGI-INF/org.eclipse.cdt.lsp.internal.core.ContributedLanguageServers.xml, diff --git a/lsp/org.eclipse.cdt.lsp.core/plugin.xml b/lsp/org.eclipse.cdt.lsp.core/plugin.xml index 914b0463a89..f054978f80c 100644 --- a/lsp/org.eclipse.cdt.lsp.core/plugin.xml +++ b/lsp/org.eclipse.cdt.lsp.core/plugin.xml @@ -36,6 +36,12 @@ + + + + + + + + + + + + + + + + diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/core/preferences/LanguageServerPreferenceMetadata.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/core/preferences/LanguageServerPreferenceMetadata.java new file mode 100644 index 00000000000..749a19f8fbf --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/core/preferences/LanguageServerPreferenceMetadata.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.core.preferences; + +import org.eclipse.core.runtime.preferences.PreferenceMetadata; + +/** + * The metadata for preferences to configure language server + * + */ +public interface LanguageServerPreferenceMetadata { + + /** + * Returns the metadata for the "Prefer Language Server" preference, must not return null. + * + * @return the metadata for the "Prefer Language Server" preference + * + * @see LanguageServerPreferences#preferLanguageServer() + */ + PreferenceMetadata preferLanguageServer(); + +} diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.java index b595e924d3f..c7d5b301724 100644 --- a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.java +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Eclipse Foundation and others. + * Copyright (c) 2019, 2020 Eclipse Contributors 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 @@ -8,7 +8,7 @@ * SPDX-License-Identifier: EPL-2.0 * * Contributors: - * Alexander Fedorov - initial API and implementatin + * Alexander Fedorov - ongoing support *******************************************************************************/ package org.eclipse.cdt.lsp.internal.core; @@ -23,6 +23,8 @@ public class LspCoreMessages extends NLS { NLS.initializeMessages(BUNDLE_NAME, LspCoreMessages.class); } + public static String LanguageServerDefaults_prefer_description; + public static String LanguageServerDefaults_prefer_name; public static String ShowStatus_busy; public static String ShowStatus_idle; diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.properties b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.properties index 867dfae298e..01dcdb189df 100644 --- a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.properties +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/LspCoreMessages.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2019 Eclipse Foundation and others +# Copyright (c) 2019, 2020 Eclipse Contributors 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 @@ -8,9 +8,10 @@ # SPDX-License-Identifier: EPL-2.0 # # Contributors: -# Eclipse Foundation - initial API and implementation -# Alexander Fedorov - Bug 558484 +# Alexander Fedorov - ongoing support ############################################################################### +LanguageServerDefaults_prefer_description=Prefer to use language server instead of "classic" facilities +LanguageServerDefaults_prefer_name=Prefer Language Server ShowStatus_busy={0} : Busy | {1} Jobs ShowStatus_idle={0} : Idle diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/preferences/LanguageServerDefaults.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/preferences/LanguageServerDefaults.java new file mode 100644 index 00000000000..fe5d93b1bde --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/preferences/LanguageServerDefaults.java @@ -0,0 +1,29 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.core.preferences; + +import org.eclipse.cdt.lsp.core.preferences.LanguageServerPreferenceMetadata; +import org.eclipse.cdt.lsp.internal.core.LspCoreMessages; +import org.eclipse.core.runtime.preferences.PreferenceMetadata; + +public class LanguageServerDefaults implements LanguageServerPreferenceMetadata { + + @Override + public PreferenceMetadata preferLanguageServer() { + return new PreferenceMetadata<>(Boolean.class, "prefer_language_server", false, //$NON-NLS-1$ + LspCoreMessages.LanguageServerDefaults_prefer_name, + LspCoreMessages.LanguageServerDefaults_prefer_description); + } + +} diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/PreferLanguageServer.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/PreferLanguageServer.java new file mode 100644 index 00000000000..a105ee93f11 --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/PreferLanguageServer.java @@ -0,0 +1,62 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.core.workspace; + +import java.util.Optional; +import java.util.function.Predicate; + +import org.eclipse.cdt.lsp.core.Activator; +import org.eclipse.cdt.lsp.core.preferences.LanguageServerPreferenceMetadata; +import org.eclipse.cdt.lsp.internal.core.preferences.LanguageServerDefaults; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ProjectScope; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.preferences.IScopeContext; +import org.eclipse.core.runtime.preferences.PreferenceMetadata; +import org.eclipse.jface.text.IDocument; + +public final class PreferLanguageServer implements Predicate { + + private final ResolveDocumentFile file; + private final LanguageServerPreferenceMetadata metadata; + + public PreferLanguageServer() { + file = new ResolveDocumentFile(); + metadata = new LanguageServerDefaults(); + } + + @Override + public boolean test(IDocument document) { + Optional project = file.apply(document).map(IFile::getProject); + if (project.isPresent()) { + return forProject(project.get()); + } + return forExternal(document); + } + + private boolean forExternal(IDocument document) { + //let's use workspace-level setting + PreferenceMetadata option = metadata.preferLanguageServer(); + return Platform.getPreferencesService().getBoolean(Activator.PLUGIN_ID, option.identifer(), + option.defaultValue(), null); + } + + private boolean forProject(IProject project) { + PreferenceMetadata option = metadata.preferLanguageServer(); + return Platform.getPreferencesService().getBoolean(Activator.PLUGIN_ID, option.identifer(), + option.defaultValue(), new IScopeContext[] { new ProjectScope(project) }); + } + +} diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentBuffer.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentBuffer.java new file mode 100644 index 00000000000..e8c329b08dd --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentBuffer.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.core.workspace; + +import java.util.Optional; +import java.util.function.Function; + +import org.eclipse.core.filebuffers.FileBuffers; +import org.eclipse.core.filebuffers.ITextFileBuffer; +import org.eclipse.jface.text.IDocument; + +public final class ResolveDocumentBuffer implements Function> { + + @Override + public Optional apply(IDocument document) { + return Optional.ofNullable(document).map(FileBuffers.getTextFileBufferManager()::getTextFileBuffer); + } + +} diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentFile.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentFile.java new file mode 100644 index 00000000000..353e7fd2646 --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentFile.java @@ -0,0 +1,40 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.core.workspace; + +import java.util.Optional; +import java.util.function.Function; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.jface.text.IDocument; + +public final class ResolveDocumentFile implements Function> { + + private final ResolveDocumentPath path; + + public ResolveDocumentFile() { + path = new ResolveDocumentPath(); + } + + @Override + public Optional apply(IDocument document) { + return Optional.ofNullable(document)// + .flatMap(path)// + .map(ResourcesPlugin.getWorkspace().getRoot()::findMember)// + .filter(IFile.class::isInstance)// + .map(IFile.class::cast); + } + +} diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentPath.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentPath.java new file mode 100644 index 00000000000..c9dcd9b03fb --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentPath.java @@ -0,0 +1,36 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.core.workspace; + +import java.util.Optional; +import java.util.function.Function; + +import org.eclipse.core.filebuffers.ITextFileBuffer; +import org.eclipse.core.runtime.IPath; +import org.eclipse.jface.text.IDocument; + +public final class ResolveDocumentPath implements Function> { + + private final ResolveDocumentBuffer buffer; + + public ResolveDocumentPath() { + buffer = new ResolveDocumentBuffer(); + } + + @Override + public Optional apply(IDocument document) { + return Optional.ofNullable(document).flatMap(buffer).map(ITextFileBuffer::getLocation); + } + +} diff --git a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/text/ResolveDocumentUri.java b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentUri.java similarity index 81% rename from lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/text/ResolveDocumentUri.java rename to lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentUri.java index 82cc60f18c2..48b841e2051 100644 --- a/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/text/ResolveDocumentUri.java +++ b/lsp/org.eclipse.cdt.lsp.core/src/org/eclipse/cdt/lsp/internal/core/workspace/ResolveDocumentUri.java @@ -11,7 +11,7 @@ * Contributors: * Alexander Fedorov (ArSysOp) - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.lsp.internal.text; +package org.eclipse.cdt.lsp.internal.core.workspace; import java.net.URI; import java.util.Optional; @@ -23,11 +23,17 @@ import org.eclipse.lsp4e.LSPEclipseUtils; @SuppressWarnings("restriction") public final class ResolveDocumentUri implements Function> { + private final ResolveDocumentFile file; + + public ResolveDocumentUri() { + file = new ResolveDocumentFile(); + } + @Override public Optional apply(IDocument document) { return Optional.ofNullable(document)// - //FIXME rewrite involved static utilities and contribute the result back to LSP4E - .flatMap(d -> Optional.ofNullable(LSPEclipseUtils.getFile(d))) + .flatMap(file)// + //FIXME rewrite involved static utilities .flatMap(f -> Optional.ofNullable(LSPEclipseUtils.toUri(f))); } diff --git a/lsp/org.eclipse.cdt.lsp.cquery/src/org/eclipse/cdt/lsp/internal/cquery/ui/PublishSemanticHighlighting.java b/lsp/org.eclipse.cdt.lsp.cquery/src/org/eclipse/cdt/lsp/internal/cquery/ui/PublishSemanticHighlighting.java index 061552c2582..579f3b58353 100644 --- a/lsp/org.eclipse.cdt.lsp.cquery/src/org/eclipse/cdt/lsp/internal/cquery/ui/PublishSemanticHighlighting.java +++ b/lsp/org.eclipse.cdt.lsp.cquery/src/org/eclipse/cdt/lsp/internal/cquery/ui/PublishSemanticHighlighting.java @@ -17,9 +17,9 @@ import java.util.function.Consumer; import org.eclipse.cdt.internal.ui.editor.SemanticHighlightingManager.HighlightedPosition; import org.eclipse.cdt.internal.ui.editor.SemanticHighlightingManager.HighlightingStyle; +import org.eclipse.cdt.lsp.internal.core.workspace.ResolveDocumentUri; import org.eclipse.cdt.lsp.internal.cquery.CquerySemanticHighlights; import org.eclipse.cdt.lsp.internal.cquery.HighlightSymbol; -import org.eclipse.cdt.lsp.internal.text.ResolveDocumentUri; import org.eclipse.cdt.lsp.internal.ui.text.PresentationReconcilerCPP; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.PreferenceConstants; diff --git a/lsp/org.eclipse.cdt.lsp.ui/META-INF/MANIFEST.MF b/lsp/org.eclipse.cdt.lsp.ui/META-INF/MANIFEST.MF index 36a761b6312..cee346fc12f 100644 --- a/lsp/org.eclipse.cdt.lsp.ui/META-INF/MANIFEST.MF +++ b/lsp/org.eclipse.cdt.lsp.ui/META-INF/MANIFEST.MF @@ -7,6 +7,7 @@ Bundle-Name: %Bundle-Name Bundle-Vendor: %Bundle-Vendor Bundle-RequiredExecutionEnvironment: JavaSE-11 Require-Bundle: org.eclipse.osgi;bundle-version="[3.15.0,4.0.0)", + org.eclipse.core.expressions;bundle-version="3.7.0", org.eclipse.core.resources;bundle-version="3.13.800", org.eclipse.core.runtime;bundle-version="3.19.0", org.eclipse.equinox.preferences;bundle-version="[3.7.0,4.0.0)", diff --git a/lsp/org.eclipse.cdt.lsp.ui/OSGI-INF/l10n/bundle.properties b/lsp/org.eclipse.cdt.lsp.ui/OSGI-INF/l10n/bundle.properties index 016aca22a54..991500c8ba3 100644 --- a/lsp/org.eclipse.cdt.lsp.ui/OSGI-INF/l10n/bundle.properties +++ b/lsp/org.eclipse.cdt.lsp.ui/OSGI-INF/l10n/bundle.properties @@ -18,3 +18,5 @@ Bundle-Vendor = Eclipse CDT preferencePages.languageServer.name=C/C++ Language Server cDocumentSetupParticipant =C Document Setup Participant + +properties.ls.name = C/C++ Language Server \ No newline at end of file diff --git a/lsp/org.eclipse.cdt.lsp.ui/plugin.xml b/lsp/org.eclipse.cdt.lsp.ui/plugin.xml index bb63a4dfb79..292b03d55b4 100644 --- a/lsp/org.eclipse.cdt.lsp.ui/plugin.xml +++ b/lsp/org.eclipse.cdt.lsp.ui/plugin.xml @@ -22,6 +22,26 @@ name="%preferencePages.languageServer.name"> + + + + + + + + + + + + + + + + diff --git a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/LspUiMessages.java b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/LspUiMessages.java index ba20d2fe840..eba5055287e 100644 --- a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/LspUiMessages.java +++ b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/LspUiMessages.java @@ -28,6 +28,7 @@ public class LspUiMessages extends NLS { public static String CPPLanguageServerPreferencePage_server_options; public static String CPPLanguageServerPreferencePage_server_path; public static String CPPLanguageServerPreferencePage_server_selector; + public static String LanguageServerPropertyPage_w_ls_experimental; private LspUiMessages() { } diff --git a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/LspUiMessages.properties b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/LspUiMessages.properties index d6ca6401afe..162628664dc 100644 --- a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/LspUiMessages.properties +++ b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/LspUiMessages.properties @@ -17,3 +17,4 @@ CPPLanguageServerPreferencePage_description=Preferences for the C/C++ Language S CPPLanguageServerPreferencePage_server_options=Command-line options for the server CPPLanguageServerPreferencePage_server_path=Path to the server executable CPPLanguageServerPreferencePage_server_selector=Please select the C/C++ Language Server you want to use in Eclipse : +LanguageServerPropertyPage_w_ls_experimental=The C/C++ Language Server support is experimental diff --git a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/expressions/DocumentsTester.java b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/expressions/DocumentsTester.java new file mode 100644 index 00000000000..8c756019cfa --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/expressions/DocumentsTester.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov (ArSysOp) - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.ui.expressions; + +import org.eclipse.cdt.lsp.internal.core.workspace.PreferLanguageServer; +import org.eclipse.core.expressions.PropertyTester; +import org.eclipse.jface.text.IDocument; +import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor; + +public final class DocumentsTester extends PropertyTester { + + private final String key = "prefer"; //$NON-NLS-1$ + private final PreferLanguageServer predicate; + + public DocumentsTester() { + this.predicate = new PreferLanguageServer(); + } + + @Override + public boolean test(Object receiver, String property, Object[] args, Object expectedValue) { + if (key.equals(property)) { + if (receiver instanceof AbstractDecoratedTextEditor) { + AbstractDecoratedTextEditor editor = (AbstractDecoratedTextEditor) receiver; + IDocument document = editor.getDocumentProvider().getDocument(editor.getEditorInput()); + return predicate.test(document); + } + } + return false; + } + +} diff --git a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/preferences/CPPLanguageServerPreferencePage.java b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/preferences/CPPLanguageServerPreferencePage.java index c89d6282813..9dfe3523960 100644 --- a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/preferences/CPPLanguageServerPreferencePage.java +++ b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/preferences/CPPLanguageServerPreferencePage.java @@ -25,10 +25,13 @@ import org.eclipse.cdt.lsp.LanguageServerConfiguration; import org.eclipse.cdt.lsp.SupportedLanguageServers; import org.eclipse.cdt.lsp.core.CPPStreamConnectionProvider; import org.eclipse.cdt.lsp.core.PreferenceConstants; +import org.eclipse.cdt.lsp.internal.core.preferences.LanguageServerDefaults; import org.eclipse.cdt.lsp.internal.ui.LspUiActivator; import org.eclipse.cdt.lsp.internal.ui.LspUiMessages; import org.eclipse.cdt.ui.newui.MultiLineTextFieldEditor; import org.eclipse.core.runtime.ServiceCaller; +import org.eclipse.core.runtime.preferences.PreferenceMetadata; +import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.FileFieldEditor; @@ -55,6 +58,8 @@ public class CPPLanguageServerPreferencePage extends FieldEditorPreferencePage i @Override public void createFieldEditors() { + PreferenceMetadata prefer = new LanguageServerDefaults().preferLanguageServer(); + addField(new BooleanFieldEditor(prefer.identifer(), prefer.name(), getFieldEditorParent())); serverChoice = new RadioGroupFieldEditor(PreferenceConstants.P_SERVER_CHOICE, LspUiMessages.CPPLanguageServerPreferencePage_server_selector, 1, contributedServers(), getFieldEditorParent()); diff --git a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/properties/LanguageServerPropertyPage.java b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/properties/LanguageServerPropertyPage.java new file mode 100644 index 00000000000..983ea18e60c --- /dev/null +++ b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/properties/LanguageServerPropertyPage.java @@ -0,0 +1,139 @@ +/******************************************************************************* + * Copyright (c) 2020 ArSysOp and others. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Alexander Fedorov - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.lsp.internal.ui.properties; + +import java.util.Optional; + +import org.eclipse.cdt.lsp.core.Activator; +import org.eclipse.cdt.lsp.core.preferences.LanguageServerPreferenceMetadata; +import org.eclipse.cdt.lsp.internal.core.preferences.LanguageServerDefaults; +import org.eclipse.cdt.lsp.internal.ui.LspUiMessages; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.ProjectScope; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.IScopeContext; +import org.eclipse.core.runtime.preferences.PreferenceMetadata; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.preference.PreferencePage; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.ui.dialogs.PropertyPage; +import org.osgi.framework.FrameworkUtil; +import org.osgi.service.prefs.BackingStoreException; + +public final class LanguageServerPropertyPage extends PropertyPage { + + private LanguageServerPreferenceMetadata metadata; + private Button prefer; + + public LanguageServerPropertyPage() { + this.metadata = new LanguageServerDefaults(); + } + + private void addHeaderSection(Composite parent) { + Composite composite = createDefaultComposite(parent); + Label warning = new Label(composite, SWT.NONE); + warning.setText(LspUiMessages.LanguageServerPropertyPage_w_ls_experimental); + } + + private void addSeparator(Composite parent) { + Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL); + GridData gridData = new GridData(); + gridData.horizontalAlignment = GridData.FILL; + gridData.grabExcessHorizontalSpace = true; + separator.setLayoutData(gridData); + } + + private void addSettingsSection(Composite parent) { + PreferenceMetadata option = metadata.preferLanguageServer(); + Composite composite = createDefaultComposite(parent); + prefer = new Button(composite, SWT.CHECK); + prefer.setLayoutData(new GridData()); + prefer.setText(option.name()); + prefer.setToolTipText(option.description()); + } + + private void load() { + Optional project = project(); + PreferenceMetadata option = metadata.preferLanguageServer(); + if (project.isPresent()) { + prefer.setSelection(Platform.getPreferencesService().getBoolean(Activator.PLUGIN_ID, option.identifer(), + option.defaultValue(), new IScopeContext[] { new ProjectScope(project.get()) })); + } else { + prefer.setSelection(option.defaultValue()); + } + } + + /** + * @see PreferencePage#createContents(Composite) + */ + @Override + protected Control createContents(Composite parent) { + Composite composite = new Composite(parent, SWT.NONE); + GridLayout layout = new GridLayout(); + composite.setLayout(layout); + GridData data = new GridData(GridData.FILL); + data.grabExcessHorizontalSpace = true; + composite.setLayoutData(data); + addHeaderSection(composite); + addSeparator(composite); + addSettingsSection(composite); + load(); + return composite; + } + + private Composite createDefaultComposite(Composite parent) { + Composite composite = new Composite(parent, SWT.NULL); + GridLayout layout = new GridLayout(); + layout.numColumns = 2; + composite.setLayout(layout); + composite.setLayoutData(GridDataFactory.fillDefaults().create()); + return composite; + } + + @Override + protected void performDefaults() { + super.performDefaults(); + prefer.setSelection(metadata.preferLanguageServer().defaultValue()); + } + + @Override + public boolean performOk() { + Optional project = project(); + if (project.isPresent()) { + IEclipsePreferences node = new ProjectScope(project.get()).getNode(Activator.PLUGIN_ID); + node.putBoolean(metadata.preferLanguageServer().identifer(), prefer.getSelection()); + try { + node.flush(); + return true; + } catch (BackingStoreException e) { + Platform.getLog(FrameworkUtil.getBundle(getClass())).error(e.getMessage(), e); + } + } + return false; + } + + private Optional project() { + return Optional.ofNullable(getElement())// + .filter(IProject.class::isInstance)// + .map(IProject.class::cast); + } + +} \ No newline at end of file diff --git a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/text/PresentationReconcilerCPP.java b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/text/PresentationReconcilerCPP.java index 5e51ffd47da..b72a89a5c2d 100644 --- a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/text/PresentationReconcilerCPP.java +++ b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/text/PresentationReconcilerCPP.java @@ -40,7 +40,7 @@ import org.eclipse.cdt.internal.ui.text.CPresentationReconciler; import org.eclipse.cdt.internal.ui.text.PartitionDamager; import org.eclipse.cdt.internal.ui.text.SingleTokenCScanner; import org.eclipse.cdt.internal.ui.text.TokenStore; -import org.eclipse.cdt.lsp.internal.text.ResolveDocumentUri; +import org.eclipse.cdt.lsp.internal.core.workspace.ResolveDocumentUri; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.ILanguageUI; import org.eclipse.cdt.ui.text.AbstractCScanner; diff --git a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/text/SetInactiveRegions.java b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/text/SetInactiveRegions.java index d62a1646089..893ec848c2a 100644 --- a/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/text/SetInactiveRegions.java +++ b/lsp/org.eclipse.cdt.lsp.ui/src/org/eclipse/cdt/lsp/internal/ui/text/SetInactiveRegions.java @@ -15,7 +15,7 @@ import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Supplier; -import org.eclipse.cdt.lsp.internal.text.ResolveDocumentUri; +import org.eclipse.cdt.lsp.internal.core.workspace.ResolveDocumentUri; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.BadPositionCategoryException;