From e02e28eec1d7b08a85021f383d2ecc945540e98c Mon Sep 17 00:00:00 2001 From: Manish Khurana Date: Sat, 9 Jun 2018 11:27:11 +0530 Subject: [PATCH] Bug 535632. Set a cache directory for CQuery LS Change-Id: I80b88f48207b5091fe1c634c730a8fd6983f40b9 Signed-off-by: Manish Khurana --- .../META-INF/MANIFEST.MF | 3 ++- .../org.eclipse.lsp4e.cpp.language/plugin.xml | 2 +- .../CPPLanguageServerPreferencePage.java | 7 ++--- .../language/CPPResourceChangeListener.java | 2 +- ....java => CPPStreamConnectionProvider.java} | 21 ++++++++++++--- .../cpp/language/ClangdLanguageServer.java | 20 ++++++++++++++ .../cpp/language/CqueryLanguageServer.java | 27 +++++++++++++++++++ .../cpp/language/ICPPLanguageServer.java | 19 +++++++++++++ 8 files changed, 92 insertions(+), 9 deletions(-) rename lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/{CPPLanguageServer.java => CPPStreamConnectionProvider.java} (82%) create mode 100644 lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/ClangdLanguageServer.java create mode 100644 lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CqueryLanguageServer.java create mode 100644 lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/ICPPLanguageServer.java diff --git a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/META-INF/MANIFEST.MF b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/META-INF/MANIFEST.MF index 5abb02789c1..d581d5016fc 100644 --- a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/META-INF/MANIFEST.MF +++ b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/META-INF/MANIFEST.MF @@ -16,7 +16,8 @@ Require-Bundle: org.apache.commons.io, org.eclipse.lsp4j, org.eclipse.core.commands, org.eclipse.core.expressions, - org.eclipse.core.resources + org.eclipse.core.resources, + com.google.gson;bundle-version="2.8.2" Bundle-Vendor: %Bundle-Vendor Export-Package: org.eclipse.lsp4e.cpp.language Bundle-Activator: org.eclipse.lsp4e.cpp.language.Activator diff --git a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/plugin.xml b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/plugin.xml index b8c36497eb2..d0370eae59d 100644 --- a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/plugin.xml +++ b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/plugin.xml @@ -14,7 +14,7 @@ diff --git a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPLanguageServerPreferencePage.java b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPLanguageServerPreferencePage.java index 6069e51a5d8..0c1258f4254 100644 --- a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPLanguageServerPreferencePage.java +++ b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPLanguageServerPreferencePage.java @@ -31,9 +31,10 @@ public class CPPLanguageServerPreferencePage extends FieldEditorPreferencePage i @Override public void createFieldEditors() { - serverChoice = new RadioGroupFieldEditor(PreferenceConstants.P_SERVER_CHOICE, - Messages.ServerChoiceLabel, 1, - new String[][] { { "ClangD", "clangd" }, { "CQuery", "cquery" } }, getFieldEditorParent()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + serverChoice = new RadioGroupFieldEditor(PreferenceConstants.P_SERVER_CHOICE, Messages.ServerChoiceLabel, 1, + new String[][] { { "ClangD", CPPStreamConnectionProvider.CLANGD_ID }, //$NON-NLS-1$ + { "CQuery", CPPStreamConnectionProvider.CQUERY_ID } }, //$NON-NLS-1$ + getFieldEditorParent()); addField(serverChoice); serverPath = new FileFieldEditor(PreferenceConstants.P_SERVER_PATH, Messages.ServerPathLabel, diff --git a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPResourceChangeListener.java b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPResourceChangeListener.java index 18524e9fd62..a2dcda07346 100644 --- a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPResourceChangeListener.java +++ b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPResourceChangeListener.java @@ -42,7 +42,7 @@ final class CPPResourceChangeListener implements IResourceChangeListener { @Override public void resourceChanged(IResourceChangeEvent event) { - LanguageServerDefinition definition = LanguageServersRegistry.getInstance().getDefinition(CPPLanguageServer.ID); + LanguageServerDefinition definition = LanguageServersRegistry.getInstance().getDefinition(CPPStreamConnectionProvider.ID); ProjectSpecificLanguageServerWrapper wrapper = getLanguageSeverWrapper(definition); if (event.getType() != IResourceChangeEvent.POST_CHANGE || !isRelevantDelta(event.getDelta()) || wrapper == null) { diff --git a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPLanguageServer.java b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPStreamConnectionProvider.java similarity index 82% rename from lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPLanguageServer.java rename to lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPStreamConnectionProvider.java index d2ce3b42f1c..ba773e3a539 100644 --- a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPLanguageServer.java +++ b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CPPStreamConnectionProvider.java @@ -25,7 +25,8 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.lsp4e.server.ProcessStreamConnectionProvider; -public class CPPLanguageServer extends ProcessStreamConnectionProvider { + +public class CPPStreamConnectionProvider extends ProcessStreamConnectionProvider { public static final String ID = "org.eclipse.lsp4e.languages.cpp"; //$NON-NLS-1$ @@ -33,8 +34,21 @@ public class CPPLanguageServer extends ProcessStreamConnectionProvider { private static final IPreferenceStore store = Activator.getDefault().getPreferenceStore(); - public CPPLanguageServer() { + private ICPPLanguageServer languageServer; + + public static final String CLANGD_ID = "clangd"; //$NON-NLS-1$ + + public static final String CQUERY_ID = "cquery"; //$NON-NLS-1$ + + public CPPStreamConnectionProvider() throws UnsupportedOperationException { List commands = new ArrayList<>(); + if (store.getString(PreferenceConstants.P_SERVER_CHOICE).equals(CQUERY_ID)) { + languageServer = new CqueryLanguageServer(); + } else if (store.getString(PreferenceConstants.P_SERVER_CHOICE).equals(CLANGD_ID)) { + languageServer = new ClangdLanguageServer(); + } else { + throw new UnsupportedOperationException("Unsupported Language Server"); //$NON-NLS-1$ + } File defaultLSLocation = getDefaultLSLocation(store.getString(PreferenceConstants.P_SERVER_CHOICE)); if(defaultLSLocation != null) { store.setDefault(PreferenceConstants.P_SERVER_PATH, defaultLSLocation.getAbsolutePath()); @@ -65,7 +79,8 @@ public class CPPLanguageServer extends ProcessStreamConnectionProvider { @Override public Object getInitializationOptions(URI rootPath) { installResourceChangeListener(rootPath); - return super.getInitializationOptions(rootPath); + Object defaultInitOptions = super.getInitializationOptions(rootPath); + return languageServer.getLSSpecificInitializationOptions(defaultInitOptions, rootPath); } private void installResourceChangeListener(URI rootPath) { diff --git a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/ClangdLanguageServer.java b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/ClangdLanguageServer.java new file mode 100644 index 00000000000..79c436f3c36 --- /dev/null +++ b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/ClangdLanguageServer.java @@ -0,0 +1,20 @@ +/******************************************************************************* + * Copyright (c) 2018 Manish Khurana , Nathan Ridge and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ + +package org.eclipse.lsp4e.cpp.language; + +import java.net.URI; + +public class ClangdLanguageServer implements ICPPLanguageServer { + + @Override + public Object getLSSpecificInitializationOptions(Object defaultInitOptions, URI rootPath) { + return defaultInitOptions; + } + +} diff --git a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CqueryLanguageServer.java b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CqueryLanguageServer.java new file mode 100644 index 00000000000..8f153e9efb3 --- /dev/null +++ b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/CqueryLanguageServer.java @@ -0,0 +1,27 @@ +/******************************************************************************* + * Copyright (c) 2018 Manish Khurana , Nathan Ridge and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ + +package org.eclipse.lsp4e.cpp.language; + +import java.net.URI; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import com.google.gson.JsonObject; + +public class CqueryLanguageServer implements ICPPLanguageServer { + + @Override + public Object getLSSpecificInitializationOptions(Object defaultInitOptions, URI rootPath) { +// TODO: Allow user to specify cache directory path + IPath cacheDirectory = Path.fromOSString(rootPath.getPath()).append(".cquery/cquery_index"); //$NON-NLS-1$ + JsonObject result = (defaultInitOptions instanceof JsonObject) ? (JsonObject) defaultInitOptions : new JsonObject(); + result.addProperty("cacheDirectory", cacheDirectory.toString()); //$NON-NLS-1$ + return result; + } + +} diff --git a/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/ICPPLanguageServer.java b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/ICPPLanguageServer.java new file mode 100644 index 00000000000..35d6a3eab33 --- /dev/null +++ b/lsp4e-cpp/org.eclipse.lsp4e.cpp.language/src/org/eclipse/lsp4e/cpp/language/ICPPLanguageServer.java @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2018 Manish Khurana , Nathan Ridge and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ + +package org.eclipse.lsp4e.cpp.language; + +import java.net.URI; +/* + * Encapsulates functionality specific to a particular C++ language server (e.g., CQuery) + */ +public interface ICPPLanguageServer { + + public Object getLSSpecificInitializationOptions(Object defaultInitOptions, URI rootPath) ; + +}