Skip to content

Commit da9260c

Browse files
committed
Create original project when location is in source of project reference redirect
1 parent 2f30add commit da9260c

File tree

7 files changed

+34
-12
lines changed

7 files changed

+34
-12
lines changed

src/compiler/program.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ namespace ts {
814814
let projectReferenceRedirects: Map<ResolvedProjectReference | false> | undefined;
815815
let mapFromFileToProjectReferenceRedirects: Map<Path> | undefined;
816816
let mapFromToProjectReferenceRedirectSource: Map<SourceOfProjectReferenceRedirect> | undefined;
817-
const useSourceOfReference = host.useSourceInsteadOfReferenceRedirect && host.useSourceInsteadOfReferenceRedirect();
817+
const useSourceOfReference = useSourceInsteadOfReferenceRedirect(host);
818818

819819
const shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options);
820820
const structuralIsReused = tryReuseStructureFromOldProgram();

src/compiler/utilities.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4614,6 +4614,10 @@ namespace ts {
46144614
return false;
46154615
}
46164616
}
4617+
4618+
export function useSourceInsteadOfReferenceRedirect(host: { useSourceInsteadOfReferenceRedirect?(): boolean; }) {
4619+
return host.useSourceInsteadOfReferenceRedirect && host.useSourceInsteadOfReferenceRedirect();
4620+
}
46174621
}
46184622

46194623
namespace ts {

src/server/editorServices.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2570,7 +2570,9 @@ namespace ts.server {
25702570

25712571
/*@internal*/
25722572
getOriginalLocationEnsuringConfiguredProject(project: Project, location: DocumentPosition): DocumentPosition | undefined {
2573-
const originalLocation = project.getSourceMapper().tryGetSourcePosition(location);
2573+
const originalLocation = useSourceInsteadOfReferenceRedirect(project) && project.getResolvedProjectReferenceToRedirect(location.fileName) ?
2574+
location :
2575+
project.getSourceMapper().tryGetSourcePosition(location);
25742576
if (!originalLocation) return undefined;
25752577

25762578
const { fileName } = originalLocation;
@@ -2581,7 +2583,8 @@ namespace ts.server {
25812583
if (!configFileName) return undefined;
25822584

25832585
const configuredProject = this.findConfiguredProjectByProjectName(configFileName) ||
2584-
this.createAndLoadConfiguredProject(configFileName, `Creating project for original file: ${originalFileInfo.fileName} for location: ${location.fileName}`);
2586+
this.createAndLoadConfiguredProject(configFileName, `Creating project for original file: ${originalFileInfo.fileName}${location !== originalLocation ? " for location " + location.fileName : ""}`);
2587+
if (configuredProject === project) return originalLocation;
25852588
updateProjectIfDirty(configuredProject);
25862589
// Keep this configured project as referenced from project
25872590
addOriginalConfiguredProject(configuredProject);

src/server/project.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,14 @@ namespace ts.server {
196196
/*@internal*/
197197
originalConfiguredProjects: Map<true> | undefined;
198198

199+
/*@internal*/
200+
useSourceInsteadOfReferenceRedirect?: () => boolean;
201+
202+
/*@internal*/
203+
getResolvedProjectReferenceToRedirect(_fileName: string): ResolvedProjectReference | undefined {
204+
return undefined;
205+
}
206+
199207
private readonly cancellationToken: ThrottledCancellationToken;
200208

201209
public isNonTsProject() {
@@ -1526,9 +1534,7 @@ namespace ts.server {
15261534
}
15271535

15281536
/* @internal */
1529-
useSourceInsteadOfReferenceRedirect() {
1530-
return !!this.languageServiceEnabled;
1531-
}
1537+
useSourceInsteadOfReferenceRedirect = () => !!this.languageServiceEnabled;
15321538

15331539
fileExists(file: string): boolean {
15341540
// Project references go to source file instead of .d.ts file
@@ -1590,6 +1596,12 @@ namespace ts.server {
15901596
return program && program.forEachResolvedProjectReference(cb);
15911597
}
15921598

1599+
/*@internal*/
1600+
getResolvedProjectReferenceToRedirect(fileName: string): ResolvedProjectReference | undefined {
1601+
const program = this.getCurrentProgram();
1602+
return program && program.getResolvedProjectReferenceToRedirect(fileName);
1603+
}
1604+
15931605
/*@internal*/
15941606
enablePluginsWithOptions(options: CompilerOptions, pluginConfigOverrides: Map<any> | undefined) {
15951607
const host = this.projectService.host;

src/server/session.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,9 @@ namespace ts.server {
443443

444444
function getDefinitionInProject(definition: DocumentPosition | undefined, definingProject: Project, project: Project): DocumentPosition | undefined {
445445
if (!definition || project.containsFile(toNormalizedPath(definition.fileName))) return definition;
446-
const mappedDefinition = definingProject.getLanguageService().getSourceMapper().tryGetGeneratedPosition(definition);
446+
const mappedDefinition = useSourceInsteadOfReferenceRedirect(definingProject) && definingProject.getResolvedProjectReferenceToRedirect(definition.fileName) ?
447+
definition :
448+
definingProject.getLanguageService().getSourceMapper().tryGetGeneratedPosition(definition);
447449
return mappedDefinition && project.containsFile(toNormalizedPath(mappedDefinition.fileName)) ? mappedDefinition : undefined;
448450
}
449451

@@ -472,7 +474,7 @@ namespace ts.server {
472474
for (const symlinkedProject of symlinkedProjects) addToTodo({ project: symlinkedProject, location: originalLocation as TLocation }, toDo!, seenProjects);
473475
});
474476
}
475-
return originalLocation;
477+
return originalLocation === location ? undefined : originalLocation;
476478
});
477479
return toDo;
478480
}

src/services/sourcemaps.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,10 @@ namespace ts {
7272

7373
const program = host.getProgram()!;
7474
// If this is source file of project reference source (instead of redirect) there is no generated position
75-
if (host.useSourceInsteadOfReferenceRedirect &&
76-
host.useSourceInsteadOfReferenceRedirect() &&
77-
program.getResolvedProjectReferenceToRedirect(sourceFile.fileName)) return undefined;
75+
if (useSourceInsteadOfReferenceRedirect(host) &&
76+
program.getResolvedProjectReferenceToRedirect(sourceFile.fileName)) {
77+
return undefined;
78+
}
7879

7980
const options = program.getCompilerOptions();
8081
const outPath = options.outFile || options.out;

src/testRunner/unittests/tsserver/events/projectLoading.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ namespace ts.projectSystem {
110110
checkNumberOfProjects(service, { configuredProjects: 2 });
111111
const project = service.configuredProjects.get(configA.path)!;
112112
assert.isDefined(project);
113-
verifyEvent(project, `Creating project for original file: ${aTs.path} for location: ${aDTs.path}`);
113+
verifyEvent(project, `Creating project for original file: ${aTs.path}`);
114114
});
115115

116116
describe("with external projects and config files ", () => {

0 commit comments

Comments
 (0)