我正在使用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
...
答案 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
?