From c6336e920fcebdbfac6ee735eac5991f228ce22e Mon Sep 17 00:00:00 2001 From: luoliwoshang <2643523683@qq.com> Date: Fri, 23 Aug 2024 15:13:15 +0800 Subject: [PATCH] llcppsigfetch:qualified name whith tag --- chore/_xtool/llcppsigfetch/parse/cvt.go | 32 ++++++++----------- .../parse/cvt_test/type_test/llgo.expect | 17 ++++++++++ .../parse/cvt_test/type_test/type.go | 8 +++++ 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/chore/_xtool/llcppsigfetch/parse/cvt.go b/chore/_xtool/llcppsigfetch/parse/cvt.go index 2a9f9df9..e83f6f95 100644 --- a/chore/_xtool/llcppsigfetch/parse/cvt.go +++ b/chore/_xtool/llcppsigfetch/parse/cvt.go @@ -512,28 +512,12 @@ func (ct *Converter) ProcessElaboratedType(t clang.Type) ast.Expr { if tagValue, ok := tagMap[parts[0]]; ok { return &ast.TagExpr{ Tag: tagValue, - Name: &ast.Ident{Name: parts[1]}, + Name: qualifiedExpr(parts[1]), } } } - // qualified name - // todo(zzy): qualified name with tag,like struct A::B - if strings.Contains(typeName, "::") { - scopeParts := strings.Split(typeName, "::") - var expr ast.Expr = &ast.Ident{Name: scopeParts[0]} - for _, part := range scopeParts[1:] { - expr = &ast.ScopingExpr{ - Parent: expr, - X: &ast.Ident{Name: part}, - } - } - return expr - } - - return &ast.Ident{ - Name: typeName, - } + return qualifiedExpr(typeName) } func (ct *Converter) ProcessBuiltinType(t clang.Type) *ast.BuiltinType { @@ -628,3 +612,15 @@ func toToken(tok clang.Token) token.Token { return token.Token(tok.Kind() + 1) } } + +func qualifiedExpr(name string) ast.Expr { + parts := strings.Split(name, "::") + var expr ast.Expr = &ast.Ident{Name: parts[0]} + for _, part := range parts[1:] { + expr = &ast.ScopingExpr{ + Parent: expr, + X: &ast.Ident{Name: part}, + } + } + return expr +} diff --git a/chore/_xtool/llcppsigfetch/parse/cvt_test/type_test/llgo.expect b/chore/_xtool/llcppsigfetch/parse/cvt_test/type_test/llgo.expect index df92c28e..0f8b23b8 100644 --- a/chore/_xtool/llcppsigfetch/parse/cvt_test/type_test/llgo.expect +++ b/chore/_xtool/llcppsigfetch/parse/cvt_test/type_test/llgo.expect @@ -152,6 +152,23 @@ Type: a::b::c: } } } +Type: class a::b::c: +{ + "Name": { + "X": { + "Name": "c" + }, + "Parent": { + "X": { + "Name": "b" + }, + "Parent": { + "Name": "a" + } + } + }, + "Tag": 3 +} #stderr todo: unknown builtin type: Ibm128 diff --git a/chore/_xtool/llcppsigfetch/parse/cvt_test/type_test/type.go b/chore/_xtool/llcppsigfetch/parse/cvt_test/type_test/type.go index 560a8021..c4c51a35 100644 --- a/chore/_xtool/llcppsigfetch/parse/cvt_test/type_test/type.go +++ b/chore/_xtool/llcppsigfetch/parse/cvt_test/type_test/type.go @@ -103,6 +103,14 @@ func TestNonBuiltinTypes() { } } a::b::c`, + + `namespace a { + namespace b { + class c { + }; + } + } + class a::b::c`, } for _, t := range tests {