Si je devais le faire, je réimplémenterais sans doute ASTConsumer::HandleTranslationUnit et utiliserais RecursiveASTVisitor pour visiter toutes les clang::CXXMethodDecl (c'est la classe qui représente les déclaration de fonction members).
Tu filtre celles qui sont dans les fichier que tu veux modifier, et tu peux savoir avec CXXMethodDecl::hasInlineBody && !isInlineSpecified() si tu veux la déplacer. Tu peux facilement trouver le début et la fin du corps de la fonction (getBody()->getSourceRange()) et utiliser clang::Rewrite pour le remplacer par un ;, et déplacer le corps dans un fichier .cpp.
Tu peux même utiliser clang::Format pour avoir la bonne indentation.
[^] # Re: Superbe article !
Posté par Gof (site web personnel) . En réponse à la dépêche LLVM 3.3 et Clang 3.3. Évalué à 4.
Oui, pas trop compliqué en effet.
Si je devais le faire, je réimplémenterais sans doute ASTConsumer::HandleTranslationUnit et utiliserais RecursiveASTVisitor pour visiter toutes les clang::CXXMethodDecl (c'est la classe qui représente les déclaration de fonction members).
Tu filtre celles qui sont dans les fichier que tu veux modifier, et tu peux savoir avec
CXXMethodDecl::hasInlineBody && !isInlineSpecified()si tu veux la déplacer. Tu peux facilement trouver le début et la fin du corps de la fonction (getBody()->getSourceRange()) et utiliser clang::Rewrite pour le remplacer par un;, et déplacer le corps dans un fichier .cpp.Tu peux même utiliser clang::Format pour avoir la bonne indentation.