necesito para preprocesar algunos C++ archivos para insertar automáticamente el código para la prueba y perfiles, y tengo que hacerlo con la API de sonido metálico .Handle C++ con funciones API de sonido metálico para insertar código
Por ahora, quiero ser capaz de hacer lo siguiente: Si hay una función:
int SomeFn(int a, int b, int c) {
doStuff();
}
Quiero preproceso ella, que se ve así:
int SomeFn(int a, int b, int c) {
cout << "SomeFn is invoked with the following arguments: a=" << a << ", b=" << b << ", c=" << c << endl;
doStuff();
}
He intentado extender ASTConsumer
y usar los métodos HandleTopLevelDecl
y HandleTopLevelSingleDecl
y verificar si el Decls
pasado es y bajarlos, así puedo obtener sus nombres y ubicaciones corporales. Pero no puedo manejar los métodos de clase de esa manera, solo las funciones globales.
Encontré una función en la clase ASTConsumer
HandleTagDeclDefinition(TagDecl* D)
. La documentación dice:
Esta devolución de llamada se invoca cada vez que un TagDecl (por ejemplo, estructura, unión, enumeración, clase) se ha completado.
Pero parece que este método ni siquiera se invoca cuando lo pruebo.
Entonces mi pregunta es, ¿cuál sería la forma correcta de hacer esta tarea? ¿Y cómo se representan las clases de C++ en la API de clang? Tal vez alguien lo sepa, donde puedo encontrar ejemplos porque la API de clang está poco documentada.
ACTUALIZACIÓN:
Sé que también es el concepto de Visitors
y no hay un método VisitRecordDecl(RecordDecl *D)
. La documentación dice que RecordDecl
representa las clases. Así que extendí RecursiveASTVisitor
e implementé VisitRecordDecl(RecordDecl *D)
pero parece que este método tampoco se invoca. En su lugar se invoca VisitVarDecl
, cuando se encuentra una definición de clase, como si se viera como una declaración de variable. Así que estoy un poco confundido. Espero que alguien pueda ayudar ...
Update2:
Me trataron de analizar otro archivo de sonido metálico y esta vez encontró una RecordDecl
. Pero el archivo definió una estructura y dos clases, así que creo que mi código clang analiza C en lugar de C++. ¿Hay alguna configuración para cambiar entre C y C++?
Re "porque la API de clang está poco documentada". Para el software de código abierto, la documentación es bastante buena. Hay un manual de usuario en http://clang.llvm.org/docs/UsersManual.html y la API está en autogenerado por doxygen en http://clang.llvm.org/doxygen/index.html. ¿Qué más podrías querer? –
El manual es para el compilador, que no necesito, y el doxygen doc es útil, si sabes cómo funciona el clang, pero yo no. –
En este documento técnico se describe un enfoque que no es Clang que podría ser conceptualmente más fácil de entender: "Cobertura de sucursales simplificada" http://www.semanticdesigns.com/Company/Publications/TestCoverage.pdf La cobertura de sucursales es un tipo de prueba cobertura; el documento discute cómo hacer perfiles utilizando las mismas ideas. –