Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 86f02df

Browse files
committed
Handle new(js.Object) and pointer-to-pointer-to-pointer....
1 parent 93a5cbf commit 86f02df

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

analysis/passes/directjsobject/directjsobject.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ func detectRawJSObject(pass *analysis.Pass, node ast.Node) {
5656
if valExpr, ok := derefPointer(t.Value); ok {
5757
objMustBeEmbedded(pass, node, valExpr)
5858
}
59+
case *ast.CallExpr:
60+
ident, ok := t.Fun.(*ast.Ident)
61+
if ok && ident.Name == "new" {
62+
if arg0, ok := derefPointer(t.Args[0]); ok {
63+
objMustBeEmbedded(pass, node, arg0)
64+
}
65+
}
5966
case *ast.CompositeLit:
6067
var expr *ast.SelectorExpr
6168
switch et := t.Type.(type) {
@@ -78,10 +85,7 @@ func derefPointer(node ast.Node) (*ast.SelectorExpr, bool) {
7885
case *ast.SelectorExpr:
7986
return x, true
8087
case *ast.StarExpr:
81-
child, ok := x.X.(*ast.SelectorExpr)
82-
if ok {
83-
return child, true
84-
}
88+
return derefPointer(x.X)
8589
}
8690
return nil, false
8791
}

analysis/passes/directjsobject/testdata/src/directjsobject/directjsobject.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ var _ = struct {
4040
var (
4141
_ js.Object // want "js.Object must be embedded in a struct"
4242
_ *js.Object // want "js.Object must be embedded in a struct"
43+
_ ******js.Object // want "js.Object must be embedded in a struct"
4344
_ []js.Object // want "js.Object must be embedded in a struct"
4445
_ []*js.Object // want "js.Object must be embedded in a struct"
4546
_ [10]js.Object // want "js.Object must be embedded in a struct"
@@ -51,6 +52,12 @@ var (
5152
)
5253

5354
var (
54-
_ chan js.Object // want "js.Object must be embedded in a struct"
55-
_ chan *js.Object // want "js.Object must be embedded in a struct"
55+
_ chan js.Object // want "js.Object must be embedded in a struct"
56+
_ chan *js.Object // want "js.Object must be embedded in a struct"
57+
_ chan []js.Object // want "js.Object must be embedded in a struct"
58+
59+
_ = make(chan js.Object) // want "js.Object must be embedded in a struct"
60+
_ = new(js.Object) // want "js.Object must be embedded in a struct"
61+
_ = new(*js.Object) // want "js.Object must be embedded in a struct"
62+
_ = new(**js.Object) // want "js.Object must be embedded in a struct"
5663
)

0 commit comments

Comments
 (0)