Skip to content

Commit

Permalink
it works!
Browse files Browse the repository at this point in the history
  • Loading branch information
DQNEO committed Aug 19, 2023
1 parent 103fcf5 commit 4f72923
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 82 deletions.
6 changes: 3 additions & 3 deletions internal/codegen/codegen.go
Original file line number Diff line number Diff line change
Expand Up @@ -2096,15 +2096,15 @@ func GenerateDecls(pkg *ir.AnalyzedPackage, declFilePath string) {
// Type, Con, Var, Func
for _, typ := range pkg.Types {
ut := sema.GetUnderlyingType(typ)
utAsString := sema.SerializeType(ut.GoType, true, true, pkg.Name)
ident := typ.E.(*ast.Ident)
utAsString := sema.SerializeType(ut, true, true, pkg.Name)
fmt.Fprintf(fout, "type %s %s\n", ident.Name, utAsString)
}
for _, vr := range pkg.Vars {
fmt.Fprintf(fout, "var %s %s\n", vr.Name.Name, sema.SerializeType(vr.Type, true, true, pkg.Name))
fmt.Fprintf(fout, "var %s %s\n", vr.Name.Name, sema.SerializeType(vr.Type.GoType, true, true, pkg.Name))
}
for _, cnst := range pkg.Consts {
fmt.Fprintf(fout, "const %s %s = %s\n", cnst.Name.Name, sema.SerializeType(cnst.Type, true, true, pkg.Name), sema.GetConstRawValue(cnst.MetaVal))
fmt.Fprintf(fout, "const %s %s = %s\n", cnst.Name.Name, sema.SerializeType(cnst.Type.GoType, true, true, pkg.Name), sema.GetConstRawValue(cnst.MetaVal))
}
for _, fnc := range pkg.Funcs {
fmt.Fprintf(fout, "%s\n", sema.RestoreFuncDecl(fnc, true, true, pkg.Name))
Expand Down
94 changes: 15 additions & 79 deletions internal/sema/sema.go
Original file line number Diff line number Diff line change
Expand Up @@ -2623,7 +2623,7 @@ func EvalInt(expr ast.Expr) int {
panic(fmt.Sprintf("Unknown type:%T", expr))
}

func SerializeType2(goType types.GoType, showPkgPrefix bool, showOnlyForeignPrefix bool, currentPkgName string) string {
func SerializeType(goType types.GoType, showPkgPrefix bool, showOnlyForeignPrefix bool, currentPkgName string) string {
switch g := goType.(type) {
case *types.Basic:
return g.Name()
Expand All @@ -2645,17 +2645,17 @@ func SerializeType2(goType types.GoType, showPkgPrefix bool, showOnlyForeignPref
return g.String()
}
case *types.Pointer:
return "*" + SerializeType2(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
return "*" + SerializeType(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Array:
return "[" + strconv.Itoa(g.Len()) + "]" + SerializeType2(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
return "[" + strconv.Itoa(g.Len()) + "]" + SerializeType(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Slice:
if g.Elp {
return "..." + SerializeType2(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
return "..." + SerializeType(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
} else {
return "[]" + SerializeType2(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
return "[]" + SerializeType(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
}
case *types.Map:
return "map[" + SerializeType2(g.Key(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName) + "]" + SerializeType2(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
return "map[" + SerializeType(g.Key(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName) + "]" + SerializeType(g.Elem(), showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Func:
return "func()"
case *types.Struct:
Expand All @@ -2664,7 +2664,7 @@ func SerializeType2(goType types.GoType, showPkgPrefix bool, showOnlyForeignPref
for _, field := range g.Fields {
name := field.Name
typ := field.Typ
r += fmt.Sprintf("%s %s; ", name, SerializeType2(typ, showPkgPrefix, showOnlyForeignPrefix, currentPkgName))
r += fmt.Sprintf("%s %s; ", name, SerializeType(typ, showPkgPrefix, showOnlyForeignPrefix, currentPkgName))
}
}
return r + "}"
Expand All @@ -2684,70 +2684,6 @@ func SerializeType2(goType types.GoType, showPkgPrefix bool, showOnlyForeignPref
return ""
}

func SerializeType(t *types.Type, showPkgPrefix bool, showOnlyForeignPrefix bool, currentPkgName string) string {
if t == nil {
panic("nil type is not expected")
}
if t == types.GeneralSliceType {
panic("TBD: GeneralSlice")
}
if t.GoType == nil {
panic("t.Gotype should not be nil")
}
switch g := t.GoType.(type) {
case *types.Named:
_ = g
return SerializeType2(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Basic:
return SerializeType2(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Pointer:
return SerializeType2(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Array:
return SerializeType2(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Slice:
return SerializeType2(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Interface:
return SerializeType2(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Func:
return SerializeType2(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Map:
return SerializeType2(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
case *types.Struct:
return SerializeType2(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
}

switch e := t.E.(type) {
case *ast.Ident:
panic("should not reach here")
case *ast.StructType:
panic("should not reach here")
r := "struct{"
if e.Fields != nil {
for _, field := range e.Fields.List {
name := field.Names[0].Name
typ := E2T(field.Type)
r += fmt.Sprintf("%s %s;", name, SerializeType(typ, showPkgPrefix, showOnlyForeignPrefix, currentPkgName))
}
}
return r + "}"
case *ast.ArrayType:
panic("should not reach here")
case *ast.StarExpr:
panic("should not reach here")
case *ast.Ellipsis: // x ...T
panic("should not reach here")
case *ast.MapType:
panic("should not reach here")
case *ast.SelectorExpr:
panic("should not reach here")
case *ast.FuncType:
panic("should not reach here")
default:
panic(t)
}
return ""
}

func FuncTypeToSignature(funcType *ast.FuncType) *ir.Signature {
p := FieldList2Types(funcType.Params)
r := FieldList2Types(funcType.Results)
Expand All @@ -2772,7 +2708,7 @@ func RestoreMethodDecl(m *types.Func, showPkgPrefix bool, showOnlyForeignPrefix
if p != "" {
p += ","
}
p += SerializeType2(t, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
p += SerializeType(t, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
}
}

Expand All @@ -2782,7 +2718,7 @@ func RestoreMethodDecl(m *types.Func, showPkgPrefix bool, showOnlyForeignPrefix
if r != "" {
r += ","
}
r += SerializeType2(t, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
r += SerializeType(t, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
}
}

Expand All @@ -2797,13 +2733,13 @@ func RestoreFuncDecl(fnc *ir.Func, showPkgPrefix bool, showOnlyForeignPrefix boo
if p != "" {
p += ","
}
p += SerializeType(t, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
p += SerializeType(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
}
for _, t := range fnc.Signature.ReturnTypes {
if r != "" {
r += ","
}
r += SerializeType(t, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
r += SerializeType(t.GoType, showPkgPrefix, showOnlyForeignPrefix, currentPkgName)
}
var m string
var star string
Expand Down Expand Up @@ -2863,8 +2799,8 @@ type ITabEntry struct {

// "**[1][]*int" => ".dtype.8"
func RegisterDtype(dtype *types.Type, itype *types.Type) {
ds := SerializeType(dtype, true, false, "")
is := SerializeType(itype, true, false, "")
ds := SerializeType(dtype.GoType, true, false, "")
is := SerializeType(itype.GoType, true, false, "")

key := ds + "-" + is
_, ok := ITab[key]
Expand All @@ -2886,8 +2822,8 @@ func RegisterDtype(dtype *types.Type, itype *types.Type) {
}

func GetITabEntry(t *types.Type, it *types.Type) *ITabEntry {
ds := SerializeType(t, true, false, "")
is := SerializeType(it, true, false, "")
ds := SerializeType(t.GoType, true, false, "")
is := SerializeType(it.GoType, true, false, "")
key := ds + "-" + is
ent, ok := ITab[key]
if !ok {
Expand Down

0 comments on commit 4f72923

Please sign in to comment.