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