2013-09-29 5 views
6

Im folgenden Header-Datei Ich mag den entsprechenden +reflect Kommentar zu der Klasse und Membervariable erhalten:Abrufen Kommentare Python mit libclang

#ifndef __HEADER_FOO 
#define __HEADER_FOO 

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

#endif 

die Python-Anbindung Verwendung für libclang und das folgende Skripts:

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() 

gibt mir diese Ausgabe:

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 

Die prob lem ist, dass die Kommentare fehlen. Werden sie vom Präprozessor entkleidet? Gibt es einen Weg, das zu verhindern?

Antwort

2

Um dies zu tun, müssen Sie die Tokens, nicht die Cursor erhalten. Wenn ich das Skript auf die Datei oben ausgeführt:

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() 

ich folgendes:

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' 

Welche genug sein sollte, für mich zu arbeiten.

1

Ja, alle Kommentare werden vom Präprozessor entfernt. Sie können dies sehen, indem Sie clang -E mycode.c > mycode.i tun, die Ihnen eine mycode.i Datei mit allen Vorverarbeitung, aber keine Kommentare geben wird.

Sie können möglicherweise etwas mit einer #pragma oder etwas tun, das nicht entfernt und vom Compiler ignoriert wird.

+1

Wie wäre es CXComment machen? http://clang.llvm.org/doxygen/structCXComment.html oder PARSE_INCLUDE_BRIEF_COMMENTS_IN_CODE_COMPLETION? – user408952

2

Sie müssen das Skript cindex.py ändern und die folgende Funktion verfügbar machen.

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

auch fügen Sie diese an die richtige Stelle in cindex.py

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

Ich musste meine Kommentare mit

/*! 
    * +reflect 
    */ though