golangci-lint/vendor/github.com/go-critic/checkers/commentedOutImport_checker.go
David López 37e6995b45 lintpack/gocritic: update lintpack & gocritic versions
update lintpack & gocritic versions to support all the new gocritic checks
2018-12-22 15:34:16 +03:00

77 lines
1.7 KiB
Go

package checkers
import (
"go/ast"
"go/token"
"regexp"
"github.com/go-lintpack/lintpack"
"github.com/go-lintpack/lintpack/astwalk"
)
func init() {
var info lintpack.CheckerInfo
info.Name = "commentedOutImport"
info.Tags = []string{"style", "experimental"}
info.Summary = "Detects commented-out imports"
info.Before = `
import (
"fmt"
//"os"
)`
info.After = `
import (
"fmt"
)`
collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
const pattern = `(?m)^(?://|/\*)?\s*"([a-zA-Z0-9_/]+)"\s*(?:\*/)?$`
return &commentedOutImportChecker{
ctx: ctx,
importStringRE: regexp.MustCompile(pattern),
}
})
}
type commentedOutImportChecker struct {
astwalk.WalkHandler
ctx *lintpack.CheckerContext
importStringRE *regexp.Regexp
}
func (c *commentedOutImportChecker) WalkFile(f *ast.File) {
// TODO(Quasilyte): handle commented-out import spec,
// for example: // import "errors".
for _, decl := range f.Decls {
decl, ok := decl.(*ast.GenDecl)
if !ok || decl.Tok != token.IMPORT {
// Import decls can only be in the beginning of the file.
// If we've met some other decl, there will be no more
// import decls.
break
}
// Find comments inside this import decl span.
for _, cg := range f.Comments {
if cg.Pos() > decl.Rparen {
break // Below the decl, stop.
}
if cg.Pos() < decl.Lparen {
continue // Before the decl, skip.
}
for _, comment := range cg.List {
for _, m := range c.importStringRE.FindAllStringSubmatch(comment.Text, -1) {
c.warn(comment, m[1])
}
}
}
}
}
func (c *commentedOutImportChecker) warn(cause ast.Node, path string) {
c.ctx.Warn(cause, "remove commented-out %q import", path)
}