Specified diagnostic for CLI flags mismatched with/out --build (#43199)

* Specified diagnostic for CLI flags missing a required --build

* Switched to an alternateMode member

* Added --build-incompatible flags too

* Small fixups to remove a hardcoding

* Switched to ||= factories

* Not a function

* I think I get it now
This commit is contained in:
Josh Goldberg
2021-04-07 19:03:17 -04:00
committed by GitHub
parent 2f82d02361
commit fe4a6709da
4 changed files with 87 additions and 13 deletions

View File

@@ -306,10 +306,8 @@ namespace ts {
description: Diagnostics.Specify_ECMAScript_target_version_Colon_ES3_default_ES5_ES2015_ES2016_ES2017_ES2018_ES2019_ES2020_ES2021_or_ESNEXT,
};
/* @internal */
export const optionDeclarations: CommandLineOption[] = [
const commandOptionsWithoutBuild: CommandLineOption[] = [
// CommandLine only options
...commonOptionsWithBuild,
{
name: "all",
type: "boolean",
@@ -1106,6 +1104,12 @@ namespace ts {
},
];
/* @internal */
export const optionDeclarations: CommandLineOption[] = [
...commonOptionsWithBuild,
...commandOptionsWithoutBuild,
];
/* @internal */
export const semanticDiagnosticsOptionDeclarations: readonly CommandLineOption[] =
optionDeclarations.filter(option => !!option.affectsSemanticDiagnostics);
@@ -1126,9 +1130,7 @@ namespace ts {
export const transpileOptionValueCompilerOptions: readonly CommandLineOption[] = optionDeclarations.filter(option =>
hasProperty(option, "transpileOptionValue"));
/* @internal */
export const buildOpts: CommandLineOption[] = [
...commonOptionsWithBuild,
const commandOptionsOnlyBuild: CommandLineOption[] = [
{
name: "verbose",
shortName: "v",
@@ -1158,6 +1160,12 @@ namespace ts {
}
];
/* @internal */
export const buildOpts: CommandLineOption[] = [
...commonOptionsWithBuild,
...commandOptionsOnlyBuild,
];
/* @internal */
export const typeAcquisitionDeclarations: CommandLineOption[] = [
{
@@ -1217,9 +1225,14 @@ namespace ts {
/* @internal */
export function getOptionsNameMap(): OptionsNameMap {
return optionsNameMapCache || (optionsNameMapCache = createOptionNameMap(optionDeclarations));
return optionsNameMapCache ||= createOptionNameMap(optionDeclarations);
}
const compilerOptionsAlternateMode: AlternateModeDiagnostics = {
diagnostic: Diagnostics.Compiler_option_0_may_only_be_used_with_build,
getOptionsNameMap: getBuildOptionsNameMap
};
/* @internal */
export const defaultInitCompilerOptions: CompilerOptions = {
module: ModuleKind.CommonJS,
@@ -1299,6 +1312,10 @@ namespace ts {
createDiagnostics: (message: DiagnosticMessage, arg0: string, arg1?: string) => Diagnostic,
unknownOptionErrorText?: string
) {
if (diagnostics.alternateMode?.getOptionsNameMap().optionsNameMap.has(unknownOption.toLowerCase())) {
return createDiagnostics(diagnostics.alternateMode.diagnostic, unknownOption);
}
const possibleOption = getSpellingSuggestion(unknownOption, diagnostics.optionDeclarations, getOptionName);
return possibleOption ?
createDiagnostics(diagnostics.unknownDidYouMeanDiagnostic, unknownOptionErrorText || unknownOption, possibleOption.name) :
@@ -1464,6 +1481,7 @@ namespace ts {
/*@internal*/
export const compilerOptionsDidYouMeanDiagnostics: ParseCommandLineWorkerDiagnostics = {
alternateMode: compilerOptionsAlternateMode,
getOptionsNameMap,
optionDeclarations,
unknownOptionDiagnostic: Diagnostics.Unknown_compiler_option_0,
@@ -1505,7 +1523,13 @@ namespace ts {
return buildOptionsNameMapCache || (buildOptionsNameMapCache = createOptionNameMap(buildOpts));
}
const buildOptionsAlternateMode: AlternateModeDiagnostics = {
diagnostic: Diagnostics.Compiler_option_0_may_not_be_used_with_build,
getOptionsNameMap
};
const buildOptionsDidYouMeanDiagnostics: ParseCommandLineWorkerDiagnostics = {
alternateMode: buildOptionsAlternateMode,
getOptionsNameMap: getBuildOptionsNameMap,
optionDeclarations: buildOpts,
unknownOptionDiagnostic: Diagnostics.Unknown_build_option_0,