python - Encontrar enumeraciones anónimas con libclang
c++ (1)
Desafortunadamente, clang_Cursor_isAnonymous
solo funciona con estructuras y uniones como se puede ver en el código fuente de clang en tools/libclang/CXType.cpp
unsigned clang_Cursor_isAnonymous(CXCursor C){
if (!clang_isDeclaration(C.kind))
return 0;
const Decl *D = cxcursor::getCursorDecl(C);
if (const RecordDecl *FD = dyn_cast_or_null<RecordDecl>(D))
return FD->isAnonymousStructOrUnion();
return 0;
}
Así que el conf.lib.clang_Cursor_isAnonymous
a conf.lib.clang_Cursor_isAnonymous
en clang.cindex.Cursor.is_anonymous no hace nada nuevo, ya que el tipo de cursor ya se ha verificado con FIELD_DECL (que solo es válido para estructuras y uniones)
def is_anonymous(self):
"""
Check if the record is anonymous.
"""
if self.kind == CursorKind.FIELD_DECL:
return self.type.get_declaration().is_anonymous()
return conf.lib.clang_Cursor_isAnonymous(self)
Puede intentar extraer el identificador del elemento actual ( n en su muestra) y verificar si existe o es nulo
¿Hay una manera de detectar enumeraciones anónimas usando libclang sin confiar en el texto en el nombre de la ortografía?
Los enlaces de python a libclang incluyen funcionalidad para detectar si las estructuras o uniones de C / C ++ son anónimas usando clang.cindex.Cursor.is_anonymous , que termina llamando a clang_Cursor_isAnonymous .
La siguiente muestra demuestra el problema.
import sys
from clang.cindex import *
def nodeinfo(n):
return (n.kind, n.is_anonymous(), n.spelling, n.type.spelling)
idx = Index.create()
# translation unit parsed correctly
tu = idx.parse(sys.argv[1], [''-std=c++11''])
assert(len(tu.diagnostics) == 0)
for n in tu.cursor.walk_preorder():
if n.kind == CursorKind.STRUCT_DECL and n.is_anonymous():
print nodeinfo(n)
if n.kind == CursorKind.UNION_DECL and n.is_anonymous():
print nodeinfo(n)
if n.kind == CursorKind.ENUM_DECL:
if n.is_anonymous():
print nodeinfo(n)
else:
print ''INCORRECT'', nodeinfo(n)
Que cuando se ejecuta en sample.cpp
enum
{
VAL = 1
};
struct s
{
struct {};
union
{
int x;
float y;
};
};
Da:
INCORRECT (CursorKind.ENUM_DECL, False, '''', ''(anonymous enum at sample1.cpp:1:1)'')
(CursorKind.STRUCT_DECL, True, '''', ''s::(anonymous struct at sample1.cpp:8:5)'')
(CursorKind.UNION_DECL, True, '''', ''s::(anonymous union at sample1.cpp:9:5)'')