diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..9e26dfeeb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 05a500ee5..9aec0e9d7 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -57,7 +57,7 @@ import { DataBinding } from './dataBinding'; import { cachedEditorConfigSettings, getEditorConfigSettings } from './editorConfig'; import { CppSourceStr, clients, configPrefix, updateLanguageConfigurations, usesCrashHandler, watchForCrashes } from './extension'; import { LocalizeStringParams, getLocaleId, getLocalizedString } from './localization'; -import { PersistentFolderState, PersistentWorkspaceState } from './persistentState'; +import { PersistentFolderState, PersistentState, PersistentWorkspaceState } from './persistentState'; import { createProtocolFilter } from './protocolFilter'; import * as refs from './references'; import { CppSettings, OtherSettings, SettingsParams, WorkspaceFolderSettingsParams } from './settings'; @@ -277,6 +277,11 @@ interface IntelliSenseDiagnostic { relatedInformation?: IntelliSenseDiagnosticRelatedInformation[]; } +interface TextDocumentLanguageInformation { + uri: string; + languageId: string; +} + interface RefactorDiagnostic { range: Range; code?: number; @@ -472,6 +477,7 @@ interface SetTemporaryTextDocumentLanguageParams { uri: string; isC: boolean; isCuda: boolean; + isPersistent: boolean; } enum CodeAnalysisScope { @@ -610,7 +616,6 @@ const RequestCustomConfig: NotificationType = new NotificationType = new NotificationType('cpptools/publishRefactorDiagnostics'); const ShowMessageWindowNotification: NotificationType = new NotificationType('cpptools/showMessageWindow'); const ShowWarningNotification: NotificationType = new NotificationType('cpptools/showWarning'); -const ReportTextDocumentLanguage: NotificationType = new NotificationType('cpptools/reportTextDocumentLanguage'); const IntelliSenseSetupNotification: NotificationType = new NotificationType('cpptools/IntelliSenseSetup'); const SetTemporaryTextDocumentLanguageNotification: NotificationType = new NotificationType('cpptools/setTemporaryTextDocumentLanguage'); const ReportCodeAnalysisProcessedNotification: NotificationType = new NotificationType('cpptools/reportCodeAnalysisProcessed'); @@ -1758,9 +1763,19 @@ export class DefaultClient implements Client { } } - public onDidOpenTextDocument(document: vscode.TextDocument): void { + public async onDidOpenTextDocument(document: vscode.TextDocument): Promise { + if (document.uri.scheme === "file") { + console.log(document.languageId); const uri: string = document.uri.toString(); + const textDocumentLanguagePersistentState: PersistentState = new PersistentState("CPP.textDocumentLanguage", undefined); + const persistentLanguage: string | undefined = textDocumentLanguagePersistentState.Value?.languageId; + const persistentFile: string | undefined = textDocumentLanguagePersistentState.Value?.uri; + + if (persistentFile === uri && persistentLanguage) { + await vscode.languages.setTextDocumentLanguage(document, persistentLanguage); + } + openFileVersions.set(uri, document.version); void SessionState.buildAndDebugIsSourceFile.set(util.isCppOrCFile(document.uri)); void SessionState.buildAndDebugIsFolderOpen.set(util.isFolderOpen(document.uri)); @@ -1771,6 +1786,14 @@ export class DefaultClient implements Client { public onDidCloseTextDocument(document: vscode.TextDocument): void { const uri: string = document.uri.toString(); + const textDocumentLanguagePersistentState: PersistentState = new PersistentState("CPP.textDocumentLanguage", undefined); + const persistentFile: string | undefined = textDocumentLanguagePersistentState.Value?.uri; + const persistentLanguage: string | undefined = textDocumentLanguagePersistentState.Value?.languageId; + console.log(document.languageId); + // If the file being closed has changed its language from the one we have stored, clear the stored language. + if (persistentFile === uri && persistentLanguage !== document.languageId) { + textDocumentLanguagePersistentState.Value = undefined; + } if (this.semanticTokensProvider) { this.semanticTokensProvider.removeFile(uri); } @@ -2365,7 +2388,6 @@ export class DefaultClient implements Client { RegisterCodeAnalysisNotifications(this.languageClient); this.languageClient.onNotification(ShowMessageWindowNotification, showMessageWindow); this.languageClient.onNotification(ShowWarningNotification, showWarning); - this.languageClient.onNotification(ReportTextDocumentLanguage, (e) => this.setTextDocumentLanguage(e)); this.languageClient.onNotification(IntelliSenseSetupNotification, (e) => this.logIntelliSenseSetupTime(e)); this.languageClient.onNotification(SetTemporaryTextDocumentLanguageNotification, (e) => void this.setTemporaryTextDocumentLanguage(e)); this.languageClient.onNotification(ReportCodeAnalysisProcessedNotification, (e) => this.updateCodeAnalysisProcessed(e)); @@ -2428,21 +2450,22 @@ export class DefaultClient implements Client { clients.timeTelemetryCollector.setUpdateRangeTime(realUri); } - private setTextDocumentLanguage(languageStr: string): void { - const cppSettings: CppSettings = new CppSettings(); - if (cppSettings.autoAddFileAssociations) { - const is_c: boolean = languageStr.startsWith("c;"); - const is_cuda: boolean = languageStr.startsWith("cu;"); - languageStr = languageStr.substring(is_c ? 2 : is_cuda ? 3 : 1); - this.addFileAssociations(languageStr, is_c ? "c" : is_cuda ? "cuda-cpp" : "cpp"); - } - } - private async setTemporaryTextDocumentLanguage(params: SetTemporaryTextDocumentLanguageParams): Promise { const languageId: string = params.isC ? "c" : params.isCuda ? "cuda-cpp" : "cpp"; const uri: vscode.Uri = vscode.Uri.parse(params.uri); + const client: Client = clients.getClientFor(uri); const document: vscode.TextDocument | undefined = client.TrackedDocuments.get(params.uri); + if (params.isPersistent) { + const textDocumentLanguagePersistentState: PersistentState = new PersistentState("CPP.textDocumentLanguage", undefined); + textDocumentLanguagePersistentState.Value = undefined; + const doc: vscode.TextDocument | undefined = await vscode.workspace.openTextDocument(params.uri); + await vscode.languages.setTextDocumentLanguage(doc, languageId); + console.log(textDocumentLanguagePersistentState.Value); + if (!textDocumentLanguagePersistentState.Value) { + textDocumentLanguagePersistentState.Value = {uri: doc.uri.toString(), languageId: languageId}; + } + } if (!!document && document.languageId !== languageId) { if (document.languageId === "cpp" && languageId === "c") { handleChangedFromCppToC(document); diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 5171f2779..c2723b3fe 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -377,7 +377,6 @@ export class CppSettings extends Settings { public get autocomplete(): string { return this.getAsString("autocomplete"); } public get autocompleteAddParentheses(): boolean { return this.getAsBoolean("autocompleteAddParentheses"); } public get loggingLevel(): string { return this.getAsString("loggingLevel"); } - public get autoAddFileAssociations(): boolean { return this.getAsBoolean("autoAddFileAssociations"); } public get workspaceParsingPriority(): string { return this.getAsString("workspaceParsingPriority"); } public get workspaceSymbols(): string { return this.getAsString("workspaceSymbols"); } public get exclusionPolicy(): string { return this.getAsString("exclusionPolicy"); } diff --git a/Extension/src/LanguageServer/utils.ts b/Extension/src/LanguageServer/utils.ts index da3d29b69..7dc018c99 100644 --- a/Extension/src/LanguageServer/utils.ts +++ b/Extension/src/LanguageServer/utils.ts @@ -8,7 +8,6 @@ import * as vscode from 'vscode'; import { Range } from 'vscode-languageclient'; import { SessionState } from '../sessionState'; import { Location, TextEdit } from './commonTypes'; -import { CppSettings } from './settings'; export function makeLspRange(vscRange: vscode.Range): Range { return { @@ -37,10 +36,7 @@ export function rangeEquals(range1: vscode.Range | Range, range2: vscode.Range | // Check this before attempting to switch a document from C to C++. export function shouldChangeFromCToCpp(document: vscode.TextDocument): boolean { if (document.fileName.endsWith(".C") || document.fileName.endsWith(".H")) { - const cppSettings: CppSettings = new CppSettings(); - if (cppSettings.autoAddFileAssociations) { - return !docsChangedFromCppToC.has(document.fileName); - } + return !docsChangedFromCppToC.has(document.fileName); // We could potentially add a new setting to enable switching to cpp even when files.associations isn't changed. } return false; diff --git a/README.md b/README.md index f45d123a2..7cd64bcb0 100644 --- a/README.md +++ b/README.md @@ -7,16 +7,18 @@ The C/C++ extension adds language support for C/C++ to Visual Studio Code, including [editing (IntelliSense)](https://code.visualstudio.com/docs/cpp/cpp-ide) and [debugging](https://code.visualstudio.com/docs/cpp/cpp-debug) features. ## Pre-requisites + C++ is a compiled language meaning your program's source code must be translated (compiled) before it can be run on your computer. VS Code is first and foremost an editor, and relies on command-line tools to do much of the development workflow. The C/C++ extension **does not include a C++ compiler or debugger**. You will need to install these tools or use those already installed on your computer. - * C++ compiler pre-installed - * C++ debugger pre-installed + +* C++ compiler pre-installed +* C++ debugger pre-installed
Here is a list of compilers and architectures per platform officially supported by the extension. These are reflected by the available [IntelliSense modes](https://code.visualstudio.com/docs/cpp/configure-intellisense-crosscompilation#_intellisense-mode) from the extension's IntelliSense configuration. Note that support for other compilers may be limited. Platform | Compilers | Architectures -:--- | :--- | :--- +:--- | :--- | :--- Windows | MSVC, Clang, GCC | x64, x86, arm64, arm Linux | Clang, GCC | x64, x86, arm64, arm macOS | Clang, GCC | x64, x86, arm64 @@ -26,10 +28,12 @@ For more information about installing the required tools or setting up the exten
## Overview and tutorials + * [C/C++ extension overview](https://code.visualstudio.com/docs/languages/cpp) * [Introductory Videos](https://code.visualstudio.com/docs/cpp/introvideos-cpp) C/C++ extension tutorials per compiler and platform + * [Microsoft C++ compiler (MSVC) on Windows](https://code.visualstudio.com/docs/cpp/config-msvc) * [GCC and Mingw-w64 on Windows](https://code.visualstudio.com/docs/cpp/config-mingw) * [GCC on Windows Subsystem for Linux (WSL)](https://code.visualstudio.com/docs/cpp/config-wsl) @@ -37,6 +41,7 @@ C/C++ extension tutorials per compiler and platform * [Clang on macOS](https://code.visualstudio.com/docs/cpp/config-clang-mac) ## Quick links + * [Editing features (IntelliSense)](https://code.visualstudio.com/docs/cpp/cpp-ide) * [IntelliSense configuration](https://code.visualstudio.com/docs/cpp/customize-default-settings-cpp) * [Enhanced colorization](https://code.visualstudio.com/docs/cpp/colorization-cpp) @@ -71,7 +76,7 @@ Contributions are always welcome. Please see our [contributing guide](CONTRIBUTI ## Microsoft Open Source Code of Conduct -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact opencode@microsoft.com with any additional questions or comments. +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact with any additional questions or comments. ## Data Collection @@ -79,4 +84,4 @@ The software may collect information about you and your use of the software and ## Trademarks -This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft’s Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies. \ No newline at end of file +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow Microsoft’s Trademark & Brand Guidelines. Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party’s policies. diff --git a/launch.md b/launch.md index 9e1ae0738..da91ca645 100644 --- a/launch.md +++ b/launch.md @@ -1 +1,3 @@ -The documentation for debug configuration has moved to https://code.visualstudio.com/docs/cpp/launch-json-reference. \ No newline at end of file +# Debug Configuration + +The documentation for debug configuration has moved to .