diff --git a/cmd/tsgo/main.go b/cmd/tsgo/main.go index 40de87ff53..bfb20ab935 100644 --- a/cmd/tsgo/main.go +++ b/cmd/tsgo/main.go @@ -9,6 +9,7 @@ import ( "path/filepath" "runtime" "runtime/pprof" + "slices" "strings" "time" @@ -184,7 +185,7 @@ func main() { var bindTime, checkTime time.Duration - diagnostics := program.GetOptionsDiagnostics() + diagnostics := program.GetConfigFileParsingDiagnostics() if len(diagnostics) != 0 { printDiagnostics(diagnostics, host, compilerOptions) os.Exit(1) @@ -202,7 +203,7 @@ func main() { // !!! the checker already reads noCheck, but do it here just for stats printing for now if compilerOptions.NoCheck.IsFalseOrUnknown() { checkStart := time.Now() - diagnostics = program.GetSemanticDiagnostics(nil) + diagnostics = slices.Concat(program.GetGlobalDiagnostics(), program.GetSemanticDiagnostics(nil)) checkTime = time.Since(checkStart) } } @@ -224,7 +225,7 @@ func main() { runtime.ReadMemStats(&memStats) if !opts.devel.quiet && len(diagnostics) != 0 { - printDiagnostics(diagnostics, host, compilerOptions) + printDiagnostics(ts.SortAndDeduplicateDiagnostics(diagnostics), host, compilerOptions) } if compilerOptions.ListFiles.IsTrue() { diff --git a/internal/ast/diagnostic.go b/internal/ast/diagnostic.go index 8802786d88..d83c9aabca 100644 --- a/internal/ast/diagnostic.go +++ b/internal/ast/diagnostic.go @@ -122,7 +122,7 @@ func (c *DiagnosticsCollection) GetDiagnosticsForFile(fileName string) []*Diagno func (c *DiagnosticsCollection) GetDiagnostics() []*Diagnostic { fileNames := slices.Collect(maps.Keys(c.fileDiagnostics)) slices.Sort(fileNames) - diagnostics := c.nonFileDiagnostics + diagnostics := slices.Clip(c.nonFileDiagnostics) for _, fileName := range fileNames { diagnostics = append(diagnostics, c.fileDiagnostics[fileName]...) } diff --git a/internal/compiler/program.go b/internal/compiler/program.go index f9d8efdbac..4a55d3fc41 100644 --- a/internal/compiler/program.go +++ b/internal/compiler/program.go @@ -20,25 +20,25 @@ import ( ) type ProgramOptions struct { - ConfigFilePath string - RootFiles []string - Host CompilerHost - Options *core.CompilerOptions - SingleThreaded bool - ProjectReference []core.ProjectReference - OptionsDiagnostics []*ast.Diagnostic + ConfigFilePath string + RootFiles []string + Host CompilerHost + Options *core.CompilerOptions + SingleThreaded bool + ProjectReference []core.ProjectReference + ConfigFileParsingDiagnostics []*ast.Diagnostic } type Program struct { - host CompilerHost - programOptions ProgramOptions - compilerOptions *core.CompilerOptions - configFilePath string - nodeModules map[string]*ast.SourceFile - checkers []*checker.Checker - checkersByFile map[*ast.SourceFile]*checker.Checker - currentDirectory string - optionsDiagnostics []*ast.Diagnostic + host CompilerHost + programOptions ProgramOptions + compilerOptions *core.CompilerOptions + configFilePath string + nodeModules map[string]*ast.SourceFile + checkers []*checker.Checker + checkersByFile map[*ast.SourceFile]*checker.Checker + currentDirectory string + configFileParsingDiagnostics []*ast.Diagnostic resolver *module.Resolver resolvedModules map[tspath.Path]module.ModeAwareCache[*module.ResolvedModule] @@ -70,7 +70,7 @@ func NewProgram(options ProgramOptions) *Program { p := &Program{} p.programOptions = options p.compilerOptions = options.Options - p.optionsDiagnostics = options.OptionsDiagnostics + p.configFileParsingDiagnostics = slices.Clip(options.ConfigFileParsingDiagnostics) if p.compilerOptions == nil { p.compilerOptions = &core.CompilerOptions{} } @@ -96,7 +96,7 @@ func NewProgram(options ProgramOptions) *Program { } parsedConfig := parser.ParseJSONText(p.configFilePath, jsonText) if len(parsedConfig.Diagnostics()) > 0 { - p.optionsDiagnostics = append(p.optionsDiagnostics, parsedConfig.Diagnostics()...) + p.configFileParsingDiagnostics = append(p.configFileParsingDiagnostics, parsedConfig.Diagnostics()...) return p } @@ -118,7 +118,7 @@ func NewProgram(options ProgramOptions) *Program { p.compilerOptions = parseConfigFileContent.CompilerOptions() if len(parseConfigFileContent.Errors) > 0 { - p.optionsDiagnostics = append(p.optionsDiagnostics, parseConfigFileContent.Errors...) + p.configFileParsingDiagnostics = append(p.configFileParsingDiagnostics, parseConfigFileContent.Errors...) return p } @@ -162,15 +162,17 @@ func NewProgramFromParsedCommandLine(config *tsoptions.ParsedCommandLine, host C Options: config.CompilerOptions(), Host: host, // todo: ProjectReferences - OptionsDiagnostics: config.GetConfigFileParsingDiagnostics(), + ConfigFileParsingDiagnostics: config.GetConfigFileParsingDiagnostics(), } return NewProgram(programOptions) } -func (p *Program) SourceFiles() []*ast.SourceFile { return p.files } -func (p *Program) Options() *core.CompilerOptions { return p.compilerOptions } -func (p *Program) Host() CompilerHost { return p.host } -func (p *Program) OptionsDiagnostics() []*ast.Diagnostic { return p.optionsDiagnostics } +func (p *Program) SourceFiles() []*ast.SourceFile { return p.files } +func (p *Program) Options() *core.CompilerOptions { return p.compilerOptions } +func (p *Program) Host() CompilerHost { return p.host } +func (p *Program) GetConfigFileParsingDiagnostics() []*ast.Diagnostic { + return slices.Clip(p.configFileParsingDiagnostics) +} func (p *Program) BindSourceFiles() { wg := core.NewWorkGroup(p.programOptions.SingleThreaded) @@ -283,7 +285,7 @@ func (p *Program) getOptionsDiagnosticsOfConfigFile() []*ast.Diagnostic { if p.Options() == nil || p.Options().ConfigFilePath == "" { return nil } - return p.optionsDiagnostics + return p.configFileParsingDiagnostics // TODO: actually call getDiagnosticsHelper on config path } func (p *Program) getSyntaticDiagnosticsForFile(sourceFile *ast.SourceFile) []*ast.Diagnostic { diff --git a/internal/execute/tsc.go b/internal/execute/tsc.go index 1a8f5540d0..545f4519f5 100644 --- a/internal/execute/tsc.go +++ b/internal/execute/tsc.go @@ -172,7 +172,7 @@ func performCompilation(sys System, cb cbType, config *tsoptions.ParsedCommandLi // todo: cache, statistics, tracing program := compiler.NewProgramFromParsedCommandLine(config, host) options := program.Options() - allDiagnostics := program.GetOptionsDiagnostics() + allDiagnostics := program.GetConfigFileParsingDiagnostics() // todo: early exit logic and append diagnostics diagnostics := program.GetSyntacticDiagnostics(nil) @@ -200,11 +200,9 @@ func performCompilation(sys System, cb cbType, config *tsoptions.ParsedCommandLi diagnostics = append(diagnostics, emitResult.Diagnostics...) allDiagnostics = append(allDiagnostics, diagnostics...) - if allDiagnostics != nil { - allDiagnostics = compiler.SortAndDeduplicateDiagnostics(allDiagnostics) - for _, diagnostic := range allDiagnostics { - reportDiagnostic(diagnostic) - } + allDiagnostics = compiler.SortAndDeduplicateDiagnostics(allDiagnostics) + for _, diagnostic := range allDiagnostics { + reportDiagnostic(diagnostic) } // !!! if (write)