2013-09-29 1 views
6

В следующем заголовочном файле я хотел бы получить соответствующий +reflect комментарий к классу и член переменной:Получение комментарии с помощью питона libclang

#ifndef __HEADER_FOO 
#define __HEADER_FOO 

//+reflect 
class Foo 
{ 
    public: 
    private: 
     int m_int; //+reflect 
}; 

#endif 

Использование питона привязок для libclang и следующий сценарий:

import sys 
import clang.cindex 

def dumpnode(node, indent): 
    print ' ' * indent, node.kind, node.spelling 
    for i in node.get_children(): 
     dumpnode(i, indent+2) 

def main(): 
    index = clang.cindex.Index.create() 
    tu = index.parse(sys.argv[1], args=['-x', 'c++']) 

    dumpnode(tu.cursor, 0) 

if __name__ == '__main__': 
    main() 

дает мне этот выход:

CursorKind.TRANSLATION_UNIT None 
    CursorKind.TYPEDEF_DECL __builtin_va_list 
    CursorKind.CLASS_DECL type_info 
    CursorKind.CLASS_DECL Foo 
    CursorKind.CXX_ACCESS_SPEC_DECL 
    CursorKind.CXX_ACCESS_SPEC_DECL 
    CursorKind.FIELD_DECL m_int 

к веро что комментарии отсутствуют. Они лишены препроцессором? Есть ли способ предотвратить это?

ответ

2

Для этого вам нужно получить жетоны, а не курсоры. Если я запускаю этот скрипт на указанном файле:

import sys 
import clang.cindex 

def srcrangestr(x): 
    return '%s:%d:%d - %s:%d:%d' % (x.start.file, x.start.line, x.start.column, x.end.file, x.end.line, x.end.column) 

def main(): 
    index = clang.cindex.Index.create() 
    tu = index.parse(sys.argv[1], args=['-x', 'c++']) 

    for x in tu.cursor.get_tokens(): 
     print x.kind 
     print " " + srcrangestr(x.extent) 
     print " '" + str(x.spelling) + "'" 

if __name__ == '__main__': 
    main() 

я получаю следующее:

TokenKind.PUNCTUATION 
    test2.h:1:1 - test2.h:1:2 
    '#' 
TokenKind.IDENTIFIER 
    test2.h:1:2 - test2.h:1:8 
    'ifndef' 
TokenKind.IDENTIFIER 
    test2.h:1:9 - test2.h:1:21 
    '__HEADER_FOO' 
TokenKind.PUNCTUATION 
    test2.h:2:1 - test2.h:2:2 
    '#' 
TokenKind.IDENTIFIER 
    test2.h:2:2 - test2.h:2:8 
    'define' 
TokenKind.IDENTIFIER 
    test2.h:2:9 - test2.h:2:21 
    '__HEADER_FOO' 
TokenKind.COMMENT 
    test2.h:4:1 - test2.h:4:11 
    '//+reflect' 
TokenKind.KEYWORD 
    test2.h:5:1 - test2.h:5:6 
    'class' 
TokenKind.IDENTIFIER 
    test2.h:5:7 - test2.h:5:10 
    'Foo' 
TokenKind.PUNCTUATION 
    test2.h:6:1 - test2.h:6:2 
    '{' 
TokenKind.KEYWORD 
    test2.h:7:5 - test2.h:7:11 
    'public' 
TokenKind.PUNCTUATION 
    test2.h:7:11 - test2.h:7:12 
    ':' 
TokenKind.KEYWORD 
    test2.h:8:5 - test2.h:8:12 
    'private' 
TokenKind.PUNCTUATION 
    test2.h:8:12 - test2.h:8:13 
    ':' 
TokenKind.KEYWORD 
    test2.h:9:9 - test2.h:9:12 
    'int' 
TokenKind.IDENTIFIER 
    test2.h:9:13 - test2.h:9:18 
    'm_int' 
TokenKind.PUNCTUATION 
    test2.h:9:18 - test2.h:9:19 
    ';' 
TokenKind.COMMENT 
    test2.h:9:20 - test2.h:9:30 
    '//+reflect' 
TokenKind.PUNCTUATION 
    test2.h:10:1 - test2.h:10:2 
    '}' 
TokenKind.PUNCTUATION 
    test2.h:10:2 - test2.h:10:3 
    ';' 
TokenKind.PUNCTUATION 
    test2.h:12:1 - test2.h:12:2 
    '#' 
TokenKind.IDENTIFIER 
    test2.h:12:2 - test2.h:12:7 
    'endif' 

Что должно быть достаточно для меня, чтобы работать.

1

Да, все комментарии удаляются препроцессором. Вы можете видеть, что выполнив clang -E mycode.c > mycode.i, который даст вам файл mycode.i со всей предварительной обработкой, но комментариев нет.

Возможно, вы сможете что-то сделать, используя #pragma или что-то, что не лишено и игнорируется компилятором.

+1

Как насчет CXComment? http://clang.llvm.org/doxygen/structCXComment.html или PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION? – user408952

2

Вам необходимо изменить скрипт cindex.py и выставить следующую функцию.

class Cursor(Structure): 
    def getRawComment(self): 
    return conf.lib.clang_Cursor_getRawCommentText(self) 

добавить это в правильном месте в cindex.py

("clang_Cursor_getRawCommentText", 
[Cursor], 
_CXString, 
_CXString.from_result), 

я должен был сделать свои комментарии, используя

/*! 
    * +reflect 
    */ though 
Смежные вопросы