2013-09-29 25 views
6

在下面的头文件我想获得相应的+reflect注释的类和成员变量:检索评论使用python libclang

#ifndef __HEADER_FOO 
#define __HEADER_FOO 

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

#endif 

使用的libclang Python绑定与下面的脚本:

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 

的概率lem是评论缺失。他们是否被预处理器剥离?有什么办法可以防止这种情况发生?

回答

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