diff --git a/internal/tsoptions/errors.go b/internal/tsoptions/errors.go index c6651048eb..353a2246d3 100644 --- a/internal/tsoptions/errors.go +++ b/internal/tsoptions/errors.go @@ -40,9 +40,26 @@ func (parser *commandLineParser) createUnknownOptionError( unknownOption string, unknownOptionErrorText string, node *ast.Node, - sourceFile *ast.SourceFile, // todo: TsConfigSourceFile, + sourceFile *ast.SourceFile, +) *ast.Diagnostic { + return createUnknownOptionError( + unknownOption, + parser.UnknownOptionDiagnostic(), + unknownOptionErrorText, + node, + sourceFile, + parser.AlternateMode(), + ) +} + +func createUnknownOptionError( + unknownOption string, + unknownOptionDiagnostic *diagnostics.Message, + unknownOptionErrorText string, // optional + node *ast.Node, // optional + sourceFile *ast.SourceFile, // optional + alternateMode *AlternateModeDiagnostics, // optional ) *ast.Diagnostic { - alternateMode := parser.AlternateMode() if alternateMode != nil && alternateMode.optionsNameMap != nil { otherOption := alternateMode.optionsNameMap.Get(strings.ToLower(unknownOption)) if otherOption != nil { @@ -58,7 +75,7 @@ func (parser *commandLineParser) createUnknownOptionError( unknownOptionErrorText = unknownOption } // TODO: possibleOption := spelling suggestion - return createDiagnosticForNodeInSourceFileOrCompilerDiagnostic(sourceFile, node, parser.UnknownOptionDiagnostic(), unknownOptionErrorText) + return createDiagnosticForNodeInSourceFileOrCompilerDiagnostic(sourceFile, node, unknownOptionDiagnostic, unknownOptionErrorText) } func createDiagnosticForNodeInSourceFileOrCompilerDiagnostic(sourceFile *ast.SourceFile, node *ast.Node, message *diagnostics.Message, args ...any) *ast.Diagnostic { @@ -67,3 +84,16 @@ func createDiagnosticForNodeInSourceFileOrCompilerDiagnostic(sourceFile *ast.Sou } return ast.NewCompilerDiagnostic(message, args...) } + +func extraKeyDiagnostics(s string) *diagnostics.Message { + switch s { + case "compilerOptions": + return diagnostics.Unknown_compiler_option_0 + case "watchOptions": + return diagnostics.Unknown_watch_option_0 + case "typeAcquisition": + return diagnostics.Unknown_type_acquisition_option_0 + default: + return nil + } +} diff --git a/internal/tsoptions/parsinghelpers.go b/internal/tsoptions/parsinghelpers.go index 021f3de9bd..f69a269a91 100644 --- a/internal/tsoptions/parsinghelpers.go +++ b/internal/tsoptions/parsinghelpers.go @@ -6,6 +6,7 @@ import ( "github.com/microsoft/typescript-go/internal/ast" "github.com/microsoft/typescript-go/internal/collections" "github.com/microsoft/typescript-go/internal/core" + "github.com/microsoft/typescript-go/internal/diagnostics" "github.com/microsoft/typescript-go/internal/tspath" ) @@ -118,6 +119,7 @@ func parseJsonToStringKey(json any) *collections.OrderedMap[string, any] { type optionParser interface { ParseOption(key string, value any) []*ast.Diagnostic + UnknownOptionDiagnostic() *diagnostics.Message } type compilerOptionsParser struct { @@ -128,6 +130,10 @@ func (o *compilerOptionsParser) ParseOption(key string, value any) []*ast.Diagno return ParseCompilerOptions(key, value, o.CompilerOptions) } +func (o *compilerOptionsParser) UnknownOptionDiagnostic() *diagnostics.Message { + return extraKeyDiagnostics("compilerOptions") +} + type watchOptionsParser struct { *core.WatchOptions } @@ -136,6 +142,10 @@ func (o *watchOptionsParser) ParseOption(key string, value any) []*ast.Diagnosti return ParseWatchOptions(key, value, o.WatchOptions) } +func (o *watchOptionsParser) UnknownOptionDiagnostic() *diagnostics.Message { + return extraKeyDiagnostics("watchOptions") +} + type typeAcquisitionParser struct { *core.TypeAcquisition } @@ -144,6 +154,10 @@ func (o *typeAcquisitionParser) ParseOption(key string, value any) []*ast.Diagno return ParseTypeAcquisition(key, value, o.TypeAcquisition) } +func (o *typeAcquisitionParser) UnknownOptionDiagnostic() *diagnostics.Message { + return extraKeyDiagnostics("typeAcquisition") +} + func ParseCompilerOptions(key string, value any, allOptions *core.CompilerOptions) []*ast.Diagnostic { if value == nil { return nil diff --git a/internal/tsoptions/tsconfigparsing.go b/internal/tsoptions/tsconfigparsing.go index 110ce723d3..0d7419dd04 100644 --- a/internal/tsoptions/tsconfigparsing.go +++ b/internal/tsoptions/tsconfigparsing.go @@ -185,10 +185,18 @@ func parseOwnConfigOfJsonSourceFile( parseDiagnostics = ParseTypeAcquisition(option.Name, value, typeAcquisition) } propertySetErrors = append(propertySetErrors, parseDiagnostics...) - } else if keyText != "" { + } else if keyText != "" && extraKeyDiagnostics(parentOption.Name) != nil { + unknownNameDiag := extraKeyDiagnostics(parentOption.Name) if parentOption.ElementOptions != nil { // !!! TODO: support suggestion - propertySetErrors = append(propertySetErrors, createDiagnosticForNodeInSourceFileOrCompilerDiagnostic(sourceFile, propertyAssignment.Name(), diagnostics.Unknown_compiler_option_0, keyText)) + propertySetErrors = append(propertySetErrors, createUnknownOptionError( + keyText, + unknownNameDiag, + "", /*unknownOptionErrorText*/ + propertyAssignment.Name(), + sourceFile, + nil, /*alternateMode*/ + )) } else { // errors = append(errors, ast.NewCompilerDiagnostic(diagnostics.Unknown_compiler_option_0_Did_you_mean_1, keyText, core.FindKey(parentOption.ElementOptions, keyText))) } @@ -556,7 +564,7 @@ func convertOptionsFromJson[O optionParser](optionsNameMap map[string]*CommandLi opt, ok := optionsNameMap[key] if !ok { // !!! TODO?: support suggestion - errors = append(errors, ast.NewCompilerDiagnostic(diagnostics.Unknown_compiler_option_0, key)) + errors = append(errors, createUnknownOptionError(key, result.UnknownOptionDiagnostic(), "", nil, nil, nil)) continue } diff --git a/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format jsconfig.json to typeAcquisition with json api.js b/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format jsconfig.json to typeAcquisition with json api.js index e80ae60595..56dde16f0c 100644 --- a/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format jsconfig.json to typeAcquisition with json api.js +++ b/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format jsconfig.json to typeAcquisition with json api.js @@ -32,4 +32,4 @@ TypeAcquisition:: FileNames:: /apath/a.ts,/apath/b.ts Errors:: -error TS5023: Unknown compiler option 'enableAutoDiscovy'. +error TS17010: Unknown type acquisition option 'enableAutoDiscovy'. diff --git a/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format jsconfig.json to typeAcquisition with jsonSourceFile api.js b/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format jsconfig.json to typeAcquisition with jsonSourceFile api.js index be38d7de0b..bc06bbe1df 100644 --- a/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format jsconfig.json to typeAcquisition with jsonSourceFile api.js +++ b/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format jsconfig.json to typeAcquisition with jsonSourceFile api.js @@ -32,7 +32,7 @@ TypeAcquisition:: FileNames:: /apath/a.ts,/apath/b.ts Errors:: -jsconfig.json:3:3 - error TS5023: Unknown compiler option 'enableAutoDiscovy'. +jsconfig.json:3:3 - error TS17010: Unknown type acquisition option 'enableAutoDiscovy'. 3 "enableAutoDiscovy": true,    ~~~~~~~~~~~~~~~~~~~ diff --git a/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format tsconfig.json to typeAcquisition with json api.js b/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format tsconfig.json to typeAcquisition with json api.js index 335110d695..d6e32be5dd 100644 --- a/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format tsconfig.json to typeAcquisition with json api.js +++ b/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format tsconfig.json to typeAcquisition with json api.js @@ -25,4 +25,4 @@ TypeAcquisition:: FileNames:: /apath/a.ts,/apath/b.ts Errors:: -error TS5023: Unknown compiler option 'enableAutoDiscovy'. +error TS17010: Unknown type acquisition option 'enableAutoDiscovy'. diff --git a/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format tsconfig.json to typeAcquisition with jsonSourceFile api.js b/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format tsconfig.json to typeAcquisition with jsonSourceFile api.js index 39f13e3c99..5558dd2a1f 100644 --- a/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format tsconfig.json to typeAcquisition with jsonSourceFile api.js +++ b/testdata/baselines/reference/config/tsconfigParsing/Convert incorrect format tsconfig.json to typeAcquisition with jsonSourceFile api.js @@ -25,7 +25,7 @@ TypeAcquisition:: FileNames:: /apath/a.ts,/apath/b.ts Errors:: -tsconfig.json:3:3 - error TS5023: Unknown compiler option 'enableAutoDiscovy'. +tsconfig.json:3:3 - error TS17010: Unknown type acquisition option 'enableAutoDiscovy'. 3 "enableAutoDiscovy": true,    ~~~~~~~~~~~~~~~~~~~