2013-09-27 3 views
3

Я использую libclang для анализа файла исходного кода объекта c. Следующий код находит все объявления методы экземпляра Objective-C, но он также находит заявления в включает в себя:Как я могу пропускать, используя libclang?

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 

... 

ответ

7

Ответ на этот вопрос, потому что я не мог поверить, что сравнение жесткого кодирования было единственным решением, и действительно, есть функция clang_Location_isFromMainFile, которая делает именно то, что вы хотите, чтобы вы могли фильтровать нежелательные результаты в посетителе, как это:

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

знаете ли вы, как я могу использовать это внутри ASTFrontendAction? – vinnybad

0

Единственный способ, которым я знаю, - пропустить нежелательные пути во время посещения АСТ. Например, вы можете добавить в функцию посетителя что-то вроде следующего. Возврат 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 напрямую?

+0

clang_getFileName (файл) отсутствует –

+0

к сожалению курсор в настоящее время не достигает объявления метода моего Исходный_файл. –

+0

Да, вы правы, я забыл сделать один шаг. Выполняя такие вещи, мне часто приходилось сталкиваться с трудностями при сопоставлении путей к файлам из-за различных существующих способов ссылки на один и тот же файл в файловой системе. Один из способов избежать этого - канонизировать все пути перед их сопоставлением. Пожалуйста, посмотрите мое редактирование для примера (надеюсь, на этот раз!) – Francesco

Смежные вопросы