@@ -3,6 +3,8 @@ package tenv
3
3
import (
4
4
"fmt"
5
5
"go/ast"
6
+ "go/token"
7
+ "go/types"
6
8
"strings"
7
9
8
10
"golang.org/x/tools/go/analysis"
@@ -94,19 +96,17 @@ func checkExprStmt(pass *analysis.Pass, stmt *ast.ExprStmt, funcName, argName st
94
96
return false
95
97
}
96
98
checkArgs (pass , callExpr .Args , funcName , argName )
97
- fun , ok := callExpr .Fun .(* ast.SelectorExpr )
98
- if ! ok {
99
- return false
99
+ ident , ok := callExpr .Fun .(* ast.Ident )
100
+ if ok {
101
+ obj := pass .TypesInfo .ObjectOf (ident )
102
+ return checkObj (pass , obj , stmt .Pos (), funcName , argName )
100
103
}
101
- obj := pass .TypesInfo .ObjectOf (fun .Sel )
102
- targetName := fmt .Sprintf ("%s.%s" , obj .Pkg ().Name (), obj .Name ())
103
- if targetName == "os.Setenv" {
104
- if argName == "" {
105
- argName = "testing"
106
- }
107
- pass .Reportf (stmt .Pos (), "os.Setenv() can be replaced by `%s.Setenv()` in %s" , argName , funcName )
104
+ fun , ok := callExpr .Fun .(* ast.SelectorExpr )
105
+ if ok {
106
+ obj := pass .TypesInfo .ObjectOf (fun .Sel )
107
+ return checkObj (pass , obj , stmt .Pos (), funcName , argName )
108
108
}
109
- return true
109
+ return false
110
110
}
111
111
112
112
func checkArgs (pass * analysis.Pass , args []ast.Expr , funcName , argName string ) {
@@ -115,17 +115,15 @@ func checkArgs(pass *analysis.Pass, args []ast.Expr, funcName, argName string) {
115
115
if ! ok {
116
116
continue
117
117
}
118
- fun , ok := callExpr .Fun .(* ast.SelectorExpr )
119
- if ! ok {
120
- continue
118
+ ident , ok := callExpr .Fun .(* ast.Ident )
119
+ if ok {
120
+ obj := pass .TypesInfo .ObjectOf (ident )
121
+ checkObj (pass , obj , arg .Pos (), funcName , argName )
121
122
}
122
- obj := pass .TypesInfo .ObjectOf (fun .Sel )
123
- targetName := fmt .Sprintf ("%s.%s" , obj .Pkg ().Name (), obj .Name ())
124
- if targetName == "os.Setenv" {
125
- if argName == "" {
126
- argName = "testing"
127
- }
128
- pass .Reportf (arg .Pos (), "os.Setenv() can be replaced by `%s.Setenv()` in %s" , argName , funcName )
123
+ fun , ok := callExpr .Fun .(* ast.SelectorExpr )
124
+ if ok {
125
+ obj := pass .TypesInfo .ObjectOf (fun .Sel )
126
+ checkObj (pass , obj , arg .Pos (), funcName , argName )
129
127
}
130
128
}
131
129
}
@@ -139,37 +137,45 @@ func checkIfStmt(pass *analysis.Pass, stmt *ast.IfStmt, funcName, argName string
139
137
if ! ok {
140
138
return false
141
139
}
142
- fun , ok := rhs .Fun .(* ast.SelectorExpr )
143
- if ! ok {
144
- return false
140
+ ident , ok := rhs .Fun .(* ast.Ident )
141
+ if ok {
142
+ obj := pass .TypesInfo .ObjectOf (ident )
143
+ return checkObj (pass , obj , stmt .Pos (), funcName , argName )
145
144
}
146
- obj := pass .TypesInfo .ObjectOf (fun .Sel )
147
- targetName := fmt .Sprintf ("%s.%s" , obj .Pkg ().Name (), obj .Name ())
148
- if targetName == "os.Setenv" {
149
- if argName == "" {
150
- argName = "testing"
151
- }
152
- pass .Reportf (stmt .Pos (), "os.Setenv() can be replaced by `%s.Setenv()` in %s" , argName , funcName )
145
+ fun , ok := rhs .Fun .(* ast.SelectorExpr )
146
+ if ok {
147
+ obj := pass .TypesInfo .ObjectOf (fun .Sel )
148
+ return checkObj (pass , obj , stmt .Pos (), funcName , argName )
153
149
}
154
- return true
150
+ return false
155
151
}
156
152
157
153
func checkAssignStmt (pass * analysis.Pass , stmt * ast.AssignStmt , funcName , argName string ) bool {
158
154
rhs , ok := stmt .Rhs [0 ].(* ast.CallExpr )
159
155
if ! ok {
160
156
return false
161
157
}
158
+ ident , ok := rhs .Fun .(* ast.Ident )
159
+ if ok {
160
+ obj := pass .TypesInfo .ObjectOf (ident )
161
+ return checkObj (pass , obj , stmt .Pos (), funcName , argName )
162
+ }
162
163
fun , ok := rhs .Fun .(* ast.SelectorExpr )
163
- if ! ok {
164
- return false
164
+ if ok {
165
+ obj := pass .TypesInfo .ObjectOf (fun .Sel )
166
+ return checkObj (pass , obj , stmt .Pos (), funcName , argName )
165
167
}
166
- obj := pass .TypesInfo .ObjectOf (fun .Sel )
168
+ return false
169
+ }
170
+
171
+ func checkObj (pass * analysis.Pass , obj types.Object , pos token.Pos , funcName , argName string ) bool {
167
172
targetName := fmt .Sprintf ("%s.%s" , obj .Pkg ().Name (), obj .Name ())
168
173
if targetName == "os.Setenv" {
169
174
if argName == "" {
170
175
argName = "testing"
171
176
}
172
- pass .Reportf (stmt .Pos (), "os.Setenv() can be replaced by `%s.Setenv()` in %s" , argName , funcName )
177
+ fmt .Println (argName , funcName )
178
+ pass .Reportf (pos , "os.Setenv() can be replaced by `%s.Setenv()` in %s" , argName , funcName )
173
179
}
174
180
return true
175
181
}
0 commit comments