sa1002.go raw

   1  package sa1002
   2  
   3  import (
   4  	"go/constant"
   5  	"strings"
   6  	"time"
   7  
   8  	"honnef.co/go/tools/analysis/callcheck"
   9  	"honnef.co/go/tools/analysis/lint"
  10  	"honnef.co/go/tools/internal/passes/buildir"
  11  	"honnef.co/go/tools/knowledge"
  12  
  13  	"golang.org/x/tools/go/analysis"
  14  )
  15  
  16  var SCAnalyzer = lint.InitializeAnalyzer(&lint.Analyzer{
  17  	Analyzer: &analysis.Analyzer{
  18  		Name:     "SA1002",
  19  		Requires: []*analysis.Analyzer{buildir.Analyzer},
  20  		Run:      callcheck.Analyzer(rules),
  21  	},
  22  	Doc: &lint.RawDocumentation{
  23  		Title:    `Invalid format in \'time.Parse\'`,
  24  		Since:    "2017.1",
  25  		Severity: lint.SeverityError,
  26  		MergeIf:  lint.MergeIfAny,
  27  	},
  28  })
  29  
  30  var Analyzer = SCAnalyzer.Analyzer
  31  
  32  var rules = map[string]callcheck.Check{
  33  	"time.Parse": func(call *callcheck.Call) {
  34  		arg := call.Args[knowledge.Arg("time.Parse.layout")]
  35  		if c := callcheck.ExtractConstExpectKind(arg.Value, constant.String); c != nil {
  36  			s := constant.StringVal(c.Value)
  37  			s = strings.Replace(s, "_", " ", -1)
  38  			s = strings.Replace(s, "Z", "-", -1)
  39  			_, err := time.Parse(s, s)
  40  			if err != nil {
  41  				arg.Invalid(err.Error())
  42  			}
  43  		}
  44  	},
  45  }
  46