Skip to content

Commit b4417da

Browse files
authored
Fix fourslash server (#33063)
1 parent 25f609b commit b4417da

File tree

3 files changed

+41
-8
lines changed

3 files changed

+41
-8
lines changed

src/harness/client.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,13 @@ namespace ts.server {
134134
this.processRequest(CommandNames.Close, args);
135135
}
136136

137-
changeFile(fileName: string, start: number, end: number, insertString: string): void {
137+
createChangeFileRequestArgs(fileName: string, start: number, end: number, insertString: string): protocol.ChangeRequestArgs {
138+
return { ...this.createFileLocationRequestArgsWithEndLineAndOffset(fileName, start, end), insertString };
139+
}
140+
141+
changeFile(fileName: string, args: protocol.ChangeRequestArgs): void {
138142
// clear the line map after an edit
139143
this.lineMaps.set(fileName, undefined!); // TODO: GH#18217
140-
141-
const args: protocol.ChangeRequestArgs = { ...this.createFileLocationRequestArgsWithEndLineAndOffset(fileName, start, end), insertString };
142144
this.processRequest(CommandNames.Change, args);
143145
}
144146

src/harness/fourslash.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ namespace FourSlash {
150150
private languageServiceAdapterHost: Harness.LanguageService.LanguageServiceAdapterHost;
151151
private languageService: ts.LanguageService;
152152
private cancellationToken: TestCancellationToken;
153+
private assertTextConsistent: ((fileName: string) => void) | undefined;
153154

154155
// The current caret position in the active file
155156
public currentCaretPosition = 0;
@@ -280,6 +281,9 @@ namespace FourSlash {
280281
const languageServiceAdapter = this.getLanguageServiceAdapter(testType, this.cancellationToken, compilationOptions);
281282
this.languageServiceAdapterHost = languageServiceAdapter.getHost();
282283
this.languageService = memoWrap(languageServiceAdapter.getLanguageService(), this); // Wrap the LS to cache some expensive operations certain tests call repeatedly
284+
if (this.testType === FourSlashTestType.Server) {
285+
this.assertTextConsistent = fileName => (languageServiceAdapter as Harness.LanguageService.ServerLanguageServiceAdapter).assertTextConsistent(fileName);
286+
}
283287

284288
if (startResolveFileRef) {
285289
// Add the entry-point file itself into the languageServiceShimHost
@@ -1867,6 +1871,9 @@ namespace FourSlash {
18671871

18681872
private editScriptAndUpdateMarkers(fileName: string, editStart: number, editEnd: number, newText: string) {
18691873
this.languageServiceAdapterHost.editScript(fileName, editStart, editEnd, newText);
1874+
if (this.assertTextConsistent) {
1875+
this.assertTextConsistent(fileName);
1876+
}
18701877
for (const marker of this.testData.markers) {
18711878
if (marker.fileName === fileName) {
18721879
marker.position = updatePosition(marker.position, editStart, editEnd, newText);

src/harness/harnessLanguageService.ts

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -661,8 +661,9 @@ namespace Harness.LanguageService {
661661
}
662662

663663
editScript(fileName: string, start: number, end: number, newText: string) {
664+
const changeArgs = this.client.createChangeFileRequestArgs(fileName, start, end, newText);
664665
super.editScript(fileName, start, end, newText);
665-
this.client.changeFile(fileName, start, end, newText);
666+
this.client.changeFile(fileName, changeArgs);
666667
}
667668
}
668669

@@ -719,8 +720,8 @@ namespace Harness.LanguageService {
719720
return this.host.getCurrentDirectory();
720721
}
721722

722-
getDirectories(): string[] {
723-
return [];
723+
getDirectories(path: string): string[] {
724+
return this.host.getDirectories(path);
724725
}
725726

726727
getEnvironmentVariable(name: string): string {
@@ -890,9 +891,16 @@ namespace Harness.LanguageService {
890891
}
891892
}
892893

894+
class FourslashSession extends ts.server.Session {
895+
getText(fileName: string) {
896+
return ts.getSnapshotText(this.projectService.getDefaultProjectForFile(ts.server.toNormalizedPath(fileName), /*ensureProject*/ true)!.getScriptSnapshot(fileName)!);
897+
}
898+
}
899+
893900
export class ServerLanguageServiceAdapter implements LanguageServiceAdapter {
894901
private host: SessionClientHost;
895902
private client: ts.server.SessionClient;
903+
private server: FourslashSession;
896904
constructor(cancellationToken?: ts.HostCancellationToken, options?: ts.CompilerOptions) {
897905
// This is the main host that tests use to direct tests
898906
const clientHost = new SessionClientHost(cancellationToken, options);
@@ -912,11 +920,12 @@ namespace Harness.LanguageService {
912920
logger: serverHost,
913921
canUseEvents: true
914922
};
915-
const server = new ts.server.Session(opts);
923+
this.server = new FourslashSession(opts);
924+
916925

917926
// Fake the connection between the client and the server
918927
serverHost.writeMessage = client.onMessage.bind(client);
919-
clientHost.writeMessage = server.onMessage.bind(server);
928+
clientHost.writeMessage = this.server.onMessage.bind(this.server);
920929

921930
// Wire the client to the host to get notifications when a file is open
922931
// or edited.
@@ -930,5 +939,20 @@ namespace Harness.LanguageService {
930939
getLanguageService(): ts.LanguageService { return this.client; }
931940
getClassifier(): ts.Classifier { throw new Error("getClassifier is not available using the server interface."); }
932941
getPreProcessedFileInfo(): ts.PreProcessedFileInfo { throw new Error("getPreProcessedFileInfo is not available using the server interface."); }
942+
assertTextConsistent(fileName: string) {
943+
const serverText = this.server.getText(fileName);
944+
const clientText = this.host.readFile(fileName);
945+
ts.Debug.assert(serverText === clientText, [
946+
"Server and client text are inconsistent.",
947+
"",
948+
"\x1b[1mServer\x1b[0m\x1b[31m:",
949+
serverText,
950+
"",
951+
"\x1b[1mClient\x1b[0m\x1b[31m:",
952+
clientText,
953+
"",
954+
"This probably means something is wrong with the fourslash infrastructure, not with the test."
955+
].join(ts.sys.newLine));
956+
}
933957
}
934958
}

0 commit comments

Comments
 (0)