llcppsigfetch:use the closure in visitTop & enumtype
This commit is contained in:
@@ -265,8 +265,7 @@ func (ct *Converter) ParseComment(rawComment string) *ast.CommentGroup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// visit top decls (struct,class,function,enum & macro,include)
|
// visit top decls (struct,class,function,enum & macro,include)
|
||||||
func visitTop(cursor, parent clang.Cursor, clientData unsafe.Pointer) clang.ChildVisitResult {
|
func (ct *Converter) visitTop(cursor, parent clang.Cursor) clang.ChildVisitResult {
|
||||||
ct := (*Converter)(clientData)
|
|
||||||
ct.UpdateLoc(cursor)
|
ct.UpdateLoc(cursor)
|
||||||
|
|
||||||
curFile := ct.GetCurFile()
|
curFile := ct.GetCurFile()
|
||||||
@@ -300,7 +299,7 @@ func visitTop(cursor, parent clang.Cursor, clientData unsafe.Pointer) clang.Chil
|
|||||||
case clang.CursorTypedefDecl:
|
case clang.CursorTypedefDecl:
|
||||||
curFile.Decls = append(curFile.Decls, ct.ProcessTypeDefDecl(cursor))
|
curFile.Decls = append(curFile.Decls, ct.ProcessTypeDefDecl(cursor))
|
||||||
case clang.CursorNamespace:
|
case clang.CursorNamespace:
|
||||||
clang.VisitChildren(cursor, visitTop, c.Pointer(ct))
|
VisitChildren(cursor, ct.visitTop)
|
||||||
}
|
}
|
||||||
return clang.ChildVisit_Continue
|
return clang.ChildVisit_Continue
|
||||||
}
|
}
|
||||||
@@ -308,10 +307,19 @@ func visitTop(cursor, parent clang.Cursor, clientData unsafe.Pointer) clang.Chil
|
|||||||
func (ct *Converter) Convert() ([]*FileEntry, error) {
|
func (ct *Converter) Convert() ([]*FileEntry, error) {
|
||||||
cursor := ct.unit.Cursor()
|
cursor := ct.unit.Cursor()
|
||||||
// visit top decls (struct,class,function & macro,include)
|
// visit top decls (struct,class,function & macro,include)
|
||||||
clang.VisitChildren(cursor, visitTop, c.Pointer(ct))
|
VisitChildren(cursor, ct.visitTop)
|
||||||
return ct.Files, nil
|
return ct.Files, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Visitor func(cursor, parent clang.Cursor) clang.ChildVisitResult
|
||||||
|
|
||||||
|
func VisitChildren(cursor clang.Cursor, fn Visitor) c.Uint {
|
||||||
|
return clang.VisitChildren(cursor, func(cursor, parent clang.Cursor, clientData unsafe.Pointer) clang.ChildVisitResult {
|
||||||
|
cfn := *(*Visitor)(clientData)
|
||||||
|
return cfn(cursor, parent)
|
||||||
|
}, unsafe.Pointer(&fn))
|
||||||
|
}
|
||||||
|
|
||||||
func (ct *Converter) ProcessType(t clang.Type) ast.Expr {
|
func (ct *Converter) ProcessType(t clang.Type) ast.Expr {
|
||||||
if t.Kind >= clang.TypeFirstBuiltin && t.Kind <= clang.TypeLastBuiltin {
|
if t.Kind >= clang.TypeFirstBuiltin && t.Kind <= clang.TypeLastBuiltin {
|
||||||
return ct.ProcessBuiltinType(t)
|
return ct.ProcessBuiltinType(t)
|
||||||
@@ -519,38 +527,30 @@ func (ct *Converter) ProcessMethodAttributes(cursor clang.Cursor, fn *ast.FuncDe
|
|||||||
overridden.DisposeOverriddenCursors()
|
overridden.DisposeOverriddenCursors()
|
||||||
}
|
}
|
||||||
|
|
||||||
type visitEnumContext struct {
|
|
||||||
enum *[]*ast.EnumItem
|
|
||||||
converter *Converter
|
|
||||||
}
|
|
||||||
|
|
||||||
func visitEnum(cursor, parent clang.Cursor, clientData unsafe.Pointer) clang.ChildVisitResult {
|
|
||||||
ctx := (*visitEnumContext)(clientData)
|
|
||||||
if cursor.Kind == clang.CursorEnumConstantDecl {
|
|
||||||
name := cursor.String()
|
|
||||||
val := (*c.Char)(c.Malloc(unsafe.Sizeof(c.Char(0)) * 20))
|
|
||||||
c.Sprintf(val, c.Str("%lld"), cursor.EnumConstantDeclValue())
|
|
||||||
defer c.Free(unsafe.Pointer(val))
|
|
||||||
defer name.Dispose()
|
|
||||||
enum := &ast.EnumItem{
|
|
||||||
Name: &ast.Ident{Name: c.GoString(name.CStr())},
|
|
||||||
Value: &ast.BasicLit{
|
|
||||||
Kind: ast.IntLit,
|
|
||||||
Value: c.GoString(val),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
*ctx.enum = append(*ctx.enum, enum)
|
|
||||||
}
|
|
||||||
return clang.ChildVisit_Continue
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ct *Converter) ProcessEnumType(cursor clang.Cursor) *ast.EnumType {
|
func (ct *Converter) ProcessEnumType(cursor clang.Cursor) *ast.EnumType {
|
||||||
items := make([]*ast.EnumItem, 0)
|
items := make([]*ast.EnumItem, 0)
|
||||||
ctx := &visitEnumContext{
|
|
||||||
enum: &items,
|
VisitChildren(cursor, func(cursor, parent clang.Cursor) clang.ChildVisitResult {
|
||||||
converter: ct,
|
if cursor.Kind == clang.CursorEnumConstantDecl {
|
||||||
}
|
name := cursor.String()
|
||||||
clang.VisitChildren(cursor, visitEnum, c.Pointer(ctx))
|
defer name.Dispose()
|
||||||
|
|
||||||
|
val := (*c.Char)(c.Malloc(unsafe.Sizeof(c.Char(0)) * 20))
|
||||||
|
c.Sprintf(val, c.Str("%lld"), cursor.EnumConstantDeclValue())
|
||||||
|
defer c.Free(unsafe.Pointer(val))
|
||||||
|
|
||||||
|
enum := &ast.EnumItem{
|
||||||
|
Name: &ast.Ident{Name: c.GoString(name.CStr())},
|
||||||
|
Value: &ast.BasicLit{
|
||||||
|
Kind: ast.IntLit,
|
||||||
|
Value: c.GoString(val),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
items = append(items, enum)
|
||||||
|
}
|
||||||
|
return clang.ChildVisit_Continue
|
||||||
|
})
|
||||||
|
|
||||||
return &ast.EnumType{
|
return &ast.EnumType{
|
||||||
Items: items,
|
Items: items,
|
||||||
}
|
}
|
||||||
@@ -587,6 +587,8 @@ func (ct *Converter) ProcessInclude(cursor clang.Cursor) *ast.Include {
|
|||||||
return &ast.Include{Path: c.GoString(name.CStr())}
|
return &ast.Include{Path: c.GoString(name.CStr())}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo(zzy): after https://github.com/goplus/llgo/issues/804 has be resolved
|
||||||
|
// Change the following code to use the closure
|
||||||
type visitFieldContext struct {
|
type visitFieldContext struct {
|
||||||
params *ast.FieldList
|
params *ast.FieldList
|
||||||
converter *Converter
|
converter *Converter
|
||||||
|
|||||||
Reference in New Issue
Block a user