...
1 package modelgen
2
3 import (
4 "go/types"
5 "strings"
6 )
7
8
9
10 func buildType(typeString string) types.Type {
11 switch {
12 case typeString[0] == '*':
13 return types.NewPointer(buildType(typeString[1:]))
14 case strings.HasPrefix(typeString, "[]"):
15 return types.NewSlice(buildType(typeString[2:]))
16 default:
17 return buildNamedType(typeString)
18 }
19 }
20
21
22
23
24
25
26
27
28 func buildNamedType(fullName string) types.Type {
29 dotIndex := strings.LastIndex(fullName, ".")
30 if dotIndex == -1 {
31 return types.Universe.Lookup(fullName).Type()
32 }
33
34
35 pkgPath := fullName[:dotIndex]
36 typeName := fullName[dotIndex+1:]
37
38 pkgName := pkgPath
39 slashIndex := strings.LastIndex(pkgPath, "/")
40 if slashIndex != -1 {
41 pkgName = pkgPath[slashIndex+1:]
42 }
43
44 pkg := types.NewPackage(pkgPath, pkgName)
45
46 return types.NewNamed(types.NewTypeName(0, pkg, typeName, nil), nil, nil)
47 }
48
View as plain text