diff --git a/checker/checker.go b/checker/checker.go index c71a98f07..cef2c0128 100644 --- a/checker/checker.go +++ b/checker/checker.go @@ -22,21 +22,29 @@ func ParseCheck(input string, config *conf.Config) (*parser.Tree, error) { } if len(config.Visitors) > 0 { - for i := 0; i < 1000; i++ { + for { more := false for _, v := range config.Visitors { // We need to perform types check, because some visitors may rely on // types information available in the tree. _, _ = Check(tree, config) + r, repeatable := v.(interface { + Reset() + ShouldRepeat() bool + }); + + if repeatable { + r.Reset() + } + ast.Walk(&tree.Node, v) - if v, ok := v.(interface { - ShouldRepeat() bool - }); ok { - more = more || v.ShouldRepeat() + if repeatable { + more = more || r.ShouldRepeat() } } + if !more { break } diff --git a/patcher/operator_override.go b/patcher/operator_override.go index 551fe09bb..886ae2a48 100644 --- a/patcher/operator_override.go +++ b/patcher/operator_override.go @@ -42,6 +42,11 @@ func (p *OperatorOverloading) Visit(node *ast.Node) { } } +// Tracking must be reset before every walk over the AST tree +func (p *OperatorOverloading) Reset() { + p.applied = false +} + func (p *OperatorOverloading) ShouldRepeat() bool { return p.applied }