// progType returns the go/types type for the given reflect.Type, // which must represent a named non-predeclared Go type. func progType(prog *loader.Program, t reflect.Type) (*types.TypeName, error) { if t.Kind() == reflect.Ptr { t = t.Elem() } typeName := t.Name() if typeName == "" { return nil, errgo.Newf("type %s is not named", t) } pkgPath := t.PkgPath() if pkgPath == "" { // TODO could return types.Basic type here if we needed to. return nil, errgo.Newf("type %s not declared in package", t) } pkgInfo := prog.Package(pkgPath) if pkgInfo == nil { return nil, errgo.Newf("cannot find %q in imported code", pkgPath) } pkg := pkgInfo.Pkg obj := pkg.Scope().Lookup(typeName) if obj == nil { return nil, errgo.Newf("type %s not found in %s", typeName, pkgPath) } objTypeName, ok := obj.(*types.TypeName) if !ok { return nil, errgo.Newf("%s is not a type", typeName) } return objTypeName, nil }
func findDotImports(prog *loader.Program, pi *loader.PackageInfo) { for _, file := range pi.Files { for _, importSpec := range file.Imports { if importSpec.Name != nil && importSpec.Name.Name == "." { dotImportImportPath := strings.Trim(importSpec.Path.Value, `"`) dotImportPi := prog.Package(dotImportImportPath) dotImports = append(dotImports, dotImportPi) findDotImports(prog, dotImportPi) } } } }