From fb51fbd3b5f722d91100b3cce1d01016b097c395 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:03:04 -0700 Subject: [PATCH 1/5] File loader diags --- internal/compiler/fileloader.go | 17 +++++++++++++++++ internal/compiler/parsetask.go | 1 + internal/compiler/program.go | 7 +++++++ internal/execute/tsc.go | 1 + internal/testutil/harnessutil/harnessutil.go | 1 + 5 files changed, 27 insertions(+) diff --git a/internal/compiler/fileloader.go b/internal/compiler/fileloader.go index 708307c455..0a9ca6bc03 100644 --- a/internal/compiler/fileloader.go +++ b/internal/compiler/fileloader.go @@ -54,6 +54,7 @@ type processedFiles struct { // List of present unsupported extensions unsupportedExtensions []string sourceFilesFoundSearchingNodeModules collections.Set[tspath.Path] + fileLoadDiagnostics *ast.DiagnosticsCollection } type jsxRuntimeImportSpecifier struct { @@ -132,6 +133,7 @@ func processAllProgramFiles( var unsupportedExtensions []string var sourceFilesFoundSearchingNodeModules collections.Set[tspath.Path] var libFileSet collections.Set[tspath.Path] + fileLoadDiagnostics := &ast.DiagnosticsCollection{} loader.parseTasks.collect(&loader, loader.rootTasks, func(task *parseTask, _ []tspath.Path) { if task.isRedirected { @@ -159,6 +161,18 @@ func processAllProgramFiles( resolvedModules[path] = task.resolutionsInFile typeResolutionsInFile[path] = task.typeResolutionsInFile sourceFileMetaDatas[path] = task.metadata + + // Collect resolution diagnostics from resolved modules and type reference directives + for _, resolvedModule := range task.resolutionsInFile { + for _, diag := range resolvedModule.ResolutionDiagnostics { + fileLoadDiagnostics.Add(&diag) + } + } + for _, resolvedTypeRef := range task.typeResolutionsInFile { + for _, diag := range resolvedTypeRef.ResolutionDiagnostics { + fileLoadDiagnostics.Add(&diag) + } + } if task.jsxRuntimeImportSpecifier != nil { if jsxRuntimeImportSpecifiers == nil { jsxRuntimeImportSpecifiers = make(map[tspath.Path]*jsxRuntimeImportSpecifier, totalFileCount) @@ -201,6 +215,7 @@ func processAllProgramFiles( unsupportedExtensions: unsupportedExtensions, sourceFilesFoundSearchingNodeModules: sourceFilesFoundSearchingNodeModules, libFiles: libFileSet, + fileLoadDiagnostics: fileLoadDiagnostics, } } @@ -372,6 +387,8 @@ func (p *fileLoader) resolveTypeReferenceDirectives(t *parseTask) { resolutionMode := getModeForTypeReferenceDirectiveInFile(ref, file, meta, module.GetCompilerOptionsWithRedirect(p.opts.Config.CompilerOptions(), redirect)) resolved := p.resolver.ResolveTypeReferenceDirective(ref.FileName, file.FileName(), resolutionMode, redirect) typeResolutionsInFile[module.ModeAwareCacheKey{Name: ref.FileName, Mode: resolutionMode}] = resolved + + // Collect diagnostics from the resolved type reference directive if resolved.IsResolved() { t.addSubTask(resolvedRef{ fileName: resolved.ResolvedFileName, diff --git a/internal/compiler/parsetask.go b/internal/compiler/parsetask.go index ebb6fdcce3..b0e55d6c1b 100644 --- a/internal/compiler/parsetask.go +++ b/internal/compiler/parsetask.go @@ -22,6 +22,7 @@ type parseTask struct { metadata ast.SourceFileMetaData resolutionsInFile module.ModeAwareCache[*module.ResolvedModule] typeResolutionsInFile module.ModeAwareCache[*module.ResolvedTypeReferenceDirective] + resolutionDiagnostics []ast.Diagnostic importHelpersImportSpecifier *ast.Node jsxRuntimeImportSpecifier *jsxRuntimeImportSpecifier increaseDepth bool diff --git a/internal/compiler/program.go b/internal/compiler/program.go index 7dbd620a6e..5293b482e1 100644 --- a/internal/compiler/program.go +++ b/internal/compiler/program.go @@ -330,6 +330,13 @@ func (p *Program) GetSuggestionDiagnostics(ctx context.Context, sourceFile *ast. return p.getDiagnosticsHelper(ctx, sourceFile, true /*ensureBound*/, true /*ensureChecked*/, p.getSuggestionDiagnosticsForFile) } +func (p *Program) GetFileLoadDiagnostics() []*ast.Diagnostic { + if p.fileLoadDiagnostics == nil { + return nil + } + return SortAndDeduplicateDiagnostics(p.fileLoadDiagnostics.GetDiagnostics()) +} + func (p *Program) GetGlobalDiagnostics(ctx context.Context) []*ast.Diagnostic { var globalDiagnostics []*ast.Diagnostic checkers, done := p.checkerPool.GetAllCheckers(ctx) diff --git a/internal/execute/tsc.go b/internal/execute/tsc.go index f680ff880a..0d97a13180 100644 --- a/internal/execute/tsc.go +++ b/internal/execute/tsc.go @@ -296,6 +296,7 @@ func emitFilesAndReportErrors(sys System, program *compiler.Program, reportDiagn configFileParsingDiagnosticsLength := len(allDiagnostics) allDiagnostics = append(allDiagnostics, program.GetSyntacticDiagnostics(ctx, nil)...) + allDiagnostics = append(allDiagnostics, program.GetFileLoadDiagnostics()...) if len(allDiagnostics) == configFileParsingDiagnosticsLength { // Options diagnostics include global diagnostics (even though we collect them separately), diff --git a/internal/testutil/harnessutil/harnessutil.go b/internal/testutil/harnessutil/harnessutil.go index 9c2c324ef7..7f64e5355d 100644 --- a/internal/testutil/harnessutil/harnessutil.go +++ b/internal/testutil/harnessutil/harnessutil.go @@ -575,6 +575,7 @@ func compileFilesWithHost( ctx := context.Background() program := createProgram(host, config) var diagnostics []*ast.Diagnostic + diagnostics = append(diagnostics, program.GetFileLoadDiagnostics()...) diagnostics = append(diagnostics, program.GetSyntacticDiagnostics(ctx, nil)...) diagnostics = append(diagnostics, program.GetSemanticDiagnostics(ctx, nil)...) diagnostics = append(diagnostics, program.GetGlobalDiagnostics(ctx)...) From 9bb8923e2ec1c377b37a20e3f5a4c4ab56958ff1 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:14:15 -0700 Subject: [PATCH 2/5] more --- internal/compiler/program.go | 6 ++---- internal/execute/tsc.go | 2 +- internal/testutil/harnessutil/harnessutil.go | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/internal/compiler/program.go b/internal/compiler/program.go index 5293b482e1..f1369c3c07 100644 --- a/internal/compiler/program.go +++ b/internal/compiler/program.go @@ -330,10 +330,8 @@ func (p *Program) GetSuggestionDiagnostics(ctx context.Context, sourceFile *ast. return p.getDiagnosticsHelper(ctx, sourceFile, true /*ensureBound*/, true /*ensureChecked*/, p.getSuggestionDiagnosticsForFile) } -func (p *Program) GetFileLoadDiagnostics() []*ast.Diagnostic { - if p.fileLoadDiagnostics == nil { - return nil - } +func (p *Program) GetProgramDiagnostics() []*ast.Diagnostic { + // !!! return SortAndDeduplicateDiagnostics(p.fileLoadDiagnostics.GetDiagnostics()) } diff --git a/internal/execute/tsc.go b/internal/execute/tsc.go index 0d97a13180..c2fefa12bd 100644 --- a/internal/execute/tsc.go +++ b/internal/execute/tsc.go @@ -296,7 +296,7 @@ func emitFilesAndReportErrors(sys System, program *compiler.Program, reportDiagn configFileParsingDiagnosticsLength := len(allDiagnostics) allDiagnostics = append(allDiagnostics, program.GetSyntacticDiagnostics(ctx, nil)...) - allDiagnostics = append(allDiagnostics, program.GetFileLoadDiagnostics()...) + allDiagnostics = append(allDiagnostics, program.GetProgramDiagnostics()...) if len(allDiagnostics) == configFileParsingDiagnosticsLength { // Options diagnostics include global diagnostics (even though we collect them separately), diff --git a/internal/testutil/harnessutil/harnessutil.go b/internal/testutil/harnessutil/harnessutil.go index 7f64e5355d..043bfa27cb 100644 --- a/internal/testutil/harnessutil/harnessutil.go +++ b/internal/testutil/harnessutil/harnessutil.go @@ -575,7 +575,7 @@ func compileFilesWithHost( ctx := context.Background() program := createProgram(host, config) var diagnostics []*ast.Diagnostic - diagnostics = append(diagnostics, program.GetFileLoadDiagnostics()...) + diagnostics = append(diagnostics, program.GetProgramDiagnostics()...) diagnostics = append(diagnostics, program.GetSyntacticDiagnostics(ctx, nil)...) diagnostics = append(diagnostics, program.GetSemanticDiagnostics(ctx, nil)...) diagnostics = append(diagnostics, program.GetGlobalDiagnostics(ctx)...) From 0247b42f455ced8b0ac73a7356b7e28dfde21bd7 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:15:14 -0700 Subject: [PATCH 3/5] remove outdated comment: --- internal/compiler/fileloader.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/compiler/fileloader.go b/internal/compiler/fileloader.go index 0a9ca6bc03..3c5073d8f3 100644 --- a/internal/compiler/fileloader.go +++ b/internal/compiler/fileloader.go @@ -388,7 +388,6 @@ func (p *fileLoader) resolveTypeReferenceDirectives(t *parseTask) { resolved := p.resolver.ResolveTypeReferenceDirective(ref.FileName, file.FileName(), resolutionMode, redirect) typeResolutionsInFile[module.ModeAwareCacheKey{Name: ref.FileName, Mode: resolutionMode}] = resolved - // Collect diagnostics from the resolved type reference directive if resolved.IsResolved() { t.addSubTask(resolvedRef{ fileName: resolved.ResolvedFileName, From 8be0f5ad407844a60c01c9e1415220890b646b42 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:49:47 -0700 Subject: [PATCH 4/5] refactor --- internal/compiler/fileloader.go | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/internal/compiler/fileloader.go b/internal/compiler/fileloader.go index 3c5073d8f3..963ccef45a 100644 --- a/internal/compiler/fileloader.go +++ b/internal/compiler/fileloader.go @@ -162,17 +162,6 @@ func processAllProgramFiles( typeResolutionsInFile[path] = task.typeResolutionsInFile sourceFileMetaDatas[path] = task.metadata - // Collect resolution diagnostics from resolved modules and type reference directives - for _, resolvedModule := range task.resolutionsInFile { - for _, diag := range resolvedModule.ResolutionDiagnostics { - fileLoadDiagnostics.Add(&diag) - } - } - for _, resolvedTypeRef := range task.typeResolutionsInFile { - for _, diag := range resolvedTypeRef.ResolutionDiagnostics { - fileLoadDiagnostics.Add(&diag) - } - } if task.jsxRuntimeImportSpecifier != nil { if jsxRuntimeImportSpecifiers == nil { jsxRuntimeImportSpecifiers = make(map[tspath.Path]*jsxRuntimeImportSpecifier, totalFileCount) @@ -197,8 +186,28 @@ func processAllProgramFiles( allFiles := append(libFiles, files...) + for _, resolutions := range resolvedModules { + for _, resolvedModule := range resolutions { + for _, diag := range resolvedModule.ResolutionDiagnostics { + fileLoadDiagnostics.Add(&diag) + } + } + } + for _, typeResolutions := range typeResolutionsInFile { + for _, resolvedTypeRef := range typeResolutions { + for _, diag := range resolvedTypeRef.ResolutionDiagnostics { + fileLoadDiagnostics.Add(&diag) + } + } + } + loader.pathForLibFileResolutions.Range(func(key tspath.Path, value module.ModeAwareCache[*module.ResolvedModule]) bool { resolvedModules[key] = value + for _, resolvedModule := range value { + for _, diag := range resolvedModule.ResolutionDiagnostics { + fileLoadDiagnostics.Add(&diag) + } + } return true }) From 3c514288d2edb286d3314196ab1920462790cbbf Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:56:32 -0700 Subject: [PATCH 5/5] update --- internal/compiler/fileloader.go | 6 +++--- internal/compiler/parsetask.go | 2 +- internal/module/resolver.go | 2 +- internal/module/types.go | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/compiler/fileloader.go b/internal/compiler/fileloader.go index 963ccef45a..431eb7b04a 100644 --- a/internal/compiler/fileloader.go +++ b/internal/compiler/fileloader.go @@ -189,14 +189,14 @@ func processAllProgramFiles( for _, resolutions := range resolvedModules { for _, resolvedModule := range resolutions { for _, diag := range resolvedModule.ResolutionDiagnostics { - fileLoadDiagnostics.Add(&diag) + fileLoadDiagnostics.Add(diag) } } } for _, typeResolutions := range typeResolutionsInFile { for _, resolvedTypeRef := range typeResolutions { for _, diag := range resolvedTypeRef.ResolutionDiagnostics { - fileLoadDiagnostics.Add(&diag) + fileLoadDiagnostics.Add(diag) } } } @@ -205,7 +205,7 @@ func processAllProgramFiles( resolvedModules[key] = value for _, resolvedModule := range value { for _, diag := range resolvedModule.ResolutionDiagnostics { - fileLoadDiagnostics.Add(&diag) + fileLoadDiagnostics.Add(diag) } } return true diff --git a/internal/compiler/parsetask.go b/internal/compiler/parsetask.go index b0e55d6c1b..9d7045bfc4 100644 --- a/internal/compiler/parsetask.go +++ b/internal/compiler/parsetask.go @@ -22,7 +22,7 @@ type parseTask struct { metadata ast.SourceFileMetaData resolutionsInFile module.ModeAwareCache[*module.ResolvedModule] typeResolutionsInFile module.ModeAwareCache[*module.ResolvedTypeReferenceDirective] - resolutionDiagnostics []ast.Diagnostic + resolutionDiagnostics []*ast.Diagnostic importHelpersImportSpecifier *ast.Node jsxRuntimeImportSpecifier *jsxRuntimeImportSpecifier increaseDepth bool diff --git a/internal/module/resolver.go b/internal/module/resolver.go index d054c1846d..7630b78eea 100644 --- a/internal/module/resolver.go +++ b/internal/module/resolver.go @@ -54,7 +54,7 @@ type resolutionState struct { resolvedPackageDirectory bool failedLookupLocations []string affectingLocations []string - diagnostics []ast.Diagnostic + diagnostics []*ast.Diagnostic } func newResolutionState( diff --git a/internal/module/types.go b/internal/module/types.go index d0acc036da..f3c78cc715 100644 --- a/internal/module/types.go +++ b/internal/module/types.go @@ -63,7 +63,7 @@ func (p *PackageId) PackageName() string { type LookupLocations struct { FailedLookupLocations []string AffectingLocations []string - ResolutionDiagnostics []ast.Diagnostic + ResolutionDiagnostics []*ast.Diagnostic } type ResolvedModule struct {