Skip to content

Commit ec4ea0e

Browse files
committed
Watch only built projects
1 parent 0cb980d commit ec4ea0e

File tree

2 files changed

+34
-10
lines changed

2 files changed

+34
-10
lines changed

src/compiler/tsbuild.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -569,15 +569,16 @@ namespace ts {
569569

570570
function getBuildOrderFor(state: SolutionBuilderState, project: string | undefined, onlyReferences: boolean | undefined) {
571571
const resolvedProject = project && resolveProjectName(state, project);
572+
const buildOrderFromState = getBuildOrder(state);
572573
if (resolvedProject) {
573574
const projectPath = toResolvedConfigFilePath(state, resolvedProject);
574575
const projectIndex = findIndex(
575-
getBuildOrder(state),
576+
buildOrderFromState,
576577
configFileName => toResolvedConfigFilePath(state, configFileName) === projectPath
577578
);
578579
if (projectIndex === -1) return undefined;
579580
}
580-
const buildOrder = resolvedProject ? createBuildOrder(state, [resolvedProject]) : getBuildOrder(state);
581+
const buildOrder = resolvedProject ? createBuildOrder(state, [resolvedProject]) : buildOrderFromState;
581582
Debug.assert(!onlyReferences || resolvedProject !== undefined);
582583
Debug.assert(!onlyReferences || buildOrder[buildOrder.length - 1] === resolvedProject);
583584
return onlyReferences ? buildOrder.slice(0, buildOrder.length - 1) : buildOrder;
@@ -1714,8 +1715,8 @@ namespace ts {
17141715
}
17151716

17161717
disableCache(state);
1717-
reportErrorSummary(state);
1718-
startWatching(state);
1718+
reportErrorSummary(state, buildOrder);
1719+
startWatching(state, buildOrder);
17191720

17201721
return errorProjects ?
17211722
successfulProjects ?
@@ -1798,7 +1799,8 @@ namespace ts {
17981799
state.projectErrorsReported.clear();
17991800
reportWatchStatus(state, Diagnostics.File_change_detected_Starting_incremental_compilation);
18001801
}
1801-
const invalidatedProject = getNextInvalidatedProject(state, getBuildOrder(state), /*reportQueue*/ false);
1802+
const buildOrder = getBuildOrder(state);
1803+
const invalidatedProject = getNextInvalidatedProject(state, buildOrder, /*reportQueue*/ false);
18021804
if (invalidatedProject) {
18031805
invalidatedProject.done();
18041806
if (state.projectPendingBuild.size) {
@@ -1810,7 +1812,7 @@ namespace ts {
18101812
}
18111813
}
18121814
disableCache(state);
1813-
reportErrorSummary(state);
1815+
reportErrorSummary(state, buildOrder);
18141816
}
18151817

18161818
function watchConfigFile(state: SolutionBuilderState, resolved: ResolvedConfigFileName, resolvedPath: ResolvedConfigFilePath) {
@@ -1908,10 +1910,10 @@ namespace ts {
19081910
);
19091911
}
19101912

1911-
function startWatching(state: SolutionBuilderState) {
1913+
function startWatching(state: SolutionBuilderState, buildOrder: readonly ResolvedConfigFileName[]) {
19121914
if (!state.watchAllProjectsPending) return;
19131915
state.watchAllProjectsPending = false;
1914-
for (const resolved of getBuildOrder(state)) {
1916+
for (const resolved of buildOrder) {
19151917
const resolvedPath = toResolvedConfigFilePath(state, resolved);
19161918
// Watch this file
19171919
watchConfigFile(state, resolved, resolvedPath);
@@ -1985,12 +1987,12 @@ namespace ts {
19851987
reportAndStoreErrors(state, proj, [state.configFileCache.get(proj) as Diagnostic]);
19861988
}
19871989

1988-
function reportErrorSummary(state: SolutionBuilderState) {
1990+
function reportErrorSummary(state: SolutionBuilderState, buildOrder: readonly ResolvedConfigFileName[]) {
19891991
if (!state.needsSummary || (!state.watch && !state.host.reportErrorSummary)) return;
19901992
state.needsSummary = false;
19911993
const { diagnostics } = state;
19921994
// Report errors from the other projects
1993-
getBuildOrder(state).forEach(project => {
1995+
buildOrder.forEach(project => {
19941996
const projectPath = toResolvedConfigFilePath(state, project);
19951997
if (!state.projectErrorsReported.has(projectPath)) {
19961998
reportErrors(state, diagnostics.get(projectPath) || emptyArray);

src/testRunner/unittests/tsbuildWatchMode.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,28 @@ namespace ts.tscWatch {
143143
createSolutionInWatchMode(allFiles);
144144
});
145145

146+
it("verify building references watches only those projects", () => {
147+
const system = createTsBuildWatchSystem(allFiles, { currentDirectory: projectsLocation });
148+
const host = createSolutionBuilderWithWatchHost(system);
149+
const solutionBuilder = ts.createSolutionBuilderWithWatch(host, [`${project}/${SubProject.tests}`], { watch: true });
150+
solutionBuilder.buildReferences(`${project}/${SubProject.tests}`);
151+
152+
checkWatchedFiles(system, testProjectExpectedWatchedFiles.slice(0, testProjectExpectedWatchedFiles.length - tests.length));
153+
checkWatchedDirectories(system, emptyArray, /*recursive*/ false);
154+
checkWatchedDirectories(system, testProjectExpectedWatchedDirectoriesRecursive, /*recursive*/ true);
155+
156+
checkOutputErrorsInitial(system, emptyArray);
157+
const testOutput = getOutputStamps(system, SubProject.tests, "index");
158+
const outputFileStamps = getOutputFileStamps(system);
159+
for (const stamp of outputFileStamps.slice(0, outputFileStamps.length - testOutput.length)) {
160+
assert.isDefined(stamp[1], `${stamp[0]} expected to be present`);
161+
}
162+
for (const stamp of testOutput) {
163+
assert.isUndefined(stamp[1], `${stamp[0]} expected to be missing`);
164+
}
165+
return system;
166+
});
167+
146168
describe("validates the changes and watched files", () => {
147169
const newFileWithoutExtension = "newFile";
148170
const newFile: File = {

0 commit comments

Comments
 (0)