diff --git a/package.json b/package.json index f9dee057d..7cbf7bb60 100644 --- a/package.json +++ b/package.json @@ -232,6 +232,22 @@ "markdownDeprecationMessage": "**Deprecated**: Please use `#editor.inlayHints.enabled#` instead.", "order": 3 }, + "sourcekit-lsp.support-c-cpp": { + "type": "string", + "default": "cpptools-inactive", + "enum": [ + "enable", + "disable", + "cpptools-inactive" + ], + "enumDescriptions": [ + "Always enable", + "Always disable", + "Disable when C/C++ extension is active" + ], + "description": "Add LSP functionality for C/C++ files. By default this is set to disable when the C/C++ extension is active.", + "order": 4 + }, "sourcekit-lsp.trace.server": { "type": "string", "default": "off", @@ -241,7 +257,7 @@ "verbose" ], "description": "Traces the communication between VS Code and the SourceKit-LSP language server.", - "order": 4 + "order": 5 } } }, diff --git a/src/configuration.ts b/src/configuration.ts index 0f23c827b..4cddcbab4 100644 --- a/src/configuration.ts +++ b/src/configuration.ts @@ -14,6 +14,8 @@ import * as vscode from "vscode"; +type CFamilySupportOptions = "enable" | "disable" | "cpptools-inactive"; + /** sourcekit-lsp configuration */ export interface LSPConfiguration { /** Path to sourcekit-lsp executable */ @@ -22,6 +24,8 @@ export interface LSPConfiguration { readonly serverArguments: string[]; /** Are inlay hints enabled */ readonly inlayHintsEnabled: boolean; + /** Support C Family source files */ + readonly supportCFamily: CFamilySupportOptions; } /** workspace folder configuration */ @@ -56,6 +60,11 @@ const configuration = { .getConfiguration("sourcekit-lsp") .get("inlayHints.enabled", true); }, + get supportCFamily(): CFamilySupportOptions { + return vscode.workspace + .getConfiguration("sourcekit-lsp") + .get("support-c-cpp", "cpptools-inactive"); + }, }; }, diff --git a/src/sourcekit-lsp/LanguageClientManager.ts b/src/sourcekit-lsp/LanguageClientManager.ts index 36923a03b..613beb342 100644 --- a/src/sourcekit-lsp/LanguageClientManager.ts +++ b/src/sourcekit-lsp/LanguageClientManager.ts @@ -36,18 +36,50 @@ import { LanguageClient } from "vscode-languageclient/node"; */ export class LanguageClientManager { // document selector used by language client - static documentSelector = [ + static appleLangDocumentSelector = [ { scheme: "file", language: "swift" }, { scheme: "untitled", language: "swift" }, - { scheme: "file", language: "c" }, - { scheme: "untitled", language: "c" }, - { scheme: "file", language: "cpp" }, - { scheme: "untitled", language: "cpp" }, { scheme: "file", language: "objective-c" }, { scheme: "untitled", language: "objective-c" }, { scheme: "file", language: "objective-cpp" }, { scheme: "untitled", language: "objective-cpp" }, ]; + // document selector used by language client + static cFamilyDocumentSelector = [ + { scheme: "file", language: "c" }, + { scheme: "untitled", language: "c" }, + { scheme: "file", language: "cpp" }, + { scheme: "untitled", language: "cpp" }, + ]; + static get documentSelector(): { scheme: string; language: string }[] { + let documentSelector: { scheme: string; language: string }[]; + switch (configuration.lsp.supportCFamily) { + case "enable": + documentSelector = [ + ...LanguageClientManager.appleLangDocumentSelector, + ...LanguageClientManager.cFamilyDocumentSelector, + ]; + break; + + case "disable": + documentSelector = LanguageClientManager.appleLangDocumentSelector; + break; + + case "cpptools-inactive": { + const cppToolsActive = + vscode.extensions.getExtension("ms-vscode.cpptools")?.isActive; + documentSelector = + cppToolsActive === true + ? LanguageClientManager.appleLangDocumentSelector + : [ + ...LanguageClientManager.appleLangDocumentSelector, + ...LanguageClientManager.cFamilyDocumentSelector, + ]; + } + } + return documentSelector; + } + // build argument to sourcekit-lsp filter static buildArgumentFilter: ArgumentFilter[] = [ { argument: "--build-path", include: 1 }, @@ -128,10 +160,10 @@ export class LanguageClientManager { } // on change config restart server const onChangeConfig = vscode.workspace.onDidChangeConfiguration(event => { - if (event.affectsConfiguration("sourcekit-lsp.serverPath")) { + if (event.affectsConfiguration("sourcekit-lsp")) { vscode.window .showInformationMessage( - "Changing LSP server path requires the language server be restarted.", + "Changing LSP settings requires the language server be restarted.", "Ok" ) .then(selected => { @@ -389,6 +421,7 @@ export class LanguageClientManager { if (folder) { workspaceFolder = { uri: folder, name: FolderContext.uriName(folder), index: 0 }; } + const clientOptions: langclient.LanguageClientOptions = { documentSelector: LanguageClientManager.documentSelector, revealOutputChannelOn: langclient.RevealOutputChannelOn.Never,