diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 9a4e26a2903..2ddf191a327 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -814,7 +814,7 @@ namespace ts { let projectReferenceRedirects: Map | undefined; let mapFromFileToProjectReferenceRedirects: Map | undefined; let mapFromToProjectReferenceRedirectSource: Map | undefined; - const useSourceOfReference = host.useSourceInsteadOfReferenceRedirect && host.useSourceInsteadOfReferenceRedirect(); + const useSourceOfReference = useSourceInsteadOfReferenceRedirect(host); const shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options); const structuralIsReused = tryReuseStructureFromOldProgram(); diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 0e2488a0233..ecf7d431a2e 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -4614,6 +4614,10 @@ namespace ts { return false; } } + + export function useSourceInsteadOfReferenceRedirect(host: { useSourceInsteadOfReferenceRedirect?(): boolean; }) { + return host.useSourceInsteadOfReferenceRedirect && host.useSourceInsteadOfReferenceRedirect(); + } } namespace ts { diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 8c7462d857b..e379d1fda2c 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -2570,7 +2570,9 @@ namespace ts.server { /*@internal*/ getOriginalLocationEnsuringConfiguredProject(project: Project, location: DocumentPosition): DocumentPosition | undefined { - const originalLocation = project.getSourceMapper().tryGetSourcePosition(location); + const originalLocation = useSourceInsteadOfReferenceRedirect(project) && project.getResolvedProjectReferenceToRedirect(location.fileName) ? + location : + project.getSourceMapper().tryGetSourcePosition(location); if (!originalLocation) return undefined; const { fileName } = originalLocation; @@ -2581,7 +2583,8 @@ namespace ts.server { if (!configFileName) return undefined; const configuredProject = this.findConfiguredProjectByProjectName(configFileName) || - this.createAndLoadConfiguredProject(configFileName, `Creating project for original file: ${originalFileInfo.fileName} for location: ${location.fileName}`); + this.createAndLoadConfiguredProject(configFileName, `Creating project for original file: ${originalFileInfo.fileName}${location !== originalLocation ? " for location " + location.fileName : ""}`); + if (configuredProject === project) return originalLocation; updateProjectIfDirty(configuredProject); // Keep this configured project as referenced from project addOriginalConfiguredProject(configuredProject); diff --git a/src/server/project.ts b/src/server/project.ts index 8f8e6e5da8e..c6c8ab84b20 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -196,6 +196,14 @@ namespace ts.server { /*@internal*/ originalConfiguredProjects: Map | undefined; + /*@internal*/ + useSourceInsteadOfReferenceRedirect?: () => boolean; + + /*@internal*/ + getResolvedProjectReferenceToRedirect(_fileName: string): ResolvedProjectReference | undefined { + return undefined; + } + private readonly cancellationToken: ThrottledCancellationToken; public isNonTsProject() { @@ -1526,9 +1534,7 @@ namespace ts.server { } /* @internal */ - useSourceInsteadOfReferenceRedirect() { - return !!this.languageServiceEnabled; - } + useSourceInsteadOfReferenceRedirect = () => !!this.languageServiceEnabled; fileExists(file: string): boolean { // Project references go to source file instead of .d.ts file @@ -1590,6 +1596,12 @@ namespace ts.server { return program && program.forEachResolvedProjectReference(cb); } + /*@internal*/ + getResolvedProjectReferenceToRedirect(fileName: string): ResolvedProjectReference | undefined { + const program = this.getCurrentProgram(); + return program && program.getResolvedProjectReferenceToRedirect(fileName); + } + /*@internal*/ enablePluginsWithOptions(options: CompilerOptions, pluginConfigOverrides: Map | undefined) { const host = this.projectService.host; diff --git a/src/server/session.ts b/src/server/session.ts index 5064b529560..792ec2cbce9 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -443,7 +443,9 @@ namespace ts.server { function getDefinitionInProject(definition: DocumentPosition | undefined, definingProject: Project, project: Project): DocumentPosition | undefined { if (!definition || project.containsFile(toNormalizedPath(definition.fileName))) return definition; - const mappedDefinition = definingProject.getLanguageService().getSourceMapper().tryGetGeneratedPosition(definition); + const mappedDefinition = useSourceInsteadOfReferenceRedirect(definingProject) && definingProject.getResolvedProjectReferenceToRedirect(definition.fileName) ? + definition : + definingProject.getLanguageService().getSourceMapper().tryGetGeneratedPosition(definition); return mappedDefinition && project.containsFile(toNormalizedPath(mappedDefinition.fileName)) ? mappedDefinition : undefined; } @@ -472,7 +474,7 @@ namespace ts.server { for (const symlinkedProject of symlinkedProjects) addToTodo({ project: symlinkedProject, location: originalLocation as TLocation }, toDo!, seenProjects); }); } - return originalLocation; + return originalLocation === location ? undefined : originalLocation; }); return toDo; } diff --git a/src/services/sourcemaps.ts b/src/services/sourcemaps.ts index de590d4e5b4..c4c14e58686 100644 --- a/src/services/sourcemaps.ts +++ b/src/services/sourcemaps.ts @@ -72,9 +72,10 @@ namespace ts { const program = host.getProgram()!; // If this is source file of project reference source (instead of redirect) there is no generated position - if (host.useSourceInsteadOfReferenceRedirect && - host.useSourceInsteadOfReferenceRedirect() && - program.getResolvedProjectReferenceToRedirect(sourceFile.fileName)) return undefined; + if (useSourceInsteadOfReferenceRedirect(host) && + program.getResolvedProjectReferenceToRedirect(sourceFile.fileName)) { + return undefined; + } const options = program.getCompilerOptions(); const outPath = options.outFile || options.out; diff --git a/src/testRunner/unittests/tsserver/events/projectLoading.ts b/src/testRunner/unittests/tsserver/events/projectLoading.ts index 7a881ff1380..53fe28240f8 100644 --- a/src/testRunner/unittests/tsserver/events/projectLoading.ts +++ b/src/testRunner/unittests/tsserver/events/projectLoading.ts @@ -110,7 +110,7 @@ namespace ts.projectSystem { checkNumberOfProjects(service, { configuredProjects: 2 }); const project = service.configuredProjects.get(configA.path)!; assert.isDefined(project); - verifyEvent(project, `Creating project for original file: ${aTs.path} for location: ${aDTs.path}`); + verifyEvent(project, `Creating project for original file: ${aTs.path}`); }); describe("with external projects and config files ", () => {