Skip to content

Commit e75f470

Browse files
authored
Report positionless tsconfig option errors on compilerOptions key (#58254)
1 parent 93451e8 commit e75f470

11 files changed

+210
-66
lines changed

src/compiler/program.ts

+35-8
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ import {
313313
toPath as ts_toPath,
314314
trace,
315315
tracing,
316+
tryCast,
316317
TsConfigSourceFile,
317318
TypeChecker,
318319
typeDirectiveIsEqualTo,
@@ -1618,6 +1619,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
16181619
// Map storing if there is emit blocking diagnostics for given input
16191620
const hasEmitBlockingDiagnostics = new Map<string, boolean>();
16201621
let _compilerOptionsObjectLiteralSyntax: ObjectLiteralExpression | false | undefined;
1622+
let _compilerOptionsPropertySyntax: PropertyAssignment | false | undefined;
16211623

16221624
let moduleResolutionCache: ModuleResolutionCache | undefined;
16231625
let actualResolveModuleNamesWorker: (
@@ -4400,7 +4402,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
44004402
}
44014403

44024404
if (options.checkJs && !getAllowJSCompilerOption(options)) {
4403-
programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "checkJs", "allowJs"));
4405+
createDiagnosticForOptionName(Diagnostics.Option_0_cannot_be_specified_without_specifying_option_1, "checkJs", "allowJs");
44044406
}
44054407

44064408
if (options.emitDeclarationOnly) {
@@ -4823,7 +4825,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
48234825
}
48244826
});
48254827
if (needCompilerDiagnostic) {
4826-
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
4828+
createCompilerOptionsDiagnostic(message, ...args);
48274829
}
48284830
}
48294831

@@ -4845,7 +4847,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
48454847
}
48464848
});
48474849
if (needCompilerDiagnostic) {
4848-
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
4850+
createCompilerOptionsDiagnostic(message, ...args);
48494851
}
48504852
}
48514853

@@ -4893,25 +4895,50 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
48934895
!createOptionDiagnosticInObjectLiteralSyntax(compilerOptionsObjectLiteralSyntax, onKey, option1, option2, message, ...args);
48944896

48954897
if (needCompilerDiagnostic) {
4898+
createCompilerOptionsDiagnostic(message, ...args);
4899+
}
4900+
}
4901+
4902+
function createCompilerOptionsDiagnostic(message: DiagnosticMessageChain): void;
4903+
function createCompilerOptionsDiagnostic(message: DiagnosticMessage, ...args: DiagnosticArguments): void;
4904+
function createCompilerOptionsDiagnostic(message: DiagnosticMessage | DiagnosticMessageChain, ...args: DiagnosticArguments): void;
4905+
function createCompilerOptionsDiagnostic(message: DiagnosticMessage | DiagnosticMessageChain, ...args: DiagnosticArguments): void {
4906+
const compilerOptionsProperty = getCompilerOptionsPropertySyntax();
4907+
if (compilerOptionsProperty) {
48964908
// eslint-disable-next-line local/no-in-operator
48974909
if ("messageText" in message) {
4898-
programDiagnostics.add(createCompilerDiagnosticFromMessageChain(message));
4910+
programDiagnostics.add(createDiagnosticForNodeFromMessageChain(options.configFile!, compilerOptionsProperty.name, message));
48994911
}
49004912
else {
4901-
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
4913+
programDiagnostics.add(createDiagnosticForNodeInSourceFile(options.configFile!, compilerOptionsProperty.name, message, ...args));
49024914
}
49034915
}
4916+
// eslint-disable-next-line local/no-in-operator
4917+
else if ("messageText" in message) {
4918+
programDiagnostics.add(createCompilerDiagnosticFromMessageChain(message));
4919+
}
4920+
else {
4921+
programDiagnostics.add(createCompilerDiagnostic(message, ...args));
4922+
}
49044923
}
49054924

49064925
function getCompilerOptionsObjectLiteralSyntax() {
49074926
if (_compilerOptionsObjectLiteralSyntax === undefined) {
4908-
_compilerOptionsObjectLiteralSyntax = forEachPropertyAssignment(
4927+
const compilerOptionsProperty = getCompilerOptionsPropertySyntax();
4928+
_compilerOptionsObjectLiteralSyntax = compilerOptionsProperty ? tryCast(compilerOptionsProperty.initializer, isObjectLiteralExpression) || false : false;
4929+
}
4930+
return _compilerOptionsObjectLiteralSyntax || undefined;
4931+
}
4932+
4933+
function getCompilerOptionsPropertySyntax() {
4934+
if (_compilerOptionsPropertySyntax === undefined) {
4935+
_compilerOptionsPropertySyntax = forEachPropertyAssignment(
49094936
getTsConfigObjectLiteralExpression(options.configFile),
49104937
"compilerOptions",
4911-
prop => isObjectLiteralExpression(prop.initializer) ? prop.initializer : undefined,
4938+
identity,
49124939
) || false;
49134940
}
4914-
return _compilerOptionsObjectLiteralSyntax || undefined;
4941+
return _compilerOptionsPropertySyntax || undefined;
49154942
}
49164943

49174944
function createOptionDiagnosticInObjectLiteralSyntax(objectLiteral: ObjectLiteralExpression, onKey: boolean, key1: string, key2: string | undefined, messageChain: DiagnosticMessageChain): boolean;

tests/baselines/reference/resolutionCandidateFromPackageJsonField2(moduleresolution=bundler).errors.txt

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
1+
tsconfig.json(2,5): error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
22
test.ts(1,19): error TS5097: An import path can only end with a '.ts' extension when 'allowImportingTsExtensions' is enabled.
33

44

5-
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
6-
==== tsconfig.json (0 errors) ====
5+
==== tsconfig.json (1 errors) ====
76
{
87
"compilerOptions": {
8+
~~~~~~~~~~~~~~~~~
9+
!!! error TS5095: Option 'bundler' can only be used when 'module' is set to 'preserve' or to 'es2015' or later.
910
"paths": {
1011
"foo/*": ["./dist/*"],
1112
"baz/*.ts": ["./types/*.d.ts"]

tests/baselines/reference/tsc/moduleResolution/alternateResult.js

+65-26
Original file line numberDiff line numberDiff line change
@@ -344,10 +344,13 @@ File '/home/src/projects/project/node_modules/foo2/package.json' exists accordin
344344
File '/home/src/projects/project/node_modules/@types/bar2/package.json' exists according to earlier cached lookups.
345345
File '/lib/package.json' does not exist.
346346
File '/package.json' does not exist according to earlier cached lookups.
347-
[91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
347+
[96mhome/src/projects/project/tsconfig.json[0m:[93m2[0m:[93m3[0m - [91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
348348

349+
2 "compilerOptions": {
350+
   ~~~~~~~~~~~~~~~~~
349351

350-
Found 1 error.
352+
353+
Found 1 error in home/src/projects/project/tsconfig.json:2
351354

352355
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
353356
Program root files: [
@@ -657,10 +660,13 @@ File '/home/src/projects/project/node_modules/foo2/package.json' exists accordin
657660
File '/home/src/projects/project/node_modules/@types/bar2/package.json' exists according to earlier cached lookups.
658661
File '/lib/package.json' does not exist.
659662
File '/package.json' does not exist according to earlier cached lookups.
660-
error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
663+
home/src/projects/project/tsconfig.json:2:3 - error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
664+
665+
2 "compilerOptions": {
666+
   ~~~~~~~~~~~~~~~~~
661667

662668

663-
Found 1 error.
669+
Found 1 error in home/src/projects/project/tsconfig.json[90m:2[0m
664670

665671
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
666672
Program root files: [
@@ -896,10 +902,13 @@ File '/home/src/projects/project/node_modules/foo2/package.json' exists accordin
896902
File '/home/src/projects/project/node_modules/@types/bar2/package.json' exists according to earlier cached lookups.
897903
File '/lib/package.json' does not exist.
898904
File '/package.json' does not exist according to earlier cached lookups.
899-
[91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
905+
[96mhome/src/projects/project/tsconfig.json[0m:[93m2[0m:[93m3[0m - [91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
900906

907+
2 "compilerOptions": {
908+
   ~~~~~~~~~~~~~~~~~
901909

902-
Found 1 error.
910+
911+
Found 1 error in home/src/projects/project/tsconfig.json:2
903912

904913
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
905914
Program root files: [
@@ -1125,10 +1134,13 @@ File '/home/src/projects/project/node_modules/foo2/package.json' exists accordin
11251134
File '/home/src/projects/project/node_modules/@types/bar2/package.json' exists according to earlier cached lookups.
11261135
File '/lib/package.json' does not exist.
11271136
File '/package.json' does not exist according to earlier cached lookups.
1128-
error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
1137+
home/src/projects/project/tsconfig.json:2:3 - error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
1138+
1139+
2 "compilerOptions": {
1140+
   ~~~~~~~~~~~~~~~~~
11291141

11301142

1131-
Found 1 error.
1143+
Found 1 error in home/src/projects/project/tsconfig.json[90m:2[0m
11321144

11331145
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
11341146
Program root files: [
@@ -1341,10 +1353,13 @@ File '/home/src/projects/project/node_modules/foo2/package.json' exists accordin
13411353
File '/home/src/projects/project/node_modules/@types/bar2/package.json' exists according to earlier cached lookups.
13421354
File '/lib/package.json' does not exist.
13431355
File '/package.json' does not exist according to earlier cached lookups.
1344-
[91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
1356+
[96mhome/src/projects/project/tsconfig.json[0m:[93m2[0m:[93m3[0m - [91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
13451357

1358+
2 "compilerOptions": {
1359+
   ~~~~~~~~~~~~~~~~~
13461360

1347-
Found 1 error.
1361+
1362+
Found 1 error in home/src/projects/project/tsconfig.json:2
13481363

13491364
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
13501365
Program root files: [
@@ -1526,10 +1541,13 @@ File '/home/src/projects/project/node_modules/foo2/package.json' exists accordin
15261541
File '/home/src/projects/project/node_modules/@types/bar2/package.json' exists according to earlier cached lookups.
15271542
File '/lib/package.json' does not exist.
15281543
File '/package.json' does not exist according to earlier cached lookups.
1529-
error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
1544+
home/src/projects/project/tsconfig.json:2:3 - error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
1545+
1546+
2 "compilerOptions": {
1547+
   ~~~~~~~~~~~~~~~~~
15301548

15311549

1532-
Found 1 error.
1550+
Found 1 error in home/src/projects/project/tsconfig.json[90m:2[0m
15331551

15341552
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
15351553
Program root files: [
@@ -1780,10 +1798,13 @@ File '/home/src/projects/project/node_modules/foo2/package.json' exists accordin
17801798
File '/home/src/projects/project/node_modules/@types/bar2/package.json' exists according to earlier cached lookups.
17811799
File '/lib/package.json' does not exist.
17821800
File '/package.json' does not exist according to earlier cached lookups.
1783-
error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
1801+
home/src/projects/project/tsconfig.json:2:3 - error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
1802+
1803+
2 "compilerOptions": {
1804+
   ~~~~~~~~~~~~~~~~~
17841805

17851806

1786-
Found 1 error.
1807+
Found 1 error in home/src/projects/project/tsconfig.json[90m:2[0m
17871808

17881809
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
17891810
Program root files: [
@@ -2085,10 +2106,13 @@ File '/home/src/projects/project/node_modules/@types/bar/package.json' exists ac
20852106
File '/home/src/projects/project/node_modules/foo2/package.json' exists according to earlier cached lookups.
20862107
File '/lib/package.json' does not exist.
20872108
File '/package.json' does not exist according to earlier cached lookups.
2088-
[91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
2109+
[96mhome/src/projects/project/tsconfig.json[0m:[93m2[0m:[93m3[0m - [91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
20892110

2111+
2 "compilerOptions": {
2112+
   ~~~~~~~~~~~~~~~~~
20902113

2091-
Found 1 error.
2114+
2115+
Found 1 error in home/src/projects/project/tsconfig.json:2
20922116

20932117
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
20942118
Program root files: [
@@ -2406,10 +2430,13 @@ File '/home/src/projects/project/node_modules/foo/package.json' exists according
24062430
File '/home/src/projects/project/node_modules/@types/bar/package.json' exists according to earlier cached lookups.
24072431
File '/lib/package.json' does not exist.
24082432
File '/package.json' does not exist according to earlier cached lookups.
2409-
error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
2433+
home/src/projects/project/tsconfig.json:2:3 - error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
2434+
2435+
2 "compilerOptions": {
2436+
   ~~~~~~~~~~~~~~~~~
24102437

24112438

2412-
Found 1 error.
2439+
Found 1 error in home/src/projects/project/tsconfig.json[90m:2[0m
24132440

24142441
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
24152442
Program root files: [
@@ -2713,10 +2740,13 @@ File '/home/src/projects/project/node_modules/foo/package.json' exists according
27132740
File '/home/src/projects/project/node_modules/@types/bar/package.json' exists according to earlier cached lookups.
27142741
File '/lib/package.json' does not exist.
27152742
File '/package.json' does not exist according to earlier cached lookups.
2716-
error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
2743+
home/src/projects/project/tsconfig.json:2:3 - error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
2744+
2745+
2 "compilerOptions": {
2746+
   ~~~~~~~~~~~~~~~~~
27172747

27182748

2719-
Found 1 error.
2749+
Found 1 error in home/src/projects/project/tsconfig.json[90m:2[0m
27202750

27212751
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
27222752
Program root files: [
@@ -2952,10 +2982,13 @@ File '/home/src/projects/project/node_modules/foo/package.json' exists according
29522982
File '/home/src/projects/project/node_modules/@types/bar/package.json' exists according to earlier cached lookups.
29532983
File '/lib/package.json' does not exist.
29542984
File '/package.json' does not exist according to earlier cached lookups.
2955-
[91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
2985+
[96mhome/src/projects/project/tsconfig.json[0m:[93m2[0m:[93m3[0m - [91merror[0m[90m TS5110: [0mOption 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
29562986

2987+
2 "compilerOptions": {
2988+
   ~~~~~~~~~~~~~~~~~
29572989

2958-
Found 1 error.
2990+
2991+
Found 1 error in home/src/projects/project/tsconfig.json:2
29592992

29602993
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
29612994
Program root files: [
@@ -3181,10 +3214,13 @@ File '/home/src/projects/project/node_modules/foo/package.json' exists according
31813214
File '/home/src/projects/project/node_modules/@types/bar/package.json' exists according to earlier cached lookups.
31823215
File '/lib/package.json' does not exist.
31833216
File '/package.json' does not exist according to earlier cached lookups.
3184-
error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
3217+
home/src/projects/project/tsconfig.json:2:3 - error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
3218+
3219+
2 "compilerOptions": {
3220+
   ~~~~~~~~~~~~~~~~~
31853221

31863222

3187-
Found 1 error.
3223+
Found 1 error in home/src/projects/project/tsconfig.json[90m:2[0m
31883224

31893225
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
31903226
Program root files: [
@@ -3397,10 +3433,13 @@ File '/home/src/projects/project/node_modules/foo/package.json' exists according
33973433
File '/home/src/projects/project/node_modules/@types/bar/package.json' exists according to earlier cached lookups.
33983434
File '/lib/package.json' does not exist.
33993435
File '/package.json' does not exist according to earlier cached lookups.
3400-
error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
3436+
home/src/projects/project/tsconfig.json:2:3 - error TS5110: Option 'module' must be set to 'Node16' when option 'moduleResolution' is set to 'Node16'.
3437+
3438+
2 "compilerOptions": {
3439+
   ~~~~~~~~~~~~~~~~~
34013440

34023441

3403-
Found 1 error.
3442+
Found 1 error in home/src/projects/project/tsconfig.json[90m:2[0m
34043443

34053444
exitCode:: ExitStatus.DiagnosticsPresent_OutputsGenerated
34063445
Program root files: [

tests/baselines/reference/tscWatch/forceConsistentCasingInFileNames/with-nodeNext-resolution.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ Resolving real path for '/Users/name/projects/web/node_modules/@types/yargs/inde
101101
File '/a/lib/package.json' does not exist.
102102
File '/a/package.json' does not exist.
103103
File '/package.json' does not exist according to earlier cached lookups.
104-
error TS5110: Option 'module' must be set to 'NodeNext' when option 'moduleResolution' is set to 'NodeNext'.
104+
tsconfig.json:2:3 - error TS5110: Option 'module' must be set to 'NodeNext' when option 'moduleResolution' is set to 'NodeNext'.
105+
106+
2 "compilerOptions": {
107+
   ~~~~~~~~~~~~~~~~~
105108

106109
../../../../a/lib/lib.d.ts
107110
Default library for target 'es5'

0 commit comments

Comments
 (0)