You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
garble/internal/ssa2ast/helpers_test.go

73 lines
1.7 KiB
Go

package ssa2ast
import (
"go/ast"
"go/importer"
"go/parser"
"go/token"
"go/types"
"github.com/google/go-cmp/cmp/cmpopts"
)
var astCmpOpt = cmpopts.IgnoreTypes(token.NoPos, &ast.Object{})
func findStruct(file *ast.File, structName string) (name *ast.Ident, structType *ast.StructType) {
ast.Inspect(file, func(node ast.Node) bool {
if structType != nil {
return false
}
typeSpec, ok := node.(*ast.TypeSpec)
if !ok || typeSpec.Name == nil || typeSpec.Name.Name != structName {
return true
}
typ, ok := typeSpec.Type.(*ast.StructType)
if !ok {
return true
}
structType = typ
name = typeSpec.Name
return true
})
if structType == nil {
panic(structName + " not found")
}
return
}
func findFunc(file *ast.File, funcName string) *ast.FuncDecl {
for _, decl := range file.Decls {
fDecl, ok := decl.(*ast.FuncDecl)
if ok && fDecl.Name.Name == funcName {
return fDecl
}
}
panic(funcName + " not found")
}
func mustParseAndTypeCheckFile(src string) (*ast.File, *token.FileSet, *types.Info, *types.Package) {
fset := token.NewFileSet()
f, err := parser.ParseFile(fset, "a.go", src, 0)
if err != nil {
panic(err)
}
config := types.Config{Importer: importer.Default()}
info := &types.Info{
Types: make(map[ast.Expr]types.TypeAndValue),
Defs: make(map[*ast.Ident]types.Object),
Uses: make(map[*ast.Ident]types.Object),
Instances: make(map[*ast.Ident]types.Instance),
Implicits: make(map[ast.Node]types.Object),
Scopes: make(map[ast.Node]*types.Scope),
Selections: make(map[*ast.SelectorExpr]*types.Selection),
}
pkg, err := config.Check("test/main", fset, []*ast.File{f}, info)
if err != nil {
panic(err)
}
return f, fset, info, pkg
}