Create original project when location is in source of project reference redirect

This commit is contained in:
Sheetal Nandi 2019-06-26 15:57:22 -07:00
parent 2f30add809
commit da9260c013
7 changed files with 34 additions and 12 deletions

View File

@ -814,7 +814,7 @@ namespace ts {
let projectReferenceRedirects: Map<ResolvedProjectReference | false> | undefined;
let mapFromFileToProjectReferenceRedirects: Map<Path> | undefined;
let mapFromToProjectReferenceRedirectSource: Map<SourceOfProjectReferenceRedirect> | undefined;
const useSourceOfReference = host.useSourceInsteadOfReferenceRedirect && host.useSourceInsteadOfReferenceRedirect();
const useSourceOfReference = useSourceInsteadOfReferenceRedirect(host);
const shouldCreateNewSourceFile = shouldProgramCreateNewSourceFiles(oldProgram, options);
const structuralIsReused = tryReuseStructureFromOldProgram();

View File

@ -4614,6 +4614,10 @@ namespace ts {
return false;
}
}
export function useSourceInsteadOfReferenceRedirect(host: { useSourceInsteadOfReferenceRedirect?(): boolean; }) {
return host.useSourceInsteadOfReferenceRedirect && host.useSourceInsteadOfReferenceRedirect();
}
}
namespace ts {

View File

@ -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);

View File

@ -196,6 +196,14 @@ namespace ts.server {
/*@internal*/
originalConfiguredProjects: Map<true> | 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<any> | undefined) {
const host = this.projectService.host;

View File

@ -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;
}

View File

@ -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;

View File

@ -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 ", () => {