Skip to content

Commit

Permalink
llcppsymg:refine classname fetch
Browse files Browse the repository at this point in the history
  • Loading branch information
luoliwoshang committed Sep 10, 2024
1 parent 74b48ff commit 9b75624
Showing 1 changed file with 20 additions and 48 deletions.
68 changes: 20 additions & 48 deletions chore/_xtool/llcppsymg/parse/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
}
Expand All @@ -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 {
Expand All @@ -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
}

Expand Down

0 comments on commit 9b75624

Please sign in to comment.