Skip to content

Commit 7c4bc07

Browse files
authored
Revert didOpen changes in favor of adding encoding to didChangeVisibleTextEditors (#13802)
1 parent 2eb2c42 commit 7c4bc07

File tree

2 files changed

+34
-27
lines changed

2 files changed

+34
-27
lines changed

Extension/src/LanguageServer/client.ts

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import * as fs from 'fs';
2828
import * as os from 'os';
2929
import { SourceFileConfiguration, SourceFileConfigurationItem, Version, WorkspaceBrowseConfiguration } from 'vscode-cpptools';
3030
import { IntelliSenseStatus, Status } from 'vscode-cpptools/out/testApi';
31-
import { CloseAction, ErrorAction, LanguageClientOptions, NotificationType, Position, Range, RequestType, ResponseError, TextDocumentIdentifier, TextDocumentPositionParams } from 'vscode-languageclient';
31+
import { CloseAction, DidOpenTextDocumentParams, ErrorAction, LanguageClientOptions, NotificationType, Position, Range, RequestType, ResponseError, TextDocumentIdentifier, TextDocumentPositionParams } from 'vscode-languageclient';
3232
import { LanguageClient, ServerOptions } from 'vscode-languageclient/node';
3333
import * as nls from 'vscode-nls';
3434
import { DebugConfigurationProvider } from '../Debugger/configurationProvider';
@@ -517,10 +517,15 @@ interface TagParseStatus {
517517
isPaused: boolean;
518518
}
519519

520+
interface VisibleEditorInfo {
521+
visibleRanges: Range[];
522+
originalEncoding: string;
523+
}
524+
520525
interface DidChangeVisibleTextEditorsParams {
521526
activeUri?: string;
522527
activeSelection?: Range;
523-
visibleRanges?: { [uri: string]: Range[] };
528+
visibleEditorInfo?: { [uri: string]: VisibleEditorInfo };
524529
}
525530

526531
interface DidChangeTextEditorVisibleRangesParams {
@@ -590,18 +595,11 @@ export interface CopilotCompletionContextParams {
590595
doAggregateSnippets: boolean;
591596
}
592597

593-
export interface TextDocumentItemWithOriginalEncoding {
598+
export interface SetOpenFileOriginalEncodingParams {
594599
uri: string;
595-
languageId: string;
596-
version: number;
597-
text: string;
598600
originalEncoding: string;
599601
}
600602

601-
export interface DidOpenTextDocumentParamsWithOriginalEncoding {
602-
textDocument: TextDocumentItemWithOriginalEncoding;
603-
}
604-
605603
// Requests
606604
const PreInitializationRequest: RequestType<void, string, void> = new RequestType<void, string, void>('cpptools/preinitialize');
607605
const InitializationRequest: RequestType<CppInitializationParams, CppInitializationResult, void> = new RequestType<CppInitializationParams, CppInitializationResult, void>('cpptools/initialize');
@@ -626,8 +624,7 @@ const CppContextRequest: RequestType<TextDocumentIdentifier, ChatContextResult,
626624
const CopilotCompletionContextRequest: RequestType<CopilotCompletionContextParams, CopilotCompletionContextResult, void> = new RequestType<CopilotCompletionContextParams, CopilotCompletionContextResult, void>('cpptools/getCompletionContext');
627625

628626
// Notifications to the server
629-
const DidOpenNotification: NotificationType<DidOpenTextDocumentParamsWithOriginalEncoding> = new NotificationType<DidOpenTextDocumentParamsWithOriginalEncoding>('cpptools/didOpen');
630-
const FileCreatedNotification: NotificationType<FileChangedParams> = new NotificationType<FileChangedParams>('cpptools/fileCreated');
627+
const DidOpenNotification: NotificationType<DidOpenTextDocumentParams> = new NotificationType<DidOpenTextDocumentParams>('textDocument/didOpen'); const FileCreatedNotification: NotificationType<FileChangedParams> = new NotificationType<FileChangedParams>('cpptools/fileCreated');
631628
const FileChangedNotification: NotificationType<FileChangedParams> = new NotificationType<FileChangedParams>('cpptools/fileChanged');
632629
const FileDeletedNotification: NotificationType<FileChangedParams> = new NotificationType<FileChangedParams>('cpptools/fileDeleted');
633630
const ResetDatabaseNotification: NotificationType<void> = new NotificationType<void>('cpptools/resetDatabase');
@@ -650,6 +647,7 @@ const FinishedRequestCustomConfig: NotificationType<FinishedRequestCustomConfigP
650647
const DidChangeSettingsNotification: NotificationType<SettingsParams> = new NotificationType<SettingsParams>('cpptools/didChangeSettings');
651648
const DidChangeVisibleTextEditorsNotification: NotificationType<DidChangeVisibleTextEditorsParams> = new NotificationType<DidChangeVisibleTextEditorsParams>('cpptools/didChangeVisibleTextEditors');
652649
const DidChangeTextEditorVisibleRangesNotification: NotificationType<DidChangeTextEditorVisibleRangesParams> = new NotificationType<DidChangeTextEditorVisibleRangesParams>('cpptools/didChangeTextEditorVisibleRanges');
650+
const SetOpenFileOriginalEncodingNotification: NotificationType<SetOpenFileOriginalEncodingParams> = new NotificationType<SetOpenFileOriginalEncodingParams>('cpptools/setOpenFileOriginalEncoding');
653651

654652
const CodeAnalysisNotification: NotificationType<CodeAnalysisParams> = new NotificationType<CodeAnalysisParams>('cpptools/runCodeAnalysis');
655653
const PauseCodeAnalysisNotification: NotificationType<void> = new NotificationType<void>('cpptools/pauseCodeAnalysis');
@@ -1831,32 +1829,35 @@ export class DefaultClient implements Client {
18311829
return changedSettings;
18321830
}
18331831

1834-
private prepareVisibleRanges(editors: readonly vscode.TextEditor[]): { [uri: string]: Range[] } {
1835-
const visibleRanges: { [uri: string]: Range[] } = {};
1832+
private prepareVisibleEditorInfo(editors: readonly vscode.TextEditor[]): { [uri: string]: VisibleEditorInfo } {
1833+
const visibileEditorInfo: { [uri: string]: VisibleEditorInfo } = {};
18361834
editors.forEach(editor => {
18371835
// Use a map, to account for multiple editors for the same file.
18381836
// First, we just concat all ranges for the same file.
18391837
const uri: string = editor.document.uri.toString();
1840-
if (!visibleRanges[uri]) {
1841-
visibleRanges[uri] = [];
1838+
if (!visibileEditorInfo[uri]) {
1839+
visibileEditorInfo[uri] = {
1840+
visibleRanges: [],
1841+
originalEncoding: editor.document.encoding
1842+
};
18421843
}
1843-
visibleRanges[uri] = visibleRanges[uri].concat(editor.visibleRanges.map(makeLspRange));
1844+
visibileEditorInfo[uri].visibleRanges = visibileEditorInfo[uri].visibleRanges.concat(editor.visibleRanges.map(makeLspRange));
18441845
});
18451846

18461847
// We may need to merge visible ranges, if there are multiple editors for the same file,
18471848
// and some of the ranges overlap.
1848-
Object.keys(visibleRanges).forEach(uri => {
1849-
visibleRanges[uri] = util.mergeOverlappingRanges(visibleRanges[uri]);
1849+
Object.keys(visibileEditorInfo).forEach(uri => {
1850+
visibileEditorInfo[uri].visibleRanges = util.mergeOverlappingRanges(visibileEditorInfo[uri].visibleRanges);
18501851
});
18511852

1852-
return visibleRanges;
1853+
return visibileEditorInfo;
18531854
}
18541855

18551856
// Handles changes to visible files/ranges, changes to current selection/position,
18561857
// and changes to the active text editor. Should only be called on the primary client.
18571858
public async onDidChangeVisibleTextEditors(editors: readonly vscode.TextEditor[]): Promise<void> {
18581859
const params: DidChangeVisibleTextEditorsParams = {
1859-
visibleRanges: this.prepareVisibleRanges(editors)
1860+
visibleEditorInfo: this.prepareVisibleEditorInfo(editors)
18601861
};
18611862
if (vscode.window.activeTextEditor) {
18621863
if (util.isCpp(vscode.window.activeTextEditor.document)) {
@@ -2339,19 +2340,25 @@ export class DefaultClient implements Client {
23392340

23402341
// Only used in crash recovery. Otherwise, VS Code sends didOpen directly to native process (through the protocolFilter).
23412342
public async sendDidOpen(document: vscode.TextDocument): Promise<void> {
2342-
const params: DidOpenTextDocumentParamsWithOriginalEncoding = {
2343+
const params: DidOpenTextDocumentParams = {
23432344
textDocument: {
23442345
uri: document.uri.toString(),
23452346
languageId: document.languageId,
23462347
version: document.version,
2347-
text: document.getText(),
2348-
originalEncoding: document.encoding
2348+
text: document.getText()
23492349
}
23502350
};
2351-
await this.ready;
23522351
await this.languageClient.sendNotification(DidOpenNotification, params);
23532352
}
23542353

2354+
public async sendOpenFileOriginalEncoding(document: vscode.TextDocument): Promise<void> {
2355+
const params: SetOpenFileOriginalEncodingParams = {
2356+
uri: document.uri.toString(),
2357+
originalEncoding: document.encoding
2358+
};
2359+
await this.languageClient.sendNotification(SetOpenFileOriginalEncodingNotification, params);
2360+
}
2361+
23552362
/**
23562363
* Copilot completion-related requests (e.g. getIncludes and getProjectContext) will have their cancellation tokens cancelled
23572364
* if the current request times out (showing the user completion results without context info),

Extension/src/LanguageServer/protocolFilter.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const ServerCancelled: number = -32802;
1919

2020
export function createProtocolFilter(): Middleware {
2121
return {
22-
didOpen: async (document, _sendMessage) => {
22+
didOpen: async (document, sendMessage) => {
2323
if (!util.isCpp(document)) {
2424
return;
2525
}
@@ -44,8 +44,8 @@ export function createProtocolFilter(): Middleware {
4444
}
4545
// client.takeOwnership() will call client.TrackedDocuments.add() again, but that's ok. It's a Set.
4646
client.takeOwnership(document);
47+
void sendMessage(document);
4748
client.ready.then(() => {
48-
client.sendDidOpen(document).catch(logAndReturn.undefined);
4949
const cppEditors: vscode.TextEditor[] = vscode.window.visibleTextEditors.filter(e => util.isCpp(e.document));
5050
client.onDidChangeVisibleTextEditors(cppEditors).catch(logAndReturn.undefined);
5151
}).catch(logAndReturn.undefined);

0 commit comments

Comments
 (0)