Skip to content

Commit 9a4ad52

Browse files
committed
Ensure tsconfig compiler flags also get 'did you mean?'
1 parent ae167de commit 9a4ad52

File tree

4 files changed

+51
-24
lines changed

4 files changed

+51
-24
lines changed

src/compiler/commandLineParser.ts

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,7 @@ namespace ts {
12521252
const returnBuildOptionNameMap = () => (buildOptionNameMap || (buildOptionNameMap = createOptionNameMap(buildOpts)));
12531253
const { options, fileNames: projects, errors } = parseCommandLineWorker(returnBuildOptionNameMap, {
12541254
unknownOptionDiagnostic: Diagnostics.Unknown_build_option_0,
1255-
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_compiler_option_0_Did_you_mean_1,
1255+
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_build_option_0_Did_you_mean_1,
12561256
optionTypeMismatchDiagnostic: Diagnostics.Build_option_0_requires_a_value_of_type_1
12571257
}, args);
12581258
const buildOptions = options as BuildOptions;
@@ -1401,19 +1401,28 @@ namespace ts {
14011401
name: "compilerOptions",
14021402
type: "object",
14031403
elementOptions: commandLineOptionsToMap(optionDeclarations),
1404-
extraKeyDiagnosticMessage: Diagnostics.Unknown_compiler_option_0
1404+
extraKeyDiagnostics: {
1405+
unknownOptionDiagnostic: Diagnostics.Unknown_compiler_option_0,
1406+
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_compiler_option_0_Did_you_mean_1
1407+
},
14051408
},
14061409
{
14071410
name: "typingOptions",
14081411
type: "object",
14091412
elementOptions: commandLineOptionsToMap(typeAcquisitionDeclarations),
1410-
extraKeyDiagnosticMessage: Diagnostics.Unknown_type_acquisition_option_0
1413+
extraKeyDiagnostics: {
1414+
unknownOptionDiagnostic: Diagnostics.Unknown_type_acquisition_option_0,
1415+
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_type_acquisition_option_0_Did_you_mean_1
1416+
},
14111417
},
14121418
{
14131419
name: "typeAcquisition",
14141420
type: "object",
14151421
elementOptions: commandLineOptionsToMap(typeAcquisitionDeclarations),
1416-
extraKeyDiagnosticMessage: Diagnostics.Unknown_type_acquisition_option_0
1422+
extraKeyDiagnostics: {
1423+
unknownOptionDiagnostic: Diagnostics.Unknown_type_acquisition_option_0,
1424+
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_type_acquisition_option_0_Did_you_mean_1
1425+
}
14171426
},
14181427
{
14191428
name: "extends",
@@ -1519,7 +1528,7 @@ namespace ts {
15191528
function convertObjectLiteralExpressionToJson(
15201529
node: ObjectLiteralExpression,
15211530
knownOptions: Map<CommandLineOption> | undefined,
1522-
extraKeyDiagnosticMessage: DiagnosticMessage | undefined,
1531+
extraKeyDiagnostics: DidYouMeanOptionalDiagnostics | undefined,
15231532
parentOption: string | undefined
15241533
): any {
15251534
const result: any = returnValue ? {} : undefined;
@@ -1539,8 +1548,19 @@ namespace ts {
15391548
const textOfKey = getTextOfPropertyName(element.name);
15401549
const keyText = textOfKey && unescapeLeadingUnderscores(textOfKey);
15411550
const option = keyText && knownOptions ? knownOptions.get(keyText) : undefined;
1542-
if (keyText && extraKeyDiagnosticMessage && !option) {
1543-
errors.push(createDiagnosticForNodeInSourceFile(sourceFile, element.name, extraKeyDiagnosticMessage, keyText));
1551+
if (keyText && extraKeyDiagnostics && !option) {
1552+
if (knownOptions) {
1553+
const possibleOption = getSpellingSuggestion(keyText, arrayFrom(knownOptions.keys()), opt => opt);
1554+
if (possibleOption) {
1555+
errors.push(createDiagnosticForNodeInSourceFile(sourceFile, element.name, extraKeyDiagnostics.unknownDidYouMeanDiagnostic, keyText, possibleOption));
1556+
}
1557+
else {
1558+
errors.push(createDiagnosticForNodeInSourceFile(sourceFile, element.name, extraKeyDiagnostics.unknownOptionDiagnostic, keyText));
1559+
}
1560+
}
1561+
else {
1562+
errors.push(createDiagnosticForNodeInSourceFile(sourceFile, element.name, extraKeyDiagnostics.unknownOptionDiagnostic, keyText));
1563+
}
15441564
}
15451565
const value = convertPropertyValueToJson(element.initializer, option);
15461566
if (typeof keyText !== "undefined") {
@@ -1642,9 +1662,9 @@ namespace ts {
16421662
// vs what we set in the json
16431663
// If need arises, we can modify this interface and callbacks as needed
16441664
if (option) {
1645-
const { elementOptions, extraKeyDiagnosticMessage, name: optionName } = <TsConfigOnlyOption>option;
1665+
const { elementOptions, extraKeyDiagnostics, name: optionName } = <TsConfigOnlyOption>option;
16461666
return convertObjectLiteralExpressionToJson(objectLiteralExpression,
1647-
elementOptions, extraKeyDiagnosticMessage, optionName);
1667+
elementOptions, extraKeyDiagnostics, optionName);
16481668
}
16491669
else {
16501670
return convertObjectLiteralExpressionToJson(
@@ -2503,23 +2523,17 @@ namespace ts {
25032523
const typeAcquisition = convertEnableAutoDiscoveryToEnable(jsonOptions);
25042524

25052525
const diagnostics = {
2506-
unknownOptionDiagnostic: Diagnostics.Unknown_compiler_option_0,
2507-
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_compiler_option_0_Did_you_mean_1 ,
2526+
unknownOptionDiagnostic: Diagnostics.Unknown_type_acquisition_option_0,
2527+
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_type_acquisition_option_0_Did_you_mean_1 ,
25082528
};
25092529
convertOptionsFromJson(typeAcquisitionDeclarations, typeAcquisition, basePath, options, diagnostics, errors);
25102530

25112531
return options;
25122532
}
25132533

25142534

2515-
interface ConvertOptionsDiagnostics {
2516-
unknownOptionDiagnostic: DiagnosticMessage,
2517-
unknownDidYouMeanDiagnostic: DiagnosticMessage,
2518-
}
2519-
2520-
25212535
function convertOptionsFromJson(optionDeclarations: readonly CommandLineOption[], jsonOptions: any, basePath: string,
2522-
defaultOptions: CompilerOptions | TypeAcquisition, diagnostics: ConvertOptionsDiagnostics, errors: Push<Diagnostic>) {
2536+
defaultOptions: CompilerOptions | TypeAcquisition, diagnostics: DidYouMeanOptionalDiagnostics, errors: Push<Diagnostic>) {
25232537

25242538
if (!jsonOptions) {
25252539
return;

src/compiler/diagnosticMessages.json

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3301,6 +3301,10 @@
33013301
"category": "Error",
33023302
"code": 5076
33033303
},
3304+
"Unknown build option '{0}'. Did you mean '{1}'?": {
3305+
"category": "Error",
3306+
"code": 5077
3307+
},
33043308

33053309
"Generates a sourcemap for each corresponding '.d.ts' file.": {
33063310
"category": "Message",
@@ -4751,7 +4755,10 @@
47514755
"category": "Error",
47524756
"code": 17017
47534757
},
4754-
4758+
"Unknown type acquisition option '{0}'. Did you mean '{1}'?": {
4759+
"category": "Error",
4760+
"code": 17018
4761+
},
47554762
"Circularity detected while resolving configuration: {0}": {
47564763
"category": "Error",
47574764
"code": 18000

src/compiler/types.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5199,11 +5199,17 @@ namespace ts {
51995199
type: Map<number | string>; // an object literal mapping named values to actual values
52005200
}
52015201

5202+
/* @internal */
5203+
export interface DidYouMeanOptionalDiagnostics {
5204+
unknownOptionDiagnostic: DiagnosticMessage,
5205+
unknownDidYouMeanDiagnostic: DiagnosticMessage,
5206+
}
5207+
52025208
/* @internal */
52035209
export interface TsConfigOnlyOption extends CommandLineOptionBase {
52045210
type: "object";
52055211
elementOptions?: Map<CommandLineOption>;
5206-
extraKeyDiagnosticMessage?: DiagnosticMessage;
5212+
extraKeyDiagnostics?: DidYouMeanOptionalDiagnostics;
52075213
}
52085214

52095215
/* @internal */

src/testRunner/unittests/config/convertTypeAcquisitionFromJson.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ namespace ts {
111111
},
112112
errors: [
113113
{
114-
category: Diagnostics.Unknown_type_acquisition_option_0.category,
115-
code: Diagnostics.Unknown_type_acquisition_option_0.code,
114+
category: Diagnostics.Unknown_type_acquisition_option_0_Did_you_mean_1.category,
115+
code: Diagnostics.Unknown_type_acquisition_option_0_Did_you_mean_1.code,
116116
file: undefined,
117117
start: 0,
118118
length: 0,
@@ -206,8 +206,8 @@ namespace ts {
206206
},
207207
errors: [
208208
{
209-
category: Diagnostics.Unknown_type_acquisition_option_0.category,
210-
code: Diagnostics.Unknown_type_acquisition_option_0.code,
209+
category: Diagnostics.Unknown_type_acquisition_option_0_Did_you_mean_1.category,
210+
code: Diagnostics.Unknown_type_acquisition_option_0_Did_you_mean_1.code,
211211
file: undefined,
212212
start: 0,
213213
length: 0,

0 commit comments

Comments
 (0)