Skip to content

Commit ae167de

Browse files
committed
Adds did you mean to convertOptionsFromJson
1 parent 37820de commit ae167de

File tree

1 file changed

+47
-20
lines changed

1 file changed

+47
-20
lines changed

src/compiler/commandLineParser.ts

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,12 +1087,15 @@ namespace ts {
10871087
[option: string]: CompilerOptionsValue | undefined;
10881088
}
10891089

1090-
/** Tuple with error messages for 'unknown compiler option', 'option requires type' */
1091-
type ParseCommandLineWorkerDiagnostics = [DiagnosticMessage, DiagnosticMessage, DiagnosticMessage];
1090+
interface ParseCommandLineWorkerDiagnostics {
1091+
unknownOptionDiagnostic: DiagnosticMessage,
1092+
unknownDidYouMeanDiagnostic: DiagnosticMessage,
1093+
optionTypeMismatchDiagnostic: DiagnosticMessage
1094+
}
10921095

10931096
function parseCommandLineWorker(
10941097
getOptionNameMap: () => OptionNameMap,
1095-
[unknownOptionDiagnostic, unknownDidYouMeanDiagnostic, optionTypeMismatchDiagnostic]: ParseCommandLineWorkerDiagnostics,
1098+
diagnostics: ParseCommandLineWorkerDiagnostics,
10961099
commandLine: readonly string[],
10971100
readFile?: (path: string) => string | undefined) {
10981101
const options = {} as OptionsBase;
@@ -1123,7 +1126,7 @@ namespace ts {
11231126
else {
11241127
// Check to see if no argument was provided (e.g. "--locale" is the last command-line argument).
11251128
if (!args[i] && opt.type !== "boolean") {
1126-
errors.push(createCompilerDiagnostic(optionTypeMismatchDiagnostic, opt.name));
1129+
errors.push(createCompilerDiagnostic(diagnostics.optionTypeMismatchDiagnostic, opt.name));
11271130
}
11281131

11291132
switch (opt.type) {
@@ -1162,10 +1165,10 @@ namespace ts {
11621165
else {
11631166
const possibleOption = getSpellingSuggestion(s, optionDeclarations, opt => `--${opt.name}`);
11641167
if (possibleOption) {
1165-
errors.push(createCompilerDiagnostic(unknownDidYouMeanDiagnostic, s, possibleOption.name));
1168+
errors.push(createCompilerDiagnostic(diagnostics.unknownDidYouMeanDiagnostic, s, possibleOption.name));
11661169
}
11671170
else {
1168-
errors.push(createCompilerDiagnostic(unknownOptionDiagnostic, s));
1171+
errors.push(createCompilerDiagnostic(diagnostics.unknownOptionDiagnostic, s));
11691172
}
11701173
}
11711174
}
@@ -1209,12 +1212,13 @@ namespace ts {
12091212
}
12101213
}
12111214

1215+
const defaultDiagnostics = {
1216+
unknownOptionDiagnostic: Diagnostics.Unknown_compiler_option_0,
1217+
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_compiler_option_0_Did_you_mean_1,
1218+
optionTypeMismatchDiagnostic: Diagnostics.Compiler_option_0_expects_an_argument
1219+
};
12121220
export function parseCommandLine(commandLine: readonly string[], readFile?: (path: string) => string | undefined): ParsedCommandLine {
1213-
return parseCommandLineWorker(getOptionNameMap, [
1214-
Diagnostics.Unknown_compiler_option_0,
1215-
Diagnostics.Unknown_compiler_option_0_Did_you_mean_1,
1216-
Diagnostics.Compiler_option_0_expects_an_argument
1217-
], commandLine, readFile);
1221+
return parseCommandLineWorker(getOptionNameMap, defaultDiagnostics, commandLine, readFile);
12181222
}
12191223

12201224
/** @internal */
@@ -1246,11 +1250,11 @@ namespace ts {
12461250
export function parseBuildCommand(args: readonly string[]): ParsedBuildCommand {
12471251
let buildOptionNameMap: OptionNameMap | undefined;
12481252
const returnBuildOptionNameMap = () => (buildOptionNameMap || (buildOptionNameMap = createOptionNameMap(buildOpts)));
1249-
const { options, fileNames: projects, errors } = parseCommandLineWorker(returnBuildOptionNameMap, [
1250-
Diagnostics.Unknown_build_option_0,
1251-
Diagnostics.Unknown_compiler_option_0_Did_you_mean_1,
1252-
Diagnostics.Build_option_0_requires_a_value_of_type_1
1253-
], args);
1253+
const { options, fileNames: projects, errors } = parseCommandLineWorker(returnBuildOptionNameMap, {
1254+
unknownOptionDiagnostic: Diagnostics.Unknown_build_option_0,
1255+
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_compiler_option_0_Did_you_mean_1,
1256+
optionTypeMismatchDiagnostic: Diagnostics.Build_option_0_requires_a_value_of_type_1
1257+
}, args);
12541258
const buildOptions = options as BuildOptions;
12551259

12561260
if (projects.length === 0) {
@@ -2476,7 +2480,12 @@ namespace ts {
24762480
basePath: string, errors: Push<Diagnostic>, configFileName?: string): CompilerOptions {
24772481

24782482
const options = getDefaultCompilerOptions(configFileName);
2479-
convertOptionsFromJson(optionDeclarations, jsonOptions, basePath, options, Diagnostics.Unknown_compiler_option_0, errors);
2483+
2484+
const diagnostics = {
2485+
unknownOptionDiagnostic: Diagnostics.Unknown_compiler_option_0,
2486+
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_compiler_option_0_Did_you_mean_1 ,
2487+
};
2488+
convertOptionsFromJson(optionDeclarations, jsonOptions, basePath, options, diagnostics, errors);
24802489
if (configFileName) {
24812490
options.configFilePath = normalizeSlashes(configFileName);
24822491
}
@@ -2492,13 +2501,25 @@ namespace ts {
24922501

24932502
const options = getDefaultTypeAcquisition(configFileName);
24942503
const typeAcquisition = convertEnableAutoDiscoveryToEnable(jsonOptions);
2495-
convertOptionsFromJson(typeAcquisitionDeclarations, typeAcquisition, basePath, options, Diagnostics.Unknown_type_acquisition_option_0, errors);
2504+
2505+
const diagnostics = {
2506+
unknownOptionDiagnostic: Diagnostics.Unknown_compiler_option_0,
2507+
unknownDidYouMeanDiagnostic: Diagnostics.Unknown_compiler_option_0_Did_you_mean_1 ,
2508+
};
2509+
convertOptionsFromJson(typeAcquisitionDeclarations, typeAcquisition, basePath, options, diagnostics, errors);
24962510

24972511
return options;
24982512
}
24992513

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

25032524
if (!jsonOptions) {
25042525
return;
@@ -2512,7 +2533,13 @@ namespace ts {
25122533
defaultOptions[opt.name] = convertJsonOption(opt, jsonOptions[id], basePath, errors);
25132534
}
25142535
else {
2515-
errors.push(createCompilerDiagnostic(diagnosticMessage, id));
2536+
const possibleOption = getSpellingSuggestion(id, <CommandLineOption[]>optionDeclarations, opt => opt.name);
2537+
if (possibleOption) {
2538+
errors.push(createCompilerDiagnostic(diagnostics.unknownDidYouMeanDiagnostic, id, possibleOption.name));
2539+
}
2540+
else {
2541+
errors.push(createCompilerDiagnostic(diagnostics.unknownOptionDiagnostic, id));
2542+
}
25162543
}
25172544
}
25182545
}

0 commit comments

Comments
 (0)