diff --git a/chore/_xtool/llcppsigfetch/parse/cvt.go b/chore/_xtool/llcppsigfetch/parse/cvt.go index b8b6dc7c..37aecf9e 100644 --- a/chore/_xtool/llcppsigfetch/parse/cvt.go +++ b/chore/_xtool/llcppsigfetch/parse/cvt.go @@ -160,9 +160,8 @@ func visit(cursor, parent clang.Cursor, clientData unsafe.Pointer) clang.ChildVi switch cursor.Kind { case clang.CursorInclusionDirective: - // todo(zzy) + ct.ProcessInclude(cursor) case clang.CursorMacroDefinition: - // todo(zzy) ct.ProcessMarco(cursor) case clang.CursorEnumDecl: // todo(zzy) @@ -277,6 +276,12 @@ func (ct *Converter) ProcessMarco(cursor clang.Cursor) { ct.curFile.Macros = append(ct.curFile.Macros, macro) } +func (ct *Converter) ProcessInclude(cursor clang.Cursor) { + name := cursor.String() + defer name.Dispose() + ct.curFile.Includes = append(ct.curFile.Includes, &ast.Include{Path: c.GoString(name.CStr())}) +} + type visitFieldContext struct { params *ast.FieldList converter *Converter diff --git a/chore/_xtool/llcppsigfetch/parse/cvt_test/preprocess_test/llgo.expect b/chore/_xtool/llcppsigfetch/parse/cvt_test/preprocess_test/llgo.expect index 72eb299f..879d6316 100644 --- a/chore/_xtool/llcppsigfetch/parse/cvt_test/preprocess_test/llgo.expect +++ b/chore/_xtool/llcppsigfetch/parse/cvt_test/preprocess_test/llgo.expect @@ -8,7 +8,7 @@ TestDefine Case 1: "macros": [{ "Name": { "Token": 2, - "Lit": "foo" + "Lit": "OK" }, "Body": [{ "Token": 3, @@ -18,6 +18,70 @@ TestDefine Case 1: } } +TestDefine Case 2: +{ + "temp.h": { + "path": "temp.h", + "decls": [], + "includes": [], + "macros": [{ + "Name": { + "Token": 2, + "Lit": "SQUARE" + }, + "Body": [{ + "Token": 0, + "Lit": "(" + }, { + "Token": 2, + "Lit": "x" + }, { + "Token": 0, + "Lit": ")" + }, { + "Token": 0, + "Lit": "(" + }, { + "Token": 0, + "Lit": "(" + }, { + "Token": 2, + "Lit": "x" + }, { + "Token": 0, + "Lit": ")" + }, { + "Token": 0, + "Lit": "*" + }, { + "Token": 0, + "Lit": "(" + }, { + "Token": 2, + "Lit": "x" + }, { + "Token": 0, + "Lit": ")" + }, { + "Token": 0, + "Lit": ")" + }] + }] + } +} + +TestInclude Case 1: +{ + "temp.h": { + "path": "temp.h", + "decls": [], + "includes": [{ + "Path": "foo.h" + }], + "macros": [] + } +} + #stderr diff --git a/chore/_xtool/llcppsigfetch/parse/cvt_test/preprocess_test/preprocess.go b/chore/_xtool/llcppsigfetch/parse/cvt_test/preprocess_test/preprocess.go index d342b2b0..f5ef45a5 100644 --- a/chore/_xtool/llcppsigfetch/parse/cvt_test/preprocess_test/preprocess.go +++ b/chore/_xtool/llcppsigfetch/parse/cvt_test/preprocess_test/preprocess.go @@ -7,11 +7,13 @@ import ( func main() { TestDefine() + TestInclude() } func TestDefine() { testCases := []string{ - `#define foo 1`, + `#define OK 1`, + `#define SQUARE(x) ((x) * (x))`, } for i, content := range testCases { @@ -31,3 +33,27 @@ func TestDefine() { converter.Dispose() } } + +func TestInclude() { + testCases := []string{ + `#include "foo.h"`, + // `#include `, // Standard libraries are mostly platform-dependent + } + + for i, content := range testCases { + converter, err := parse.NewConverter(content, true) + if err != nil { + panic(err) + } + + _, err = converter.Convert() + if err != nil { + panic(err) + } + + json := converter.MarshalASTFiles() + c.Printf(c.Str("TestInclude Case %d:\n%s\n\n"), c.Int(i+1), json.Print()) + + converter.Dispose() + } +} diff --git a/chore/_xtool/llcppsigfetch/parse/dump.go b/chore/_xtool/llcppsigfetch/parse/dump.go index a72bac5a..91a9c594 100644 --- a/chore/_xtool/llcppsigfetch/parse/dump.go +++ b/chore/_xtool/llcppsigfetch/parse/dump.go @@ -28,6 +28,11 @@ func MarshalASTFile(file *ast.File) *cjson.JSON { // json:includes,omitempty if file.Includes != nil { includes := cjson.Array() + for _, i := range file.Includes { + include := cjson.Object() + include.SetItem(c.Str("Path"), cjson.String(c.AllocaCStr(i.Path))) + includes.AddItem(include) + } root.SetItem(c.Str("includes"), includes) }