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;