6

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

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

 const char *funcDecl="ObjCInstanceMethodDecl";

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


 }

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

例如,不应包括以下内容

...

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

...
4

2 回答 2

11

回答这个问题是因为我无法相信硬编码路径比较是唯一的解决方案,而且确实,有一个 clang_Location_isFromMainFile 函数可以完全满足您的需求,这样您就可以过滤访问者中不需要的结果,如下所示:

if (clang_Location_isFromMainFile (clang_getCursorLocation (cursor)) == 0) {
  return CXChildVisit_Continue;
}
于 2014-10-20T09:48:53.783 回答
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直接比较?

于 2013-09-29T18:59:55.433 回答