Skip to content

Commit 6e8027e

Browse files
authored
Merge pull request microsoft#27395 from Microsoft/noFilesError
Refactoring to unify updating no input files error
2 parents 3331d07 + aed876d commit 6e8027e

File tree

5 files changed

+38
-27
lines changed

5 files changed

+38
-27
lines changed

src/compiler/commandLineParser.ts

+24-5
Original file line numberDiff line numberDiff line change
@@ -1954,7 +1954,7 @@ namespace ts {
19541954
}
19551955

19561956
const result = matchFileNames(filesSpecs, includeSpecs, excludeSpecs, configFileName ? directoryOfCombinedPath(configFileName, basePath) : basePath, options, host, errors, extraFileExtensions, sourceFile);
1957-
if (result.fileNames.length === 0 && !hasProperty(raw, "files") && resolutionStack.length === 0 && !hasProperty(raw, "references")) {
1957+
if (shouldReportNoInputFiles(result, canJsonReportNoInutFiles(raw), resolutionStack)) {
19581958
errors.push(getErrorForNoInputFiles(result.spec, configFileName));
19591959
}
19601960

@@ -1989,20 +1989,39 @@ namespace ts {
19891989
}
19901990
}
19911991

1992-
/*@internal*/
1993-
export function isErrorNoInputFiles(error: Diagnostic) {
1992+
function isErrorNoInputFiles(error: Diagnostic) {
19941993
return error.code === Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2.code;
19951994
}
19961995

1997-
/*@internal*/
1998-
export function getErrorForNoInputFiles({ includeSpecs, excludeSpecs }: ConfigFileSpecs, configFileName: string | undefined) {
1996+
function getErrorForNoInputFiles({ includeSpecs, excludeSpecs }: ConfigFileSpecs, configFileName: string | undefined) {
19991997
return createCompilerDiagnostic(
20001998
Diagnostics.No_inputs_were_found_in_config_file_0_Specified_include_paths_were_1_and_exclude_paths_were_2,
20011999
configFileName || "tsconfig.json",
20022000
JSON.stringify(includeSpecs || []),
20032001
JSON.stringify(excludeSpecs || []));
20042002
}
20052003

2004+
function shouldReportNoInputFiles(result: ExpandResult, canJsonReportNoInutFiles: boolean, resolutionStack?: Path[]) {
2005+
return result.fileNames.length === 0 && canJsonReportNoInutFiles && (!resolutionStack || resolutionStack.length === 0);
2006+
}
2007+
2008+
/*@internal*/
2009+
export function canJsonReportNoInutFiles(raw: any) {
2010+
return !hasProperty(raw, "files") && !hasProperty(raw, "references");
2011+
}
2012+
2013+
/*@internal*/
2014+
export function updateErrorForNoInputFiles(result: ExpandResult, configFileName: string, configFileSpecs: ConfigFileSpecs, configParseDiagnostics: Diagnostic[], canJsonReportNoInutFiles: boolean) {
2015+
const existingErrors = configParseDiagnostics.length;
2016+
if (shouldReportNoInputFiles(result, canJsonReportNoInutFiles)) {
2017+
configParseDiagnostics.push(getErrorForNoInputFiles(configFileSpecs, configFileName));
2018+
}
2019+
else {
2020+
filterMutate(configParseDiagnostics, error => !isErrorNoInputFiles(error));
2021+
}
2022+
return existingErrors !== configParseDiagnostics.length;
2023+
}
2024+
20062025
interface ParsedTsconfig {
20072026
raw: any;
20082027
options?: CompilerOptions;

src/compiler/tsbuild.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -902,12 +902,7 @@ namespace ts {
902902
else if (reloadLevel === ConfigFileProgramReloadLevel.Partial) {
903903
// Update file names
904904
const result = getFileNamesFromConfigSpecs(proj.configFileSpecs!, getDirectoryPath(resolved), proj.options, parseConfigFileHost);
905-
if (result.fileNames.length !== 0) {
906-
filterMutate(proj.errors, error => !isErrorNoInputFiles(error));
907-
}
908-
else if (!proj.configFileSpecs!.filesSpecs && !some(proj.errors, isErrorNoInputFiles)) {
909-
proj.errors.push(getErrorForNoInputFiles(proj.configFileSpecs!, resolved));
910-
}
905+
updateErrorForNoInputFiles(result, resolved, proj.configFileSpecs!, proj.errors, canJsonReportNoInutFiles(proj.raw));
911906
proj.fileNames = result.fileNames;
912907
watchInputFiles(resolved, proj);
913908
}
@@ -1002,6 +997,7 @@ namespace ts {
1002997
return resultFlags;
1003998
}
1004999
if (configFile.fileNames.length === 0) {
1000+
reportAndStoreErrors(proj, configFile.errors);
10051001
// Nothing to build - must be a solution file, basically
10061002
return BuildResultFlags.None;
10071003
}

src/compiler/watch.ts

+5-8
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,8 @@ namespace ts {
469469
const { configFileName, optionsToExtend: optionsToExtendForConfigFile = {}, createProgram } = host;
470470
let { rootFiles: rootFileNames, options: compilerOptions, projectReferences } = host;
471471
let configFileSpecs: ConfigFileSpecs;
472-
let configFileParsingDiagnostics: ReadonlyArray<Diagnostic> | undefined;
472+
let configFileParsingDiagnostics: Diagnostic[] | undefined;
473+
let canConfigFileJsonReportNoInputFiles = false;
473474
let hasChangedConfigFileParsingErrors = false;
474475

475476
const cachedDirectoryStructureHost = configFileName === undefined ? undefined : createCachedDirectoryStructureHost(host, currentDirectory, useCaseSensitiveFileNames);
@@ -829,12 +830,7 @@ namespace ts {
829830
function reloadFileNamesFromConfigFile() {
830831
writeLog("Reloading new file names and options");
831832
const result = getFileNamesFromConfigSpecs(configFileSpecs, getDirectoryPath(configFileName), compilerOptions, parseConfigFileHost);
832-
if (result.fileNames.length) {
833-
configFileParsingDiagnostics = filter(configFileParsingDiagnostics, error => !isErrorNoInputFiles(error));
834-
hasChangedConfigFileParsingErrors = true;
835-
}
836-
else if (!configFileSpecs.filesSpecs && !some(configFileParsingDiagnostics, isErrorNoInputFiles)) {
837-
configFileParsingDiagnostics = configFileParsingDiagnostics!.concat(getErrorForNoInputFiles(configFileSpecs, configFileName));
833+
if (updateErrorForNoInputFiles(result, configFileName, configFileSpecs, configFileParsingDiagnostics!, canConfigFileJsonReportNoInputFiles)) {
838834
hasChangedConfigFileParsingErrors = true;
839835
}
840836
rootFileNames = result.fileNames;
@@ -867,7 +863,8 @@ namespace ts {
867863
compilerOptions = configFileParseResult.options;
868864
configFileSpecs = configFileParseResult.configFileSpecs!; // TODO: GH#18217
869865
projectReferences = configFileParseResult.projectReferences;
870-
configFileParsingDiagnostics = getConfigFileParsingDiagnostics(configFileParseResult);
866+
configFileParsingDiagnostics = getConfigFileParsingDiagnostics(configFileParseResult).slice();
867+
canConfigFileJsonReportNoInputFiles = canJsonReportNoInutFiles(configFileParseResult.raw);
871868
hasChangedConfigFileParsingErrors = true;
872869
}
873870

src/server/editorServices.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1674,6 +1674,7 @@ namespace ts.server {
16741674
};
16751675
}
16761676
project.configFileSpecs = parsedCommandLine.configFileSpecs;
1677+
project.canConfigFileJsonReportNoInputFiles = canJsonReportNoInutFiles(parsedCommandLine.raw);
16771678
project.setProjectErrors(configFileErrors);
16781679
project.updateReferences(parsedCommandLine.projectReferences);
16791680
const lastFileExceededProgramSize = this.getFilenameForExceededTotalSizeLimitForNonTsFiles(project.canonicalConfigFilePath, compilerOptions, parsedCommandLine.fileNames, fileNamePropertyReader);
@@ -1766,7 +1767,7 @@ namespace ts.server {
17661767
const configFileSpecs = project.configFileSpecs!; // TODO: GH#18217
17671768
const configFileName = project.getConfigFilePath();
17681769
const fileNamesResult = getFileNamesFromConfigSpecs(configFileSpecs, getDirectoryPath(configFileName), project.getCompilationSettings(), project.getCachedDirectoryStructureHost(), this.hostConfiguration.extraFileExtensions);
1769-
project.updateErrorOnNoInputFiles(fileNamesResult.fileNames.length !== 0);
1770+
project.updateErrorOnNoInputFiles(fileNamesResult);
17701771
this.updateNonInferredProjectFiles(project, fileNamesResult.fileNames.concat(project.getExternalFiles()), fileNamePropertyReader);
17711772
return project.updateGraph();
17721773
}

src/server/project.ts

+5-7
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,9 @@ namespace ts.server {
13241324
/*@internal*/
13251325
configFileSpecs: ConfigFileSpecs | undefined;
13261326

1327+
/*@internal*/
1328+
canConfigFileJsonReportNoInputFiles: boolean;
1329+
13271330
/** Ref count to the project when opened from external project */
13281331
private externalProjectRefCount = 0;
13291332

@@ -1540,13 +1543,8 @@ namespace ts.server {
15401543
}
15411544

15421545
/*@internal*/
1543-
updateErrorOnNoInputFiles(hasFileNames: boolean) {
1544-
if (hasFileNames) {
1545-
filterMutate(this.projectErrors!, error => !isErrorNoInputFiles(error)); // TODO: GH#18217
1546-
}
1547-
else if (!this.configFileSpecs!.filesSpecs && !some(this.projectErrors, isErrorNoInputFiles)) { // TODO: GH#18217
1548-
this.projectErrors!.push(getErrorForNoInputFiles(this.configFileSpecs!, this.getConfigFilePath()));
1549-
}
1546+
updateErrorOnNoInputFiles(fileNameResult: ExpandResult) {
1547+
updateErrorForNoInputFiles(fileNameResult, this.getConfigFilePath(), this.configFileSpecs!, this.projectErrors!, this.canConfigFileJsonReportNoInputFiles);
15501548
}
15511549
}
15521550

0 commit comments

Comments
 (0)