mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-17 01:49:57 -05:00
Merge branch 'master' into configFileDiag
This commit is contained in:
@@ -403,7 +403,7 @@ namespace ts.server {
|
||||
this.globalPlugins = opts.globalPlugins || emptyArray;
|
||||
this.pluginProbeLocations = opts.pluginProbeLocations || emptyArray;
|
||||
this.allowLocalPluginLoads = !!opts.allowLocalPluginLoads;
|
||||
this.typesMapLocation = (opts.typesMapLocation === undefined) ? combinePaths(this.host.getExecutingFilePath(), "../typesMap.json") : opts.typesMapLocation;
|
||||
this.typesMapLocation = (opts.typesMapLocation === undefined) ? combinePaths(this.getExecutingFilePath(), "../typesMap.json") : opts.typesMapLocation;
|
||||
|
||||
Debug.assert(!!this.host.createHash, "'ServerHost.createHash' is required for ProjectService");
|
||||
|
||||
@@ -431,6 +431,11 @@ namespace ts.server {
|
||||
this.watchFilePath = (host, file, cb, path, watchType, project) => ts.addFilePathWatcherWithLogging(host, file, cb, path, this.createWatcherLog(watchType, project));
|
||||
this.watchDirectory = (host, dir, cb, flags, watchType, project) => ts.addDirectoryWatcherWithLogging(host, dir, cb, flags, this.createWatcherLog(watchType, project));
|
||||
}
|
||||
else if (this.logger.loggingEnabled()) {
|
||||
this.watchFile = (host, file, cb, watchType, project) => ts.addFileWatcherWithOnlyTriggerLogging(host, file, cb, this.createWatcherLog(watchType, project));
|
||||
this.watchFilePath = (host, file, cb, path, watchType, project) => ts.addFilePathWatcherWithOnlyTriggerLogging(host, file, cb, path, this.createWatcherLog(watchType, project));
|
||||
this.watchDirectory = (host, dir, cb, flags, watchType, project) => ts.addDirectoryWatcherWithOnlyTriggerLogging(host, dir, cb, flags, this.createWatcherLog(watchType, project));
|
||||
}
|
||||
else {
|
||||
this.watchFile = ts.addFileWatcher;
|
||||
this.watchFilePath = ts.addFilePathWatcher;
|
||||
@@ -447,6 +452,16 @@ namespace ts.server {
|
||||
return toPath(fileName, this.currentDirectory, this.toCanonicalFileName);
|
||||
}
|
||||
|
||||
/*@internal*/
|
||||
getExecutingFilePath() {
|
||||
return this.getNormalizedAbsolutePath(this.host.getExecutingFilePath());
|
||||
}
|
||||
|
||||
/*@internal*/
|
||||
getNormalizedAbsolutePath(fileName: string) {
|
||||
return getNormalizedAbsolutePath(fileName, this.host.getCurrentDirectory());
|
||||
}
|
||||
|
||||
/* @internal */
|
||||
getChangedFiles_TestOnly() {
|
||||
return this.changedFiles;
|
||||
@@ -1624,12 +1639,13 @@ namespace ts.server {
|
||||
return this.inferredProjects[0];
|
||||
}
|
||||
|
||||
return this.createInferredProject(/*rootDirectoryForResolution*/ undefined, /*isSingleInferredProject*/ true);
|
||||
// Single inferred project does not have a project root and hence no current directory
|
||||
return this.createInferredProject(/*currentDirectory*/ undefined, /*isSingleInferredProject*/ true);
|
||||
}
|
||||
|
||||
private createInferredProject(rootDirectoryForResolution: string | undefined, isSingleInferredProject?: boolean, projectRootPath?: string): InferredProject {
|
||||
private createInferredProject(currentDirectory: string | undefined, isSingleInferredProject?: boolean, projectRootPath?: string): InferredProject {
|
||||
const compilerOptions = projectRootPath && this.compilerOptionsForInferredProjectsPerProjectRoot.get(projectRootPath) || this.compilerOptionsForInferredProjects;
|
||||
const project = new InferredProject(this, this.documentRegistry, compilerOptions, projectRootPath, rootDirectoryForResolution);
|
||||
const project = new InferredProject(this, this.documentRegistry, compilerOptions, projectRootPath, currentDirectory);
|
||||
if (isSingleInferredProject) {
|
||||
this.inferredProjects.unshift(project);
|
||||
}
|
||||
|
||||
@@ -195,6 +195,9 @@ namespace ts.server {
|
||||
return result.module;
|
||||
}
|
||||
|
||||
/*@internal*/
|
||||
readonly currentDirectory: string;
|
||||
|
||||
/*@internal*/
|
||||
constructor(
|
||||
/*@internal*/readonly projectName: string,
|
||||
@@ -206,7 +209,8 @@ namespace ts.server {
|
||||
private compilerOptions: CompilerOptions,
|
||||
public compileOnSaveEnabled: boolean,
|
||||
/*@internal*/public directoryStructureHost: DirectoryStructureHost,
|
||||
rootDirectoryForResolution: string | undefined) {
|
||||
currentDirectory: string | undefined) {
|
||||
this.currentDirectory = this.projectService.getNormalizedAbsolutePath(currentDirectory || "");
|
||||
|
||||
this.cancellationToken = new ThrottledCancellationToken(this.projectService.cancellationToken, this.projectService.throttleWaitMilliseconds);
|
||||
if (!this.compilerOptions) {
|
||||
@@ -230,7 +234,8 @@ namespace ts.server {
|
||||
}
|
||||
|
||||
this.languageService = createLanguageService(this, this.documentRegistry);
|
||||
this.resolutionCache = createResolutionCache(this, rootDirectoryForResolution);
|
||||
// Use the current directory as resolution root only if the project created using current directory string
|
||||
this.resolutionCache = createResolutionCache(this, currentDirectory && this.currentDirectory);
|
||||
if (!languageServiceEnabled) {
|
||||
this.disableLanguageService();
|
||||
}
|
||||
@@ -296,16 +301,16 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
getCancellationToken() {
|
||||
getCancellationToken(): HostCancellationToken {
|
||||
return this.cancellationToken;
|
||||
}
|
||||
|
||||
getCurrentDirectory(): string {
|
||||
return this.directoryStructureHost.getCurrentDirectory();
|
||||
return this.currentDirectory;
|
||||
}
|
||||
|
||||
getDefaultLibFileName() {
|
||||
const nodeModuleBinDir = getDirectoryPath(normalizePath(this.projectService.host.getExecutingFilePath()));
|
||||
const nodeModuleBinDir = getDirectoryPath(normalizePath(this.projectService.getExecutingFilePath()));
|
||||
return combinePaths(nodeModuleBinDir, getDefaultLibFileName(this.compilerOptions));
|
||||
}
|
||||
|
||||
@@ -448,9 +453,8 @@ namespace ts.server {
|
||||
this.ensureBuilder();
|
||||
const { emitSkipped, outputFiles } = this.builder.emitFile(this.program, scriptInfo.path);
|
||||
if (!emitSkipped) {
|
||||
const projectRootPath = this.getProjectRootPath();
|
||||
for (const outputFile of outputFiles) {
|
||||
const outputFileAbsoluteFileName = getNormalizedAbsolutePath(outputFile.name, projectRootPath ? projectRootPath : getDirectoryPath(scriptInfo.fileName));
|
||||
const outputFileAbsoluteFileName = getNormalizedAbsolutePath(outputFile.name, this.currentDirectory);
|
||||
writeFile(outputFileAbsoluteFileName, outputFile.text, outputFile.writeByteOrderMark);
|
||||
}
|
||||
}
|
||||
@@ -479,7 +483,6 @@ namespace ts.server {
|
||||
getProjectName() {
|
||||
return this.projectName;
|
||||
}
|
||||
abstract getProjectRootPath(): string | undefined;
|
||||
abstract getTypeAcquisition(): TypeAcquisition;
|
||||
|
||||
getExternalFiles(): SortedReadonlyArray<string> {
|
||||
@@ -561,7 +564,7 @@ namespace ts.server {
|
||||
return map(this.program.getSourceFiles(), sourceFile => {
|
||||
const scriptInfo = this.projectService.getScriptInfoForPath(sourceFile.path);
|
||||
if (!scriptInfo) {
|
||||
Debug.fail(`scriptInfo for a file '${sourceFile.fileName}' is missing.`);
|
||||
Debug.fail(`scriptInfo for a file '${sourceFile.fileName}' Path: '${sourceFile.path}' is missing.`);
|
||||
}
|
||||
return scriptInfo;
|
||||
});
|
||||
@@ -1042,8 +1045,8 @@ namespace ts.server {
|
||||
projectService: ProjectService,
|
||||
documentRegistry: DocumentRegistry,
|
||||
compilerOptions: CompilerOptions,
|
||||
public readonly projectRootPath: string | undefined,
|
||||
rootDirectoryForResolution: string | undefined) {
|
||||
readonly projectRootPath: string | undefined,
|
||||
currentDirectory: string | undefined) {
|
||||
super(InferredProject.newName(),
|
||||
ProjectKind.Inferred,
|
||||
projectService,
|
||||
@@ -1053,7 +1056,7 @@ namespace ts.server {
|
||||
compilerOptions,
|
||||
/*compileOnSaveEnabled*/ false,
|
||||
projectService.host,
|
||||
rootDirectoryForResolution);
|
||||
currentDirectory);
|
||||
}
|
||||
|
||||
addRoot(info: ScriptInfo) {
|
||||
@@ -1082,12 +1085,6 @@ namespace ts.server {
|
||||
this.getRootScriptInfos().length === 1;
|
||||
}
|
||||
|
||||
getProjectRootPath() {
|
||||
return this.projectRootPath ||
|
||||
// Single inferred project does not have a project root.
|
||||
!this.projectService.useSingleInferredProject && getDirectoryPath(this.getRootFiles()[0]);
|
||||
}
|
||||
|
||||
close() {
|
||||
forEach(this.getRootScriptInfos(), info => this.projectService.stopWatchingConfigFilesForInferredProjectRoot(info));
|
||||
super.close();
|
||||
@@ -1183,7 +1180,7 @@ namespace ts.server {
|
||||
|
||||
// Search our peer node_modules, then any globally-specified probe paths
|
||||
// ../../.. to walk from X/node_modules/typescript/lib/tsserver.js to X/node_modules/
|
||||
const searchPaths = [combinePaths(host.getExecutingFilePath(), "../../.."), ...this.projectService.pluginProbeLocations];
|
||||
const searchPaths = [combinePaths(this.projectService.getExecutingFilePath(), "../../.."), ...this.projectService.pluginProbeLocations];
|
||||
|
||||
if (this.projectService.allowLocalPluginLoads) {
|
||||
const local = getDirectoryPath(this.canonicalConfigFilePath);
|
||||
@@ -1263,10 +1260,6 @@ namespace ts.server {
|
||||
}
|
||||
}
|
||||
|
||||
getProjectRootPath() {
|
||||
return getDirectoryPath(this.getConfigFilePath());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the errors that dont have any file name associated
|
||||
*/
|
||||
@@ -1381,13 +1374,14 @@ namespace ts.server {
|
||||
compilerOptions: CompilerOptions,
|
||||
languageServiceEnabled: boolean,
|
||||
public compileOnSaveEnabled: boolean,
|
||||
private readonly projectFilePath?: string) {
|
||||
projectFilePath?: string) {
|
||||
super(externalProjectName,
|
||||
ProjectKind.External,
|
||||
projectService,
|
||||
documentRegistry,
|
||||
/*hasExplicitListOfFiles*/ true,
|
||||
languageServiceEnabled, compilerOptions,
|
||||
languageServiceEnabled,
|
||||
compilerOptions,
|
||||
compileOnSaveEnabled,
|
||||
projectService.host,
|
||||
getDirectoryPath(projectFilePath || normalizeSlashes(externalProjectName)));
|
||||
@@ -1397,16 +1391,6 @@ namespace ts.server {
|
||||
return this.excludedFiles;
|
||||
}
|
||||
|
||||
getProjectRootPath() {
|
||||
if (this.projectFilePath) {
|
||||
return getDirectoryPath(this.projectFilePath);
|
||||
}
|
||||
// if the projectFilePath is not given, we make the assumption that the project name
|
||||
// is the path of the project file. AS the project name is provided by VS, we need to
|
||||
// normalize slashes before using it as a file name.
|
||||
return getDirectoryPath(normalizeSlashes(this.getProjectName()));
|
||||
}
|
||||
|
||||
getTypeAcquisition() {
|
||||
return this.typeAcquisition;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user