我如何跳过包含使用libclang?

时间:2013-09-27 08:24:21

标签: objective-c parsing libclang

我正在使用libclang来解析一个客观的c源代码文件。以下代码查找所有Objective-C实例方法声明,但它也在includes中找到声明:

 enum CXCursorKind curKind  = clang_getCursorKind(cursor);
 CXString curKindName  = clang_getCursorKindSpelling(curKind);

 const char *funcDecl="ObjCInstanceMethodDecl";

 if(strcmp(clang_getCString(curKindName),funcDecl)==0{


 }

如何跳过包含头文件的所有内容?我只对源文件中我自己的Objective-C实例方法声明感兴趣,而不是任何包含。

e.g。不应包括以下内容

...

Location: /System/Library/Frameworks/Foundation.framework/Headers/NSObject.h:15:9:315
Type: 
TypeKind: Invalid
CursorKind: ObjCInstanceMethodDecl

...

2 个答案:

答案 0 :(得分:9)

回答这个问题,因为我无法相信硬编码路径比较是唯一的解决方案,实际上,有一个clang_Location_isFromMainFile函数可以完全按照您的需要进行操作,因此您可以在访问者中过滤不需要的结果,例如这个:

if (clang_Location_isFromMainFile (clang_getCursorLocation (cursor)) == 0) {
  return CXChildVisit_Continue;
}

答案 1 :(得分:0)

我知道的唯一方法是在AST访问期间跳过不需要的路径。例如,您可以在访问者函数中添加以下内容。返回CXChildVisit_Continue可以避免访问整个文件。

CXFile file;
unsigned int line, column, offset;
CXString fileName;
char * canonicalPath = NULL;

clang_getExpansionLocation (clang_getCursorLocation (cursor),
                            &file, &line, &column, &offset);

fileName = clang_getFileName (file);
if (clang_getCString (fileName)) {
  canonicalPath = realpath (clang_getCString (fileName), NULL);
}
clang_disposeString (fileName);

if (strcmp(canonicalPath, "/canonical/path/to/your/source/file") != 0) {
  return CXChildVisit_Continue;
}

另外,为什么要直接比较CursorKindSpelling而不是CursorKind