Skip to content

Commit f047111

Browse files
author
Ben Lichtman
committed
Track changes to redirect info
1 parent 7036853 commit f047111

File tree

2 files changed

+70
-22
lines changed

2 files changed

+70
-22
lines changed

src/server/project.ts

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ namespace ts.server {
167167
/**
168168
* Set of files that was returned from the last call to getChangesSinceVersion.
169169
*/
170-
private lastReportedFileNames: Map<true> | undefined;
170+
private lastReportedFileNames: Map<boolean> | undefined;
171171
/**
172172
* Last version that was reported.
173173
*/
@@ -803,6 +803,22 @@ namespace ts.server {
803803
return result;
804804
}
805805

806+
/* @internal */
807+
getFileNamesWithRedirectInfo(includeProjectReferenceRedirectInfo: boolean) {
808+
const fileNames = this.getFileNames();
809+
if (includeProjectReferenceRedirectInfo) {
810+
return fileNames.map((fileName): protocol.FileWithProjectReferenceRedirectInfo => ({
811+
fileName,
812+
isSourceOfProjectReferenceRedirect: this.isSourceOfProjectReferenceRedirect(fileName)
813+
}));
814+
}
815+
816+
return fileNames.map((fileName): protocol.FileWithProjectReferenceRedirectInfo => ({
817+
fileName,
818+
isSourceOfProjectReferenceRedirect: false
819+
}));
820+
}
821+
806822
hasConfigFile(configFilePath: NormalizedPath) {
807823
if (this.program && this.languageServiceEnabled) {
808824
const configFile = this.program.getCompilerOptions().configFile;
@@ -1301,16 +1317,13 @@ namespace ts.server {
13011317

13021318
/* @internal */
13031319
getChangesSinceVersion(lastKnownVersion?: number, includeProjectReferenceRedirectInfo?: boolean): ProjectFilesWithTSDiagnostics {
1304-
const includeProjectReferenceRedirectInfoIfRequested = (files: string[]) => {
1305-
if (includeProjectReferenceRedirectInfo) {
1306-
return files.map((fileName: string): protocol.FileWithProjectReferenceRedirectInfo => ({
1320+
const includeProjectReferenceRedirectInfoIfRequested =
1321+
includeProjectReferenceRedirectInfo
1322+
? (files: Map<boolean>) => arrayFrom(files.keys(), (fileName: string): protocol.FileWithProjectReferenceRedirectInfo => ({
13071323
fileName,
1308-
isSourceOfProjectReferenceRedirect: this.program?.isSourceOfProjectReferenceRedirect(fileName) ?? false
1309-
}));
1310-
}
1311-
1312-
return files;
1313-
};
1324+
isSourceOfProjectReferenceRedirect: files.get(fileName)! // fileName guaranteed to be in files
1325+
}))
1326+
: (files: Map<boolean>) => arrayFrom(files.keys());
13141327

13151328
// Update the graph only if initial configured project load is not pending
13161329
if (!this.isInitialLoadPending()) {
@@ -1335,21 +1348,36 @@ namespace ts.server {
13351348
}
13361349
// compute and return the difference
13371350
const lastReportedFileNames = this.lastReportedFileNames;
1338-
const externalFiles = this.getExternalFiles().map(f => toNormalizedPath(f));
1339-
const currentFiles = arrayToSet(this.getFileNames().concat(externalFiles));
1351+
const externalFiles = this.getExternalFiles().map((f): protocol.FileWithProjectReferenceRedirectInfo => ({
1352+
fileName: toNormalizedPath(f),
1353+
isSourceOfProjectReferenceRedirect: false
1354+
}));
1355+
const currentFiles = arrayToMap(
1356+
this.getFileNamesWithRedirectInfo(!!includeProjectReferenceRedirectInfo).concat(externalFiles),
1357+
info => info.fileName,
1358+
info => info.isSourceOfProjectReferenceRedirect
1359+
);
1360+
1361+
const added: Map<boolean> = new Map<boolean>();
1362+
const removed: Map<boolean> = new Map<boolean>();
13401363

1341-
const added: string[] = [];
1342-
const removed: string[] = [];
13431364
const updated: string[] = updatedFileNames ? arrayFrom(updatedFileNames.keys()) : [];
1365+
const updatedRedirects: protocol.FileWithProjectReferenceRedirectInfo[] = [];
13441366

13451367
forEachKey(currentFiles, id => {
13461368
if (!lastReportedFileNames.has(id)) {
1347-
added.push(id);
1369+
added.set(id, currentFiles.get(id)!); // id guaranteed to be in currentFiles
1370+
}
1371+
else if (includeProjectReferenceRedirectInfo && lastReportedFileNames.get(id) !== currentFiles.get(id)){
1372+
updatedRedirects.push({
1373+
fileName: id,
1374+
isSourceOfProjectReferenceRedirect: currentFiles.get(id)! // id guaranteed to be in currentFiles
1375+
});
13481376
}
13491377
});
13501378
forEachKey(lastReportedFileNames, id => {
13511379
if (!currentFiles.has(id)) {
1352-
removed.push(id);
1380+
removed.set(id, lastReportedFileNames.get(id)!); // id guaranteed to be in lastReportedFileNames
13531381
}
13541382
});
13551383
this.lastReportedFileNames = currentFiles;
@@ -1359,21 +1387,34 @@ namespace ts.server {
13591387
changes: {
13601388
added: includeProjectReferenceRedirectInfoIfRequested(added),
13611389
removed: includeProjectReferenceRedirectInfoIfRequested(removed),
1362-
updated: includeProjectReferenceRedirectInfoIfRequested(updated)
1390+
updated: includeProjectReferenceRedirectInfoIfRequested
1391+
? updated.map((fileName): protocol.FileWithProjectReferenceRedirectInfo => ({
1392+
fileName,
1393+
isSourceOfProjectReferenceRedirect: this.isSourceOfProjectReferenceRedirect(fileName)
1394+
}))
1395+
: updated,
1396+
updatedRedirects: includeProjectReferenceRedirectInfo ? updatedRedirects : undefined
13631397
},
13641398
projectErrors: this.getGlobalProjectErrors()
13651399
};
13661400
}
13671401
else {
13681402
// unknown version - return everything
1369-
const projectFileNames = this.getFileNames();
1370-
const externalFiles = this.getExternalFiles().map(f => toNormalizedPath(f));
1403+
const projectFileNames = this.getFileNamesWithRedirectInfo(!!includeProjectReferenceRedirectInfo);
1404+
const externalFiles = this.getExternalFiles().map((f): protocol.FileWithProjectReferenceRedirectInfo => ({
1405+
fileName: toNormalizedPath(f),
1406+
isSourceOfProjectReferenceRedirect: false
1407+
}));
13711408
const allFiles = projectFileNames.concat(externalFiles);
1372-
this.lastReportedFileNames = arrayToSet(allFiles);
1409+
this.lastReportedFileNames = arrayToMap(
1410+
projectFileNames.concat(externalFiles),
1411+
info => info.fileName,
1412+
info => info.isSourceOfProjectReferenceRedirect
1413+
);
13731414
this.lastReportedVersion = this.projectProgramVersion;
13741415
return {
13751416
info,
1376-
files: includeProjectReferenceRedirectInfoIfRequested(allFiles),
1417+
files: includeProjectReferenceRedirectInfo ? allFiles : allFiles.map(f => f.fileName),
13771418
projectErrors: this.getGlobalProjectErrors()
13781419
};
13791420
}

src/server/protocol.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1352,6 +1352,11 @@ namespace ts.server.protocol {
13521352
* List of updated files
13531353
*/
13541354
updated: string[] | FileWithProjectReferenceRedirectInfo[];
1355+
/**
1356+
* List of files that have had their project reference redirect status updated
1357+
* Only provided when the synchronizeProjectList request has includeProjectReferenceRedirectInfo set to true
1358+
*/
1359+
updatedRedirects?: FileWithProjectReferenceRedirectInfo[];
13551360
}
13561361

13571362
/**
@@ -1369,6 +1374,8 @@ namespace ts.server.protocol {
13691374
info?: ProjectVersionInfo;
13701375
/**
13711376
* List of files in project (might be omitted if current state of project can be computed using only information from 'changes')
1377+
* This property will have type FileWithProjectReferenceRedirectInfo[] if includeProjectReferenceRedirectInfo is set to true in
1378+
* the corresponding SynchronizeProjectList request; otherwise, it will have type string[].
13721379
*/
13731380
files?: string[] | FileWithProjectReferenceRedirectInfo[];
13741381
/**
@@ -1635,7 +1642,7 @@ namespace ts.server.protocol {
16351642
knownProjects: ProjectVersionInfo[];
16361643
/**
16371644
* If true, response specifies whether or not each file in each project
1638-
* is the result of a project reference redirect
1645+
* is a source from a project reference redirect
16391646
*/
16401647
includeProjectReferenceRedirectInfo?: boolean;
16411648
}

0 commit comments

Comments
 (0)