Skip to content

Commit 7b018ef

Browse files
committed
lazyConfiguredProjectsFromExternalProject as userpreference instead of command line option
1 parent 96e6140 commit 7b018ef

File tree

7 files changed

+75
-14
lines changed

7 files changed

+75
-14
lines changed

src/server/editorServices.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,6 @@ namespace ts.server {
323323
cancellationToken: HostCancellationToken;
324324
useSingleInferredProject: boolean;
325325
useInferredProjectPerProjectRoot: boolean;
326-
lazyConfiguredProjectsFromExternalProject?: boolean;
327326
typingsInstaller: ITypingsInstaller;
328327
eventHandler?: ProjectServiceEventHandler;
329328
suppressDiagnosticEvents?: boolean;
@@ -441,7 +440,6 @@ namespace ts.server {
441440
public readonly cancellationToken: HostCancellationToken;
442441
public readonly useSingleInferredProject: boolean;
443442
public readonly useInferredProjectPerProjectRoot: boolean;
444-
private readonly lazyConfiguredProjectsFromExternalProject?: boolean;
445443
public readonly typingsInstaller: ITypingsInstaller;
446444
private readonly globalCacheLocationDirectoryPath: Path | undefined;
447445
public readonly throttleWaitMilliseconds?: number;
@@ -467,7 +465,6 @@ namespace ts.server {
467465
this.cancellationToken = opts.cancellationToken;
468466
this.useSingleInferredProject = opts.useSingleInferredProject;
469467
this.useInferredProjectPerProjectRoot = opts.useInferredProjectPerProjectRoot;
470-
this.lazyConfiguredProjectsFromExternalProject = opts.lazyConfiguredProjectsFromExternalProject;
471468
this.typingsInstaller = opts.typingsInstaller || nullTypingsInstaller;
472469
this.throttleWaitMilliseconds = opts.throttleWaitMilliseconds;
473470
this.eventHandler = opts.eventHandler;
@@ -1989,7 +1986,19 @@ namespace ts.server {
19891986
this.logger.info("Format host information updated");
19901987
}
19911988
if (args.preferences) {
1989+
const { lazyConfiguredProjectsFromExternalProject } = this.hostConfiguration.preferences;
19921990
this.hostConfiguration.preferences = { ...this.hostConfiguration.preferences, ...args.preferences };
1991+
if (lazyConfiguredProjectsFromExternalProject && !this.hostConfiguration.preferences.lazyConfiguredProjectsFromExternalProject) {
1992+
// Load configured projects for external projects that are pending reload
1993+
this.configuredProjects.forEach(project => {
1994+
if (project.hasExternalProjectRef() &&
1995+
project.pendingReload === ConfigFileProgramReloadLevel.Full &&
1996+
!this.pendingProjectUpdates.has(project.getProjectName())) {
1997+
this.loadConfiguredProject(project);
1998+
project.updateGraph();
1999+
}
2000+
});
2001+
}
19932002
}
19942003
if (args.extraFileExtensions) {
19952004
this.hostConfiguration.extraFileExtensions = args.extraFileExtensions;
@@ -2642,7 +2651,7 @@ namespace ts.server {
26422651
let project = this.findConfiguredProjectByProjectName(tsconfigFile);
26432652
if (!project) {
26442653
// errors are stored in the project, do not need to update the graph
2645-
project = this.lazyConfiguredProjectsFromExternalProject ?
2654+
project = this.getHostPreferences().lazyConfiguredProjectsFromExternalProject ?
26462655
this.createConfiguredProjectWithDelayLoad(tsconfigFile) :
26472656
this.createLoadAndUpdateConfiguredProject(tsconfigFile);
26482657
}

src/server/project.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1520,6 +1520,11 @@ namespace ts.server {
15201520
) || false;
15211521
}
15221522

1523+
/*@internal*/
1524+
hasExternalProjectRef() {
1525+
return !!this.externalProjectRefCount;
1526+
}
1527+
15231528
getEffectiveTypeRoots() {
15241529
return getEffectiveTypeRoots(this.getCompilationSettings(), this.directoryStructureHost) || [];
15251530
}

src/server/protocol.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2823,6 +2823,7 @@ namespace ts.server.protocol {
28232823
readonly includeCompletionsWithInsertText?: boolean;
28242824
readonly importModuleSpecifierPreference?: "relative" | "non-relative";
28252825
readonly allowTextChangesInNewFiles?: boolean;
2826+
readonly lazyConfiguredProjectsFromExternalProject?: boolean;
28262827
}
28272828

28282829
export interface CompilerOptions {

src/server/session.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,6 @@ namespace ts.server {
465465
cancellationToken: ServerCancellationToken;
466466
useSingleInferredProject: boolean;
467467
useInferredProjectPerProjectRoot: boolean;
468-
lazyConfiguredProjectsFromExternalProject?: boolean;
469468
typingsInstaller: ITypingsInstaller;
470469
byteLength: (buf: string, encoding?: string) => number;
471470
hrtime: (start?: number[]) => number[];
@@ -537,7 +536,6 @@ namespace ts.server {
537536
cancellationToken: this.cancellationToken,
538537
useSingleInferredProject: opts.useSingleInferredProject,
539538
useInferredProjectPerProjectRoot: opts.useInferredProjectPerProjectRoot,
540-
lazyConfiguredProjectsFromExternalProject: opts.lazyConfiguredProjectsFromExternalProject,
541539
typingsInstaller: this.typingsInstaller,
542540
throttleWaitMilliseconds,
543541
eventHandler: this.eventHandler,

src/services/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ namespace ts {
240240
readonly includeCompletionsWithInsertText?: boolean;
241241
readonly importModuleSpecifierPreference?: "relative" | "non-relative";
242242
readonly allowTextChangesInNewFiles?: boolean;
243+
readonly lazyConfiguredProjectsFromExternalProject?: boolean;
243244
}
244245
/* @internal */
245246
export const emptyOptions = {};

src/testRunner/unittests/tsserverProjectSystem.ts

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -656,7 +656,8 @@ namespace ts.projectSystem {
656656
};
657657

658658
const host = createServerHost([f1, config], { useCaseSensitiveFileNames: false });
659-
const service = createProjectService(host, /*parameters*/ undefined, { lazyConfiguredProjectsFromExternalProject });
659+
const service = createProjectService(host);
660+
service.setHostConfiguration({ preferences: { lazyConfiguredProjectsFromExternalProject } });
660661
const upperCaseConfigFilePath = combinePaths(getDirectoryPath(config.path).toUpperCase(), getBaseFileName(config.path));
661662
service.openExternalProject(<protocol.ExternalProject>{
662663
projectFileName: "/a/b/project.csproj",
@@ -670,7 +671,7 @@ namespace ts.projectSystem {
670671
checkProjectActualFiles(project, emptyArray);
671672
}
672673
else {
673-
assert.equal(project.pendingReload, ConfigFileProgramReloadLevel.None); // External project referenced configured project pending to be reloaded
674+
assert.equal(project.pendingReload, ConfigFileProgramReloadLevel.None); // External project referenced configured project loaded
674675
checkProjectActualFiles(project, [upperCaseConfigFilePath]);
675676
}
676677

@@ -2978,7 +2979,8 @@ namespace ts.projectSystem {
29782979
};
29792980
const projectFileName = "/user/someuser/project/WebApplication6.csproj";
29802981
const host = createServerHost([libFile, site, configFile]);
2981-
const projectService = createProjectService(host, /*parameters*/ undefined, { lazyConfiguredProjectsFromExternalProject });
2982+
const projectService = createProjectService(host);
2983+
projectService.setHostConfiguration({ preferences: { lazyConfiguredProjectsFromExternalProject } });
29822984

29832985
const externalProject: protocol.ExternalProject = {
29842986
projectFileName,
@@ -3341,8 +3343,12 @@ namespace ts.projectSystem {
33413343
};
33423344

33433345
const host = createServerHost([file1, file2, tsconfig]);
3344-
const session = createSession(host, { lazyConfiguredProjectsFromExternalProject });
3346+
const session = createSession(host);
33453347
const projectService = session.getProjectService();
3348+
session.executeCommandSeq<protocol.ConfigureRequest>({
3349+
command: protocol.CommandTypes.Configure,
3350+
arguments: { preferences: { lazyConfiguredProjectsFromExternalProject } }
3351+
});
33463352

33473353
// Configure the deferred extension.
33483354
const extraFileExtensions = [{ extension: ".deferred", scriptKind: ScriptKind.Deferred, isMixedContent: true }];
@@ -3995,7 +4001,8 @@ namespace ts.projectSystem {
39954001
content: ""
39964002
};
39974003
const host = createServerHost([f1, f2]);
3998-
const projectService = createProjectService(host, /*parameters*/ undefined, { lazyConfiguredProjectsFromExternalProject });
4004+
const projectService = createProjectService(host);
4005+
projectService.setHostConfiguration({ preferences: { lazyConfiguredProjectsFromExternalProject } });
39994006

40004007
// open external project
40014008
const projectName = "/a/b/proj1";
@@ -4064,7 +4071,8 @@ namespace ts.projectSystem {
40644071
content: "{}"
40654072
};
40664073
const host = createServerHost([f1, cLib, cTsconfig, dLib, dTsconfig]);
4067-
const projectService = createProjectService(host, /*parameters*/ undefined, { lazyConfiguredProjectsFromExternalProject });
4074+
const projectService = createProjectService(host);
4075+
projectService.setHostConfiguration({ preferences: { lazyConfiguredProjectsFromExternalProject } });
40684076

40694077
// open external project
40704078
const projectName = "/a/b/proj1";
@@ -4233,6 +4241,47 @@ namespace ts.projectSystem {
42334241
assert.isTrue(project.hasOpenRef()); // f
42344242
assert.isFalse(project.isClosed());
42354243
});
4244+
4245+
it("handles loads existing configured projects of external projects when lazyConfiguredProjectsFromExternalProject is disabled", () => {
4246+
const f1 = {
4247+
path: "/a/b/app.ts",
4248+
content: "let x = 1"
4249+
};
4250+
const config = {
4251+
path: "/a/b/tsconfig.json",
4252+
content: JSON.stringify({})
4253+
};
4254+
const projectFileName = "/a/b/project.csproj"
4255+
const host = createServerHost([f1, config]);
4256+
const service = createProjectService(host);
4257+
service.setHostConfiguration({ preferences: { lazyConfiguredProjectsFromExternalProject: true } });
4258+
service.openExternalProject(<protocol.ExternalProject>{
4259+
projectFileName,
4260+
rootFiles: toExternalFiles([f1.path, config.path]),
4261+
options: {}
4262+
});
4263+
service.checkNumberOfProjects({ configuredProjects: 1 });
4264+
const project = service.configuredProjects.get(config.path)!;
4265+
assert.equal(project.pendingReload, ConfigFileProgramReloadLevel.Full); // External project referenced configured project pending to be reloaded
4266+
checkProjectActualFiles(project, emptyArray);
4267+
4268+
service.setHostConfiguration({ preferences: { lazyConfiguredProjectsFromExternalProject: false } });
4269+
assert.equal(project.pendingReload, ConfigFileProgramReloadLevel.None); // External project referenced configured project loaded
4270+
checkProjectActualFiles(project, [config.path, f1.path]);
4271+
4272+
service.closeExternalProject(projectFileName);
4273+
service.checkNumberOfProjects({});
4274+
4275+
service.openExternalProject(<protocol.ExternalProject>{
4276+
projectFileName,
4277+
rootFiles: toExternalFiles([f1.path, config.path]),
4278+
options: {}
4279+
});
4280+
service.checkNumberOfProjects({ configuredProjects: 1 });
4281+
const project2 = service.configuredProjects.get(config.path)!;
4282+
assert.equal(project2.pendingReload, ConfigFileProgramReloadLevel.None); // External project referenced configured project loaded
4283+
checkProjectActualFiles(project2, [config.path, f1.path]);
4284+
});
42364285
});
42374286

42384287
describe("tsserverProjectSystem prefer typings to js", () => {

src/tsserver/server.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,6 @@ namespace ts.server {
499499
cancellationToken,
500500
useSingleInferredProject,
501501
useInferredProjectPerProjectRoot,
502-
lazyConfiguredProjectsFromExternalProject,
503502
typingsInstaller: typingsInstaller || nullTypingsInstaller,
504503
byteLength: Buffer.byteLength,
505504
hrtime: process.hrtime,
@@ -938,7 +937,6 @@ namespace ts.server {
938937

939938
const useSingleInferredProject = hasArgument("--useSingleInferredProject");
940939
const useInferredProjectPerProjectRoot = hasArgument("--useInferredProjectPerProjectRoot");
941-
const lazyConfiguredProjectsFromExternalProject = hasArgument("--lazyConfiguredProjectsFromExternalProject");
942940
const disableAutomaticTypingAcquisition = hasArgument("--disableAutomaticTypingAcquisition");
943941
const suppressDiagnosticEvents = hasArgument("--suppressDiagnosticEvents");
944942
const syntaxOnly = hasArgument("--syntaxOnly");

0 commit comments

Comments
 (0)