Harden diagnostic handling and warning presentation

This commit is contained in:
2026-08-27 18:41:59 +00:00
parent 1025001f20
commit 079d5af337
67 changed files with 518 additions and 318 deletions

View File

@@ -281,6 +281,10 @@ type diagnosticsFile struct {
}
func logicalFiles(req contracts.OutputRequest, options Options) ([]contracts.OutputFile, error) {
diagnosticProjection, err := contracts.ProjectDiagnosticCollection(req.Diagnostics)
if err != nil {
return nil, encoderErrorf("diagnostics: %w", err)
}
outputs := cloneNormalizeOutputs(req.NormalizeOutputs)
sort.SliceStable(outputs, func(i, j int) bool {
return outputs[i].LaneID < outputs[j].LaneID
@@ -351,11 +355,11 @@ func logicalFiles(req contracts.OutputRequest, options Options) ([]contracts.Out
if err != nil {
return nil, err
}
warningsOutput, err := jsonFile("warnings.json", newWarningsFile(req.Diagnostics))
warningsOutput, err := jsonFile("warnings.json", newWarningsFile(diagnosticProjection))
if err != nil {
return nil, err
}
diagnosticsOutput, err := jsonFile("diagnostics.json", newDiagnosticsFile(req.Diagnostics))
diagnosticsOutput, err := jsonFile("diagnostics.json", newDiagnosticsFile(req.Diagnostics, diagnosticProjection))
if err != nil {
return nil, err
}
@@ -510,56 +514,26 @@ func cloneRejected(rejected []contracts.RejectedOutput) []contracts.RejectedOutp
return append([]contracts.RejectedOutput(nil), rejected...)
}
func newWarningsFile(collection contracts.DiagnosticCollection) warningsFile {
groups := diagnosticGroupsByDisposition(collection, contracts.DiagnosticDispositionWarning)
func newWarningsFile(projection contracts.DiagnosticProjection) warningsFile {
return warningsFile{
SchemaVersion: warningsSchemaVersion,
GroupCount: len(groups),
OccurrenceCount: diagnosticOccurrenceCount(groups),
Groups: groups,
GroupCount: len(projection.Warnings),
OccurrenceCount: projection.WarningOccurrenceCount,
Groups: projection.Warnings,
}
}
func newDiagnosticsFile(collection contracts.DiagnosticCollection) diagnosticsFile {
groups := diagnosticGroupsExceptDisposition(collection, contracts.DiagnosticDispositionWarning)
func newDiagnosticsFile(collection contracts.DiagnosticCollection, projection contracts.DiagnosticProjection) diagnosticsFile {
return diagnosticsFile{
SchemaVersion: diagnosticsSchemaVersion,
GroupCount: len(groups),
OccurrenceCount: diagnosticOccurrenceCount(groups) + collection.UnrepresentedOccurrenceCount,
GroupCount: len(projection.Diagnostics),
OccurrenceCount: projection.DiagnosticOccurrenceCount,
Truncated: collection.Truncated,
UnrepresentedOccurrenceCount: collection.UnrepresentedOccurrenceCount,
Groups: groups,
Groups: projection.Diagnostics,
}
}
func diagnosticGroupsByDisposition(collection contracts.DiagnosticCollection, disposition contracts.DiagnosticDisposition) []contracts.DiagnosticGroup {
groups := make([]contracts.DiagnosticGroup, 0)
for _, group := range collection.Groups {
if group.Disposition == disposition {
groups = append(groups, group)
}
}
return contracts.CloneDiagnosticCollection(contracts.DiagnosticCollection{Groups: groups}).Groups
}
func diagnosticGroupsExceptDisposition(collection contracts.DiagnosticCollection, disposition contracts.DiagnosticDisposition) []contracts.DiagnosticGroup {
groups := make([]contracts.DiagnosticGroup, 0)
for _, group := range collection.Groups {
if group.Disposition != disposition {
groups = append(groups, group)
}
}
return contracts.CloneDiagnosticCollection(contracts.DiagnosticCollection{Groups: groups}).Groups
}
func diagnosticOccurrenceCount(groups []contracts.DiagnosticGroup) int {
count := 0
for _, group := range groups {
count += group.OccurrenceCount
}
return count
}
func encoderErrorf(format string, args ...any) error {
return fmt.Errorf("json output encoder: "+format, args...)
}