in go/tools/builders/nogo_main.go [368:446]
func checkAnalysisResults(actions []*action, pkg *goPackage) string {
type entry struct {
analysis.Diagnostic
*analysis.Analyzer
}
var diagnostics []entry
var errs []error
for _, act := range actions {
if act.err != nil {
// Analyzer failed.
errs = append(errs, fmt.Errorf("analyzer %q failed: %v", act.a.Name, act.err))
continue
}
if len(act.diagnostics) == 0 {
continue
}
config, ok := configs[act.a.Name]
if !ok {
// If the analyzer is not explicitly configured, it emits diagnostics for
// all files.
for _, diag := range act.diagnostics {
diagnostics = append(diagnostics, entry{Diagnostic: diag, Analyzer: act.a})
}
continue
}
// Discard diagnostics based on the analyzer configuration.
for _, d := range act.diagnostics {
// NOTE(golang.org/issue/31008): nilness does not set positions,
// so don't assume the position is valid.
p := pkg.fset.Position(d.Pos)
filename := "-"
if p.IsValid() {
filename = p.Filename
}
include := true
if len(config.onlyFiles) > 0 {
// This analyzer emits diagnostics for only a set of files.
include = false
for _, pattern := range config.onlyFiles {
if pattern.MatchString(filename) {
include = true
break
}
}
}
if include {
for _, pattern := range config.excludeFiles {
if pattern.MatchString(filename) {
include = false
break
}
}
}
if include {
diagnostics = append(diagnostics, entry{Diagnostic: d, Analyzer: act.a})
}
}
}
if len(diagnostics) == 0 && len(errs) == 0 {
return ""
}
sort.Slice(diagnostics, func(i, j int) bool {
return diagnostics[i].Pos < diagnostics[j].Pos
})
errMsg := &bytes.Buffer{}
sep := ""
for _, err := range errs {
errMsg.WriteString(sep)
sep = "\n"
errMsg.WriteString(err.Error())
}
for _, d := range diagnostics {
errMsg.WriteString(sep)
sep = "\n"
fmt.Fprintf(errMsg, "%s: %s (%s)", pkg.fset.Position(d.Pos), d.Message, d.Name)
}
return errMsg.String()
}