diff --git a/defaultrule/no-else-return-rule.go b/defaultrule/no-else-return-rule.go index 48c97ef..14c0389 100644 --- a/defaultrule/no-else-return-rule.go +++ b/defaultrule/no-else-return-rule.go @@ -31,7 +31,7 @@ func (r *LintElseRule) Name() string { } type lintElse struct { - r rule.Rule + r *LintElseRule } func (f lintElse) Visit(n ast.Node) ast.Visitor { @@ -55,11 +55,10 @@ func (f lintElse) Visit(n ast.Node) ast.Visitor { } lastStmt := node.Body.List[len(node.Body.List)-1] if _, ok := lastStmt.(*ast.ReturnStmt); ok { - f.r.AddFailures(rule.Failure{ - Failure: failure, - Type: rule.FailureTypeWarning, - Position: f.r.Position(node.Else.Pos(), node.Else.End()), - }) + f.r.AddFailureAtNode(rule.Failure{ + Failure: failure, + Type: rule.FailureTypeWarning, + }, node.Else, f.r.File) return f } } diff --git a/rule/rule.go b/rule/rule.go index 125d0bb..56ca629 100644 --- a/rule/rule.go +++ b/rule/rule.go @@ -1,6 +1,7 @@ package rule import ( + "go/ast" "go/token" "github.com/mgechev/revive/file" @@ -58,7 +59,6 @@ type Rule interface { Apply(*file.File, Arguments) []Failure AddFailures(...Failure) Failures() []Failure - Position(token.Pos, token.Pos) FailurePosition } // AbstractRule defines an abstract rule. @@ -67,27 +67,25 @@ type AbstractRule struct { File *file.File } -// Apply must be overridden by the successor struct. -func (r *AbstractRule) Apply(file *file.File, args Arguments) { - panic("Apply not implemented") -} - // AddFailures adds rule failures. func (r *AbstractRule) AddFailures(failures ...Failure) { r.failures = append(r.failures, failures...) } +// AddFailureAtNode adds rule failure at specific node. +func (r *AbstractRule) AddFailureAtNode(failure Failure, t ast.Node, file *file.File) { + failure.Position = toFailurePosition(t.Pos(), t.End(), file) + r.AddFailures(failure) +} + // Failures returns the rule failures. func (r *AbstractRule) Failures() []Failure { return r.failures } -// Position returns position by given start and end token.Pos. -func (r *AbstractRule) Position(start token.Pos, end token.Pos) FailurePosition { - s := r.File.ToPosition(start) - e := r.File.ToPosition(end) +func toFailurePosition(start token.Pos, end token.Pos, file *file.File) FailurePosition { return FailurePosition{ - Start: s, - End: e, + Start: file.ToPosition(start), + End: file.ToPosition(end), } }