diff --git a/chore/_xtool/llcppsymg/parse/parse.go b/chore/_xtool/llcppsymg/parse/parse.go index f3e852eb0..9f3e43a42 100644 --- a/chore/_xtool/llcppsymg/parse/parse.go +++ b/chore/_xtool/llcppsymg/parse/parse.go @@ -11,12 +11,10 @@ import ( ) type Context struct { - namespaceName string - className string - prefixes []string - symbolMap map[string]string - currentFile string - nameCounts map[string]int + prefixes []string + symbolMap map[string]string + currentFile string + nameCounts map[string]int } func newContext(prefixes []string) *Context { @@ -27,14 +25,6 @@ func newContext(prefixes []string) *Context { } } -func (c *Context) setNamespaceName(name string) { - c.namespaceName = name -} - -func (c *Context) setClassName(name string) { - c.className = name -} - func (c *Context) setCurrentFile(filename string) { c.currentFile = filename } @@ -48,18 +38,19 @@ func (c *Context) removePrefix(str string) string { return str } -func (c *Context) genGoName(name string) string { - class := c.removePrefix(c.className) - name = c.removePrefix(name) +func (p *Context) genGoName(cursor clang.Cursor) string { + funcName := cursor.String() + defer funcName.Dispose() - var baseName string - if class == "" { - baseName = name - } else { - baseName = c.genMethodName(class, name) + name := p.removePrefix(c.GoString(funcName.CStr())) + if parent := cursor.SemanticParent(); parent.Kind == clang.CursorClassDecl { + parentName := parent.String() + defer parentName.Dispose() + class := p.removePrefix(c.GoString(parentName.CStr())) + return p.addSuffix(p.genMethodName(class, name)) } - return c.addSuffix(baseName) + return p.addSuffix(name) } func (c *Context) genMethodName(class, name string) string { @@ -85,51 +76,32 @@ func (c *Context) addSuffix(name string) string { var context = newContext([]string{}) func collectFuncInfo(cursor clang.Cursor) { - cursorStr := cursor.String() symbol := cursor.Mangling() - name := c.GoString(cursorStr.CStr()) symbolName := c.GoString(symbol.CStr()) if len(symbolName) >= 1 && symbolName[0] == '_' { symbolName = symbolName[1:] } defer symbol.Dispose() - defer cursorStr.Dispose() - goName := context.genGoName(name) + goName := context.genGoName(cursor) context.symbolMap[symbolName] = goName } func visit(cursor, parent clang.Cursor, clientData c.Pointer) clang.ChildVisitResult { - if cursor.Kind == clang.CursorNamespace { - nameStr := cursor.String() - defer nameStr.Dispose() - - context.setNamespaceName(c.GoString(nameStr.CStr())) - clang.VisitChildren(cursor, visit, nil) - context.setNamespaceName("") - } else if cursor.Kind == clang.CursorClassDecl { - nameStr := cursor.String() - defer nameStr.Dispose() - - context.setClassName(c.GoString(nameStr.CStr())) + switch cursor.Kind { + case clang.CursorNamespace, clang.CursorClassDecl: clang.VisitChildren(cursor, visit, nil) - context.setClassName("") - } else if cursor.Kind == clang.CursorCXXMethod || cursor.Kind == clang.CursorFunctionDecl || cursor.Kind == clang.CursorConstructor || cursor.Kind == clang.CursorDestructor { + case clang.CursorCXXMethod, clang.CursorFunctionDecl, clang.CursorConstructor, clang.CursorDestructor: loc := cursor.Location() var file clang.File - var line, column c.Uint - - loc.SpellingLocation(&file, &line, &column, nil) + loc.SpellingLocation(&file, nil, nil, nil) filename := file.FileName() - + defer filename.Dispose() if c.Strcmp(filename.CStr(), c.AllocaCStr(context.currentFile)) == 0 { collectFuncInfo(cursor) } - - defer filename.Dispose() } - return clang.ChildVisit_Continue }