Получение комментариев с помощью Python libclang

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

#ifndef __HEADER_FOO
#define __HEADER_FOO

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

#endif

Использование привязок python для 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

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

6

Решение

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

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'

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

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
*/

хоть

2

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

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

1
По вопросам рекламы [email protected]