From 0e38165adb2e73cce2b5662a850934622ebf830f Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson Date: Fri, 18 Jul 2025 15:57:33 -0700 Subject: [PATCH 1/2] Enable string length encoding fix in cpptools --- Extension/src/LanguageServer/client.ts | 21 +++++++++++++++---- .../src/LanguageServer/protocolFilter.ts | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 1b33615b0..0f14b8fd7 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -28,7 +28,7 @@ import * as fs from 'fs'; import * as os from 'os'; import { SourceFileConfiguration, SourceFileConfigurationItem, Version, WorkspaceBrowseConfiguration } from 'vscode-cpptools'; import { IntelliSenseStatus, Status } from 'vscode-cpptools/out/testApi'; -import { CloseAction, DidOpenTextDocumentParams, ErrorAction, LanguageClientOptions, NotificationType, Position, Range, RequestType, ResponseError, TextDocumentIdentifier, TextDocumentPositionParams } from 'vscode-languageclient'; +import { CloseAction, ErrorAction, LanguageClientOptions, NotificationType, Position, Range, RequestType, ResponseError, TextDocumentIdentifier, TextDocumentPositionParams } from 'vscode-languageclient'; import { LanguageClient, ServerOptions } from 'vscode-languageclient/node'; import * as nls from 'vscode-nls'; import { DebugConfigurationProvider } from '../Debugger/configurationProvider'; @@ -590,6 +590,18 @@ export interface CopilotCompletionContextParams { doAggregateSnippets: boolean; } +export interface TextDocumentItemWithOriginalEncoding { + uri: string; + languageId: string; + version: number; + text: string; + originalEncoding: string; +} + +export interface DidOpenTextDocumentParamsWithOriginalEncoding { + textDocument: TextDocumentItemWithOriginalEncoding; +} + // Requests const PreInitializationRequest: RequestType = new RequestType('cpptools/preinitialize'); const InitializationRequest: RequestType = new RequestType('cpptools/initialize'); @@ -614,7 +626,7 @@ const CppContextRequest: RequestType = new RequestType('cpptools/getCompletionContext'); // Notifications to the server -const DidOpenNotification: NotificationType = new NotificationType('textDocument/didOpen'); +const DidOpenNotification: NotificationType = new NotificationType('cpptools/didOpen'); const FileCreatedNotification: NotificationType = new NotificationType('cpptools/fileCreated'); const FileChangedNotification: NotificationType = new NotificationType('cpptools/fileChanged'); const FileDeletedNotification: NotificationType = new NotificationType('cpptools/fileDeleted'); @@ -2327,12 +2339,13 @@ export class DefaultClient implements Client { // Only used in crash recovery. Otherwise, VS Code sends didOpen directly to native process (through the protocolFilter). public async sendDidOpen(document: vscode.TextDocument): Promise { - const params: DidOpenTextDocumentParams = { + const params: DidOpenTextDocumentParamsWithOriginalEncoding = { textDocument: { uri: document.uri.toString(), languageId: document.languageId, version: document.version, - text: document.getText() + text: document.getText(), + originalEncoding: document.encoding } }; await this.ready; diff --git a/Extension/src/LanguageServer/protocolFilter.ts b/Extension/src/LanguageServer/protocolFilter.ts index d6462072e..f71f99df6 100644 --- a/Extension/src/LanguageServer/protocolFilter.ts +++ b/Extension/src/LanguageServer/protocolFilter.ts @@ -44,8 +44,8 @@ export function createProtocolFilter(): Middleware { } // client.takeOwnership() will call client.TrackedDocuments.add() again, but that's ok. It's a Set. client.takeOwnership(document); - void sendMessage(document); client.ready.then(() => { + client.sendDidOpen(document); const cppEditors: vscode.TextEditor[] = vscode.window.visibleTextEditors.filter(e => util.isCpp(e.document)); client.onDidChangeVisibleTextEditors(cppEditors).catch(logAndReturn.undefined); }).catch(logAndReturn.undefined); From d0ae6fa4538b1482629e35501721a0489998ddc3 Mon Sep 17 00:00:00 2001 From: Colen Garoutte-Carson Date: Fri, 18 Jul 2025 16:29:52 -0700 Subject: [PATCH 2/2] Fix lint issues --- Extension/src/LanguageServer/protocolFilter.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Extension/src/LanguageServer/protocolFilter.ts b/Extension/src/LanguageServer/protocolFilter.ts index f71f99df6..f87eee070 100644 --- a/Extension/src/LanguageServer/protocolFilter.ts +++ b/Extension/src/LanguageServer/protocolFilter.ts @@ -19,7 +19,7 @@ export const ServerCancelled: number = -32802; export function createProtocolFilter(): Middleware { return { - didOpen: async (document, sendMessage) => { + didOpen: async (document, _sendMessage) => { if (!util.isCpp(document)) { return; } @@ -45,7 +45,7 @@ export function createProtocolFilter(): Middleware { // client.takeOwnership() will call client.TrackedDocuments.add() again, but that's ok. It's a Set. client.takeOwnership(document); client.ready.then(() => { - client.sendDidOpen(document); + client.sendDidOpen(document).catch(logAndReturn.undefined); const cppEditors: vscode.TextEditor[] = vscode.window.visibleTextEditors.filter(e => util.isCpp(e.document)); client.onDidChangeVisibleTextEditors(cppEditors).catch(logAndReturn.undefined); }).catch(logAndReturn.undefined);