Skip to content

Commit a72ce2e

Browse files
authored
Merge branch 'main' into seanmcm/handleTxxHeaders
2 parents fb22110 + 6ab5092 commit a72ce2e

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

Extension/src/LanguageServer/client.ts

Lines changed: 32 additions & 24 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,7 +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');
627+
const DidOpenNotification: NotificationType<DidOpenTextDocumentParams> = new NotificationType<DidOpenTextDocumentParams>('textDocument/didOpen');
630628
const FileCreatedNotification: NotificationType<FileChangedParams> = new NotificationType<FileChangedParams>('cpptools/fileCreated');
631629
const FileChangedNotification: NotificationType<FileChangedParams> = new NotificationType<FileChangedParams>('cpptools/fileChanged');
632630
const FileDeletedNotification: NotificationType<FileChangedParams> = new NotificationType<FileChangedParams>('cpptools/fileDeleted');
@@ -650,6 +648,7 @@ const FinishedRequestCustomConfig: NotificationType<FinishedRequestCustomConfigP
650648
const DidChangeSettingsNotification: NotificationType<SettingsParams> = new NotificationType<SettingsParams>('cpptools/didChangeSettings');
651649
const DidChangeVisibleTextEditorsNotification: NotificationType<DidChangeVisibleTextEditorsParams> = new NotificationType<DidChangeVisibleTextEditorsParams>('cpptools/didChangeVisibleTextEditors');
652650
const DidChangeTextEditorVisibleRangesNotification: NotificationType<DidChangeTextEditorVisibleRangesParams> = new NotificationType<DidChangeTextEditorVisibleRangesParams>('cpptools/didChangeTextEditorVisibleRanges');
651+
const SetOpenFileOriginalEncodingNotification: NotificationType<SetOpenFileOriginalEncodingParams> = new NotificationType<SetOpenFileOriginalEncodingParams>('cpptools/setOpenFileOriginalEncoding');
653652

654653
const CodeAnalysisNotification: NotificationType<CodeAnalysisParams> = new NotificationType<CodeAnalysisParams>('cpptools/runCodeAnalysis');
655654
const PauseCodeAnalysisNotification: NotificationType<void> = new NotificationType<void>('cpptools/pauseCodeAnalysis');
@@ -1831,32 +1830,35 @@ export class DefaultClient implements Client {
18311830
return changedSettings;
18321831
}
18331832

1834-
private prepareVisibleRanges(editors: readonly vscode.TextEditor[]): { [uri: string]: Range[] } {
1835-
const visibleRanges: { [uri: string]: Range[] } = {};
1833+
private prepareVisibleEditorInfo(editors: readonly vscode.TextEditor[]): { [uri: string]: VisibleEditorInfo } {
1834+
const visibileEditorInfo: { [uri: string]: VisibleEditorInfo } = {};
18361835
editors.forEach(editor => {
18371836
// Use a map, to account for multiple editors for the same file.
18381837
// First, we just concat all ranges for the same file.
18391838
const uri: string = editor.document.uri.toString();
1840-
if (!visibleRanges[uri]) {
1841-
visibleRanges[uri] = [];
1839+
if (!visibileEditorInfo[uri]) {
1840+
visibileEditorInfo[uri] = {
1841+
visibleRanges: [],
1842+
originalEncoding: editor.document.encoding
1843+
};
18421844
}
1843-
visibleRanges[uri] = visibleRanges[uri].concat(editor.visibleRanges.map(makeLspRange));
1845+
visibileEditorInfo[uri].visibleRanges = visibileEditorInfo[uri].visibleRanges.concat(editor.visibleRanges.map(makeLspRange));
18441846
});
18451847

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

1852-
return visibleRanges;
1854+
return visibileEditorInfo;
18531855
}
18541856

18551857
// Handles changes to visible files/ranges, changes to current selection/position,
18561858
// and changes to the active text editor. Should only be called on the primary client.
18571859
public async onDidChangeVisibleTextEditors(editors: readonly vscode.TextEditor[]): Promise<void> {
18581860
const params: DidChangeVisibleTextEditorsParams = {
1859-
visibleRanges: this.prepareVisibleRanges(editors)
1861+
visibleEditorInfo: this.prepareVisibleEditorInfo(editors)
18601862
};
18611863
if (vscode.window.activeTextEditor) {
18621864
if (util.isCpp(vscode.window.activeTextEditor.document)) {
@@ -2339,19 +2341,25 @@ export class DefaultClient implements Client {
23392341

23402342
// Only used in crash recovery. Otherwise, VS Code sends didOpen directly to native process (through the protocolFilter).
23412343
public async sendDidOpen(document: vscode.TextDocument): Promise<void> {
2342-
const params: DidOpenTextDocumentParamsWithOriginalEncoding = {
2344+
const params: DidOpenTextDocumentParams = {
23432345
textDocument: {
23442346
uri: document.uri.toString(),
23452347
languageId: document.languageId,
23462348
version: document.version,
2347-
text: document.getText(),
2348-
originalEncoding: document.encoding
2349+
text: document.getText()
23492350
}
23502351
};
2351-
await this.ready;
23522352
await this.languageClient.sendNotification(DidOpenNotification, params);
23532353
}
23542354

2355+
public async sendOpenFileOriginalEncoding(document: vscode.TextDocument): Promise<void> {
2356+
const params: SetOpenFileOriginalEncodingParams = {
2357+
uri: document.uri.toString(),
2358+
originalEncoding: document.encoding
2359+
};
2360+
await this.languageClient.sendNotification(SetOpenFileOriginalEncodingNotification, params);
2361+
}
2362+
23552363
/**
23562364
* Copilot completion-related requests (e.g. getIncludes and getProjectContext) will have their cancellation tokens cancelled
23572365
* 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)