github.com/goplusjs/gopherjs@v1.2.6-0.20211206034512-f187917453b8/compiler/astutil/astutil.go (about) 1 package astutil 2 3 import ( 4 "go/ast" 5 "go/types" 6 ) 7 8 func RemoveParens(e ast.Expr) ast.Expr { 9 for { 10 p, isParen := e.(*ast.ParenExpr) 11 if !isParen { 12 return e 13 } 14 e = p.X 15 } 16 } 17 18 func SetType(info *types.Info, t types.Type, e ast.Expr) ast.Expr { 19 info.Types[e] = types.TypeAndValue{Type: t} 20 return e 21 } 22 23 func NewIdent(name string, t types.Type, info *types.Info, pkg *types.Package) *ast.Ident { 24 ident := ast.NewIdent(name) 25 info.Types[ident] = types.TypeAndValue{Type: t} 26 obj := types.NewVar(0, pkg, name, t) 27 info.Uses[ident] = obj 28 return ident 29 } 30 31 func IsTypeExpr(expr ast.Expr, info *types.Info) bool { 32 switch e := expr.(type) { 33 case *ast.ArrayType, *ast.ChanType, *ast.FuncType, *ast.InterfaceType, *ast.MapType, *ast.StructType: 34 return true 35 case *ast.StarExpr: 36 return IsTypeExpr(e.X, info) 37 case *ast.Ident: 38 _, ok := info.Uses[e].(*types.TypeName) 39 return ok 40 case *ast.SelectorExpr: 41 _, ok := info.Uses[e.Sel].(*types.TypeName) 42 return ok 43 case *ast.ParenExpr: 44 return IsTypeExpr(e.X, info) 45 default: 46 return false 47 } 48 }