Skip to content

Commit 034f17d

Browse files
Merge pull request #66 from sashamelentyev/feat/sql-isolation-level
feat: add sql.IsolationLevel
2 parents e82da9e + 0b118d6 commit 034f17d

File tree

5 files changed

+93
-8
lines changed

5 files changed

+93
-8
lines changed

pkg/analyzer/analyzer.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ import (
1414
)
1515

1616
const (
17-
TimeWeekdayFlag = "time-weekday"
18-
TimeMonthFlag = "time-month"
19-
TimeLayoutFlag = "time-layout"
20-
CryptoHashFlag = "crypto-hash"
21-
HTTPMethodFlag = "http-method"
22-
HTTPStatusCodeFlag = "http-status-code"
23-
RPCDefaultPathFlag = "rpc-default-path"
24-
OSDevNullFlag = "os-dev-null"
17+
TimeWeekdayFlag = "time-weekday"
18+
TimeMonthFlag = "time-month"
19+
TimeLayoutFlag = "time-layout"
20+
CryptoHashFlag = "crypto-hash"
21+
HTTPMethodFlag = "http-method"
22+
HTTPStatusCodeFlag = "http-status-code"
23+
RPCDefaultPathFlag = "rpc-default-path"
24+
OSDevNullFlag = "os-dev-null"
25+
SQLIsolationLevelFlag = "sql-isolation-level"
2526
)
2627

2728
// New returns new usestdlibvars analyzer.
@@ -45,6 +46,7 @@ func flags() flag.FlagSet {
4546
flags.Bool(CryptoHashFlag, false, "suggest the use of crypto.Hash")
4647
flags.Bool(RPCDefaultPathFlag, false, "suggest the use of rpc.DefaultXXPath")
4748
flags.Bool(OSDevNullFlag, false, "suggest the use of os.DevNull")
49+
flags.Bool(SQLIsolationLevelFlag, false, "suggest the use of sql.LevelXX")
4850
return *flags
4951
}
5052

@@ -99,6 +101,10 @@ func run(pass *analysis.Pass) (interface{}, error) {
99101
checkOSDevNull(pass, n)
100102
}
101103

104+
if lookupFlag(pass, SQLIsolationLevelFlag) {
105+
checkSQLIsolationLevel(pass, n)
106+
}
107+
102108
case *ast.CompositeLit:
103109
typ, ok := n.Type.(*ast.SelectorExpr)
104110
if !ok {
@@ -403,6 +409,14 @@ func checkOSDevNull(pass *analysis.Pass, basicLit *ast.BasicLit) {
403409
}
404410
}
405411

412+
func checkSQLIsolationLevel(pass *analysis.Pass, basicLit *ast.BasicLit) {
413+
currentVal := getBasicLitValue(basicLit)
414+
415+
if newVal, ok := mapping.SQLIsolationLevel[currentVal]; ok {
416+
report(pass, basicLit.Pos(), currentVal, newVal)
417+
}
418+
}
419+
406420
// getBasicLitFromArgs gets the *ast.BasicLit of a function argument.
407421
//
408422
// Arguments:

pkg/analyzer/analyzer_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ func TestUseStdlibVars(t *testing.T) {
1515
"a/rpc",
1616
"a/time",
1717
"a/os",
18+
"a/sql",
1819
}
1920

2021
a := analyzer.New()
@@ -37,6 +38,9 @@ func TestUseStdlibVars(t *testing.T) {
3738
if err := a.Flags.Set(analyzer.OSDevNullFlag, "true"); err != nil {
3839
t.Error(err)
3940
}
41+
if err := a.Flags.Set(analyzer.SQLIsolationLevelFlag, "true"); err != nil {
42+
t.Error(err)
43+
}
4044

4145
analysistest.Run(t, analysistest.TestData(), a, pkgs...)
4246
}

pkg/analyzer/internal/gen.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,12 @@ func main() {
8989
templateName: "test-template.go.tmpl",
9090
fileName: "pkg/analyzer/testdata/src/a/os/devnull.go",
9191
},
92+
{
93+
mapping: mapping.SQLIsolationLevel,
94+
packageName: "sql_test",
95+
templateName: "test-template.go.tmpl",
96+
fileName: "pkg/analyzer/testdata/src/a/sql/isolationlevel.go",
97+
},
9298
}
9399

94100
for _, operation := range operations {

pkg/analyzer/internal/mapping/mapping.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package mapping
22

33
import (
44
"crypto"
5+
"database/sql"
56
"net/http"
67
"net/rpc"
78
"os"
@@ -164,3 +165,14 @@ var TimeLayout = map[string]string{
164165
var OSDevNull = map[string]string{
165166
os.DevNull: "os.DevNull",
166167
}
168+
169+
var SQLIsolationLevel = map[string]string{
170+
// sql.LevelDefault.String(): "sql.LevelDefault.String()",
171+
sql.LevelReadUncommitted.String(): "sql.LevelReadUncommitted.String()",
172+
sql.LevelReadCommitted.String(): "sql.LevelReadCommitted.String()",
173+
sql.LevelWriteCommitted.String(): "sql.LevelWriteCommitted.String()",
174+
sql.LevelRepeatableRead.String(): "sql.LevelRepeatableRead.String()",
175+
// sql.LevelSnapshot.String(): "sql.LevelSnapshot.String()",
176+
// sql.LevelSerializable.String(): "sql.LevelSerializable.String()",
177+
// sql.LevelLinearizable.String(): "sql.LevelLinearizable.String()",
178+
}

pkg/analyzer/testdata/src/a/sql/isolationlevel.go

Lines changed: 49 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)