Advertisement
Guest User

DeclarationTransformer

a guest
Dec 16th, 2015
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. class DeclarationTransformer : public clang::ast_matchers::MatchFinder::MatchCallback
  2. {
  3.     private:
  4.  
  5.         clang::ASTContext &context;
  6.         clang::Rewriter &rewriter;
  7.  
  8.     public:
  9.  
  10.         explicit DeclarationTransformer(clang::ASTContext &context, clang::Rewriter &rewriter);
  11.  
  12.         void doTransformation();
  13.         virtual void run(const clang::ast_matchers::MatchFinder::MatchResult &result) override;
  14. };
  15.  
  16.  
  17. DeclarationTransformer::DeclarationTransformer(clang::ASTContext &context, clang::Rewriter &rewriter)
  18.         : context(context), rewriter(rewriter)
  19. {}
  20.  
  21. void DeclarationTransformer::doTransformation()
  22. {
  23.     using namespace clang::ast_matchers;
  24.  
  25.     MatchFinder declgroupFinder;
  26.  
  27.     auto declStmtExpr = declStmt().bind("declstmt");
  28.     declgroupFinder.addMatcher(declStmtExpr, this);
  29.  
  30.     declgroupFinder.matchAST(context);
  31. }
  32.  
  33. void DeclarationTransformer::run(const clang::ast_matchers::MatchFinder::MatchResult &result)
  34. {
  35.     using namespace clang;
  36.  
  37.     if(const DeclStmt *declStmt = result.Nodes.getNodeAs<DeclStmt>("declstmt"))
  38.     {
  39.         if(declStmt->isSingleDecl() == false)
  40.         {
  41.             std::string transformed = "";
  42.  
  43.             for(auto it = declStmt->getDeclGroup().begin(); it != declStmt->getDeclGroup().end(); ++it)
  44.             {
  45.                 if(const VarDecl *varDecl = llvm::dyn_cast<VarDecl>(*it))
  46.                 {
  47.                     const clang::ValueDecl *decl = varDecl;
  48.  
  49.                     const std::string name = decl->getNameAsString();
  50.                     const std::string fullyType = decl->getType().getAsString();
  51.  
  52.                     std::string singleDeclaration = fullyType;
  53.  
  54.                     if(decl->getType()->isArrayType())          // in case of int *ptrArray[] this is preferred!
  55.                     {
  56.                         auto pos = singleDeclaration.find("[");
  57.                         singleDeclaration.insert(pos, name);
  58.                     }
  59.                     else if(decl->getType()->isPointerType())
  60.                     {
  61.                         auto pos = singleDeclaration.rfind("*");
  62.                         singleDeclaration.insert(pos+1, name);
  63.                     }
  64.                     else
  65.                     {
  66.                         singleDeclaration += " " + name;
  67.                     }
  68.  
  69.                     // get initializer
  70.                     if(varDecl->hasInit())
  71.                     {
  72.                         const Expr *expr = varDecl->getInit();
  73.  
  74.                         while(const ImplicitCastExpr *ice = llvm::dyn_cast<ImplicitCastExpr>(expr))
  75.                             expr = ice->getSubExpr();
  76.  
  77.                         if(!llvm::isa<CXXConstructExpr>(expr))  // otherwise explicit ctor init-call
  78.                         {
  79.                             auto initValueRange = expr->getSourceRange();
  80.                             auto initStmt = rewriter.getRewrittenText(initValueRange);
  81.  
  82.                             singleDeclaration += " = " + initStmt;
  83.                         }
  84.  
  85.                     }
  86.  
  87.                     transformed += singleDeclaration + ";\n    ";
  88.  
  89.                 }
  90.             }
  91.  
  92.             //llvm::outs() << transformed;
  93.             rewriter.ReplaceText(declStmt->getSourceRange(), transformed);
  94.         }
  95.     }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement