python c++ c clang libclang

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