Skip to content

Commit d736db3

Browse files
committed
add typingOptions to the protocol.ExternalProject
1 parent aff4556 commit d736db3

6 files changed

Lines changed: 63 additions & 22 deletions

File tree

src/compiler/commandLineParser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ namespace ts {
876876
return { options, errors };
877877
}
878878

879-
export function convertTypingOptionsFromJson(jsonOptions: any, basePath: string, configFileName?: string): { options: CompilerOptions, errors: Diagnostic[] } {
879+
export function convertTypingOptionsFromJson(jsonOptions: any, basePath: string, configFileName?: string): { options: TypingOptions, errors: Diagnostic[] } {
880880
const errors: Diagnostic[] = [];
881881
const options = convertTypingOptionsFromJsonWorker(jsonOptions, basePath, errors, configFileName);
882882
return { options, errors };

src/server/editorServices.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -704,12 +704,13 @@ namespace ts.server {
704704
return false;
705705
}
706706

707-
private createAndAddExternalProject(projectFileName: string, files: protocol.ExternalFile[], compilerOptions: CompilerOptions) {
707+
private createAndAddExternalProject(projectFileName: string, files: protocol.ExternalFile[], compilerOptions: CompilerOptions, typingOptions: TypingOptions) {
708708
const project = new ExternalProject(
709709
projectFileName,
710710
this,
711711
this.documentRegistry,
712712
compilerOptions,
713+
typingOptions,
713714
/*languageServiceEnabled*/ !this.exceededTotalSizeLimitForNonTsFiles(compilerOptions, files, externalFilePropertyReader));
714715

715716
const errors = this.addFilesToProjectAndUpdateGraph(project, files, externalFilePropertyReader, /*clientFileName*/ undefined);
@@ -774,7 +775,7 @@ namespace ts.server {
774775
return { success: true, project, errors };
775776
}
776777

777-
private updateNonInferredProject<T>(project: ExternalProject | ConfiguredProject, newUncheckedFiles: T[], propertyReader: FilePropertyReader<T>, newOptions: CompilerOptions) {
778+
private updateNonInferredProject<T>(project: ExternalProject | ConfiguredProject, newUncheckedFiles: T[], propertyReader: FilePropertyReader<T>, newOptions: CompilerOptions, newTypingOptions: TypingOptions) {
778779
const oldRootScriptInfos = project.getRootScriptInfos();
779780
const newRootScriptInfos: ScriptInfo[] = [];
780781
const newRootScriptInfoMap: NormalizedPathMap<ScriptInfo> = createNormalizedPathMap<ScriptInfo>();
@@ -834,6 +835,7 @@ namespace ts.server {
834835
}
835836

836837
project.setCompilerOptions(newOptions);
838+
(<ExternalProject | ConfiguredProject>project).setTypingOptions(newTypingOptions);
837839
project.updateGraph();
838840
}
839841

@@ -863,7 +865,7 @@ namespace ts.server {
863865
project.enableLanguageService();
864866
}
865867
this.watchConfigDirectoryForProject(project, projectOptions);
866-
this.updateNonInferredProject(project, projectOptions.files, fileNamePropertyReader, projectOptions.compilerOptions);
868+
this.updateNonInferredProject(project, projectOptions.files, fileNamePropertyReader, projectOptions.compilerOptions, projectOptions.typingOptions);
867869
}
868870
}
869871

@@ -1133,7 +1135,7 @@ namespace ts.server {
11331135
openExternalProject(proj: protocol.ExternalProject): void {
11341136
const externalProject = this.findExternalProjectByProjectName(proj.projectFileName);
11351137
if (externalProject) {
1136-
this.updateNonInferredProject(externalProject, proj.rootFiles, externalFilePropertyReader, proj.options);
1138+
this.updateNonInferredProject(externalProject, proj.rootFiles, externalFilePropertyReader, proj.options, proj.typingOptions);
11371139
return;
11381140
}
11391141

@@ -1165,7 +1167,7 @@ namespace ts.server {
11651167
}
11661168
}
11671169
else {
1168-
this.createAndAddExternalProject(proj.projectFileName, rootFiles, proj.options);
1170+
this.createAndAddExternalProject(proj.projectFileName, rootFiles, proj.options, proj.typingOptions);
11691171
}
11701172
}
11711173
}

src/server/project.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ namespace ts.server {
1919
}
2020
}
2121

22+
const jsOrDts = [".js", ".d.ts"];
23+
24+
export function allFilesAreJsOrDts(project: Project): boolean {
25+
return project.getFileNames().every(f => fileExtensionIsAny(f, jsOrDts));
26+
}
27+
2228
export abstract class Project {
2329
private rootFiles: ScriptInfo[] = [];
2430
private rootFilesMap: FileMap<ScriptInfo> = createFileMap<ScriptInfo>();
@@ -103,6 +109,7 @@ namespace ts.server {
103109
}
104110

105111
abstract getProjectName(): string;
112+
abstract getTypingOptions(): TypingOptions;
106113

107114
close() {
108115
if (this.program) {
@@ -414,6 +421,14 @@ namespace ts.server {
414421
this.projectService.stopWatchingDirectory(directory);
415422
}
416423
}
424+
425+
getTypingOptions(): TypingOptions {
426+
return {
427+
enableAutoDiscovery: allFilesAreJsOrDts(this),
428+
include: [],
429+
exclude: []
430+
};
431+
}
417432
}
418433

419434
export class ConfiguredProject extends Project {
@@ -434,6 +449,10 @@ namespace ts.server {
434449
super(ProjectKind.Configured, projectService, documentRegistry, hasExplicitListOfFiles, languageServiceEnabled, compilerOptions);
435450
}
436451

452+
setTypingOptions(newTypingOptions: TypingOptions): void {
453+
this.typingOptions = newTypingOptions;
454+
}
455+
437456
getTypingOptions() {
438457
return this.typingOptions;
439458
}
@@ -508,12 +527,43 @@ namespace ts.server {
508527
}
509528

510529
export class ExternalProject extends Project {
530+
private typingOptions: TypingOptions;
511531
constructor(readonly externalProjectName: string,
512532
projectService: ProjectService,
513533
documentRegistry: ts.DocumentRegistry,
514534
compilerOptions: CompilerOptions,
535+
typingOptions: TypingOptions,
515536
languageServiceEnabled: boolean) {
516537
super(ProjectKind.External, projectService, documentRegistry, /*hasExplicitListOfFiles*/ true, languageServiceEnabled, compilerOptions);
538+
this.setTypingOptions(typingOptions);
539+
}
540+
541+
getTypingOptions() {
542+
return this.typingOptions;
543+
}
544+
545+
setTypingOptions(newTypingOptions: TypingOptions): void {
546+
if (!newTypingOptions) {
547+
// set default typings options
548+
newTypingOptions = {
549+
enableAutoDiscovery: allFilesAreJsOrDts(this),
550+
include: [],
551+
exclude: []
552+
};
553+
}
554+
else {
555+
if (newTypingOptions.enableAutoDiscovery === undefined) {
556+
// if autoDiscovery was not specified by the caller - set it based on the content of the project
557+
newTypingOptions.enableAutoDiscovery = allFilesAreJsOrDts(this);
558+
}
559+
if (!newTypingOptions.include) {
560+
newTypingOptions.include = [];
561+
}
562+
if (!newTypingOptions.exclude) {
563+
newTypingOptions.exclude = [];
564+
}
565+
}
566+
this.typingOptions = newTypingOptions;
517567
}
518568

519569
getProjectName() {

src/server/protocol.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,7 @@ declare namespace ts.server.protocol {
499499
projectFileName: string;
500500
rootFiles: ExternalFile[];
501501
options: CompilerOptions;
502+
typingOptions?: TypingOptions;
502503
}
503504

504505
export interface ProjectVersionInfo {

src/server/typingsCache.ts

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,6 @@ namespace ts.server {
2020
poisoned: boolean;
2121
}
2222

23-
const emptyArray: any[] = [];
24-
const jsOrDts = [".js", ".d.ts"];
25-
26-
function getTypingOptionsForProjects(proj: Project): TypingOptions {
27-
if (proj.projectKind === ProjectKind.Configured) {
28-
return (<ConfiguredProject>proj).getTypingOptions();
29-
}
30-
31-
const enableAutoDiscovery = proj.getFileNames().every(f => fileExtensionIsAny(f, jsOrDts));
32-
33-
// TODO: add .d.ts files to excludes
34-
return { enableAutoDiscovery, include: emptyArray, exclude: emptyArray };
35-
}
36-
3723
function setIsEqualTo(arr1: string[], arr2: string[]): boolean {
3824
if (arr1 === arr2) {
3925
return true;
@@ -89,7 +75,7 @@ namespace ts.server {
8975
}
9076

9177
getTypingsForProject(project: Project): TypingsArray {
92-
const typingOptions = getTypingOptionsForProjects(project);
78+
const typingOptions = project.getTypingOptions();
9379

9480
if (!typingOptions.enableAutoDiscovery) {
9581
return <any>emptyArray;
@@ -113,7 +99,7 @@ namespace ts.server {
11399
}
114100

115101
invalidateCachedTypingsForProject(project: Project) {
116-
const typingOptions = getTypingOptionsForProjects(project);
102+
const typingOptions = project.getTypingOptions();
117103
if (!typingOptions.enableAutoDiscovery) {
118104
return;
119105
}

src/server/utilities.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ namespace ts.server {
88
verbose
99
}
1010

11+
export const emptyArray: ReadonlyArray<any> = [];
12+
1113
export interface Logger {
1214
close(): void;
1315
hasLevel(level: LogLevel): boolean;

0 commit comments

Comments
 (0)