diff --git a/go/analysis/validate.go b/go/analysis/validate.go index dd9d25b6eb..6e6cf4984f 100644 --- a/go/analysis/validate.go +++ b/go/analysis/validate.go @@ -20,14 +20,20 @@ func Validate(analyzers []*Analyzer) error { factTypes := make(map[reflect.Type]*Analyzer) // Traverse the Requires graph, depth first. - color := make(map[*Analyzer]uint8) // 0=white 1=grey 2=black + const ( + white = iota + grey + black + finished + ) + color := make(map[*Analyzer]uint8) var visit func(a *Analyzer) error visit = func(a *Analyzer) error { if a == nil { return fmt.Errorf("nil *Analyzer") } - if color[a] == 0 { // white - color[a] = 1 // grey + if color[a] == white { + color[a] = grey // names if !validIdent(a.Name) { @@ -64,7 +70,7 @@ func Validate(analyzers []*Analyzer) error { return fmt.Errorf("%s.Requires[%d]: %v", a.Name, i, err) } } - color[a] = 2 // black + color[a] = black } return nil @@ -75,6 +81,16 @@ func Validate(analyzers []*Analyzer) error { } } + // Reject duplicates among analyzers. + // Precondition: color[a] == black. + // Postcondition: color[a] == finished. + for _, a := range analyzers { + if color[a] == finished { + return fmt.Errorf("duplicate analyzer: %s", a.Name) + } + color[a] = finished + } + return nil }