-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.go
53 lines (49 loc) · 1.19 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package checkers
import (
"go/ast"
)
// qualifiedName returns called expr fully-quallified name.
//
// It works for simple identifiers like f => "f" and identifiers
// from other package like pkg.f => "pkg.f".
//
// For all unexpected expressions returns empty string.
func qualifiedName(x ast.Expr) string {
switch x := x.(type) {
case *ast.SelectorExpr:
pkg, ok := x.X.(*ast.Ident)
if !ok {
return ""
}
return pkg.Name + "." + x.Sel.Name
case *ast.Ident:
return x.Name
default:
return ""
}
}
// identOf returns identifier for x that can be used to obtain associated types.Object.
// Returns nil for expressions that yield temporary results, like `f().field`.
func identOf(x ast.Node) *ast.Ident {
switch x := x.(type) {
case *ast.Ident:
return x
case *ast.SelectorExpr:
return identOf(x.Sel)
case *ast.TypeAssertExpr:
// x.(type) - x may contain ident.
return identOf(x.X)
case *ast.IndexExpr:
// x[i] - x may contain ident.
return identOf(x.X)
case *ast.StarExpr:
// *x - x may contain ident.
return identOf(x.X)
case *ast.SliceExpr:
// x[:] - x may contain ident.
return identOf(x.X)
default:
// Note that this function is not comprehensive.
return nil
}
}