ASTHelpers.h
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * C++ Insights, copyright (C) by Andreas Fertig
4  * Distributed under an MIT license. See LICENSE for details
5  *
6  ****************************************************************************/
7 
8 #ifndef INSIGHTS_AST_HELPERS_H
9 #define INSIGHTS_AST_HELPERS_H
10 //-----------------------------------------------------------------------------
11 
12 #include <array>
13 #include <span>
14 #include <string_view>
15 #include <vector>
16 
17 #include "clang/AST/ASTContext.h"
18 #include "clang/AST/ExprCXX.h"
19 #include "llvm/ADT/SmallVector.h"
20 
21 #include "InsightsStrongTypes.h"
22 //-----------------------------------------------------------------------------
23 
25 void ReplaceNode(Stmt* parent, Stmt* oldNode, Stmt* newNode);
26 
27 using params_vector = std::vector<std::pair<std::string_view, QualType>>;
28 using params_store = std::vector<std::pair<std::string, QualType>>;
29 
31 
32 QualType GetRecordDeclType(const CXXMethodDecl* md);
33 QualType GetRecordDeclType(const RecordDecl* rd);
34 
35 DeclRefExpr* mkVarDeclRefExpr(std::string_view name, QualType type);
36 
37 STRONG_BOOL(DoCast);
38 STRONG_BOOL(AsReference);
39 
40 CallExpr* CallConstructor(QualType ctorType,
41  QualType lhsType,
42  const FieldDecl* fieldDecl,
43  ArrayRef<Expr*> callParams,
44  DoCast doCast = DoCast::No,
45  AsReference asReference = AsReference::No);
46 
47 CallExpr* CallConstructor(QualType ctorType,
48  const VarDecl* fieldDecl,
49  ArrayRef<Expr*> callParams,
50  DoCast doCast = DoCast::No,
51  AsReference asReference = AsReference::No);
52 
53 CXXBoolLiteralExpr* Bool(bool b);
54 CallExpr* CallDestructor(const VarDecl* fieldDecl);
55 CXXNewExpr* New(ArrayRef<Expr*> placementArgs, const Expr* expr, QualType t);
56 BinaryOperator* Mul(Expr* lhs, Expr* rhs);
57 BinaryOperator* And(VarDecl* lhs, Expr* rhs);
58 QualType Typedef(std::string_view name, QualType underlayingType);
59 
60 SmallVector<Expr*, 5> ArgsToExprVector(const Expr* expr);
61 
62 ///! A helper type to have a container for ArrayRef
64 {
65  SmallVector<Stmt*, 64> mStmts{};
66 
67  StmtsContainer() = default;
68  StmtsContainer(std::initializer_list<const Stmt*> stmts)
69  {
70  for(const auto& stmt : stmts) {
71  Add(stmt);
72  }
73  }
74 
75  void clear() { mStmts.clear(); }
76 
77  void Add(const Stmt* stmt)
78  {
79  if(stmt) {
80  mStmts.push_back(const_cast<Stmt*>(stmt));
81  }
82  }
83 
84  void AddBodyStmts(Stmt* body);
85 
86  operator ArrayRef<Stmt*>() { return mStmts; }
87 };
88 //-----------------------------------------------------------------------------
89 
90 template<typename... Dcls>
91 DeclStmt* mkDeclStmt(Dcls... dcls)
92 {
93  std::array<Decl*, sizeof...(dcls)> decls{dcls...};
94 
95  DeclStmt* _mkDeclStmt(std::span<Decl*> decls);
96  return _mkDeclStmt(decls);
97 }
98 
99 Stmt* Comment(std::string_view comment);
100 VarDecl* Variable(std::string_view name, QualType type, DeclContext* dc = nullptr);
101 CXXRecordDecl* Struct(std::string_view name);
102 ReturnStmt* Return(Expr* stmt = nullptr);
103 ReturnStmt* Return(const ValueDecl* stmt);
104 
105 CompoundStmt* mkCompoundStmt(ArrayRef<Stmt*> bodyStmts, SourceLocation beginLoc = {}, SourceLocation endLoc = {});
106 DeclRefExpr* mkDeclRefExpr(const ValueDecl* vd);
107 NullStmt* mkNullStmt();
108 FieldDecl* mkFieldDecl(DeclContext* dc, std::string_view name, QualType type);
109 
110 ParenExpr* Paren(Expr*);
111 QualType ContantArrayTy(QualType t, int size);
112 InitListExpr* InitList(ArrayRef<Expr*> initExprs, QualType t);
113 ArraySubscriptExpr* ArraySubscript(const Expr* lhs, uint64_t index, QualType type);
114 MemberExpr* AccessMember(const Expr* expr, const ValueDecl* vd, bool isArrow = true);
115 CXXMemberCallExpr* CallMemberFun(Expr* memExpr, QualType retType);
116 ImplicitCastExpr* CastLToRValue(const VarDecl* vd);
117 FunctionDecl* Function(std::string_view name, QualType returnType, const params_vector& parameters);
118 ParmVarDecl* Parameter(const FunctionDecl* fd, std::string_view name, QualType type);
119 BinaryOperator* Assign(DeclRefExpr* declRef, ValueDecl* field, Expr* assignExpr);
120 BinaryOperator* Assign(MemberExpr* me, ValueDecl* field, Expr* assignExpr);
121 BinaryOperator* Assign(DeclRefExpr* declRef, Expr* assignExpr);
122 BinaryOperator* Assign(const VarDecl* var, Expr* assignExpr);
123 BinaryOperator* Assign(UnaryOperator* var, Expr* assignExpr);
124 BinaryOperator* Assign(Expr* var, Expr* assignExpr);
125 BinaryOperator* Equal(Expr* var, Expr* assignExpr);
126 BinaryOperator* Plus(Expr* var, Expr* assignExpr);
127 CXXReinterpretCastExpr* ReinterpretCast(QualType toType, const Expr* toExpr, bool makePointer = false);
128 CXXStaticCastExpr* StaticCast(QualType toType, const Expr* toExpr, bool makePointer = false);
129 CXXStaticCastExpr* CastToVoidFunPtr(std::string_view name);
130 CXXStaticCastExpr* Cast(const Expr* toExpr, QualType toType);
131 IntegerLiteral* Int32(uint64_t value);
132 IfStmt* If(const Expr* condition, ArrayRef<Stmt*> bodyStmts);
133 SwitchStmt* Switch(Expr* stmt);
134 CaseStmt* Case(int value, Stmt* stmt);
135 BreakStmt* Break();
136 LabelStmt* Label(std::string_view name);
137 GotoStmt* Goto(std::string_view labelName);
138 UnaryOperator* Not(const Expr* stmt);
139 UnaryOperator* Ref(const Expr* e);
140 UnaryOperator* Ref(const ValueDecl* d);
141 UnaryOperator* Dref(const Expr* stmt);
142 UnaryOperator* AddrOf(const Expr* stmt);
143 CallExpr* Call(const FunctionDecl* fd, ArrayRef<Expr*> params);
144 CallExpr* Call(MemberExpr* fd, ArrayRef<Expr*> params);
145 CallExpr* Call(std::string_view name, ArrayRef<Expr*> args);
146 CXXTryStmt* Try(const Stmt* tryBody, CXXCatchStmt* catchAllBody);
147 CXXCatchStmt* Catch(Stmt* body);
148 CXXCatchStmt* Catch(ArrayRef<Stmt*> body);
149 CXXThrowExpr* Throw(const Expr* expr = nullptr);
150 UnaryExprOrTypeTraitExpr* Sizeof(QualType toType);
151 QualType Ptr(QualType srcType);
152 CanQualType VoidTy();
153 
154 } // namespace clang::insights::asthelpers
155 
156 #endif /* INSIGHTS_AST_HELPERS_H */
BinaryOperator * Equal(Expr *var, Expr *assignExpr)
Definition: ASTHelpers.cpp:330
UnaryOperator * AddrOf(const Expr *stmt)
Definition: ASTHelpers.cpp:111
BinaryOperator * Plus(Expr *var, Expr *assignExpr)
Definition: ASTHelpers.cpp:336
CXXReinterpretCastExpr * ReinterpretCast(QualType toType, const Expr *toExpr, bool makePointer)
Definition: ASTHelpers.cpp:234
CXXRecordDecl * Struct(std::string_view name)
Definition: ASTHelpers.cpp:512
FieldDecl * mkFieldDecl(DeclContext *dc, std::string_view name, QualType type)
Definition: ASTHelpers.cpp:533
params_vector to_params_view(params_store &params)
Definition: ASTHelpers.cpp:560
DeclStmt * mkDeclStmt(Dcls... dcls)
Definition: ASTHelpers.h:91
DeclRefExpr * mkDeclRefExpr(const ValueDecl *vd)
Definition: ASTHelpers.cpp:425
QualType Typedef(std::string_view name, QualType underlayingType)
Definition: ASTHelpers.cpp:663
CXXNewExpr * New(ArrayRef< Expr * > placementArgs, const Expr *expr, QualType t)
Definition: ASTHelpers.cpp:689
std::vector< std::pair< std::string_view, QualType > > params_vector
Definition: ASTHelpers.h:27
CallExpr * Call(const FunctionDecl *fd, ArrayRef< Expr * > params)
Definition: ASTHelpers.cpp:117
UnaryOperator * Ref(const Expr *e)
Definition: ASTHelpers.cpp:93
VarDecl * Variable(std::string_view name, QualType type, DeclContext *dc)
Definition: ASTHelpers.cpp:487
MemberExpr * AccessMember(const Expr *expr, const ValueDecl *vd, bool isArrow)
Definition: ASTHelpers.cpp:318
DeclRefExpr * mkVarDeclRefExpr(std::string_view name, QualType type)
Definition: ASTHelpers.cpp:573
SmallVector< Expr *, 5 > ArgsToExprVector(const Expr *expr)
Definition: ASTHelpers.cpp:740
ArraySubscriptExpr * ArraySubscript(const Expr *lhs, uint64_t index, QualType type)
Definition: ASTHelpers.cpp:553
ReturnStmt * Return(Expr *stmt)
Definition: ASTHelpers.cpp:454
CXXStaticCastExpr * Cast(const Expr *toExpr, QualType toType)
Definition: ASTHelpers.cpp:178
CXXStaticCastExpr * CastToVoidFunPtr(std::string_view name)
Definition: ASTHelpers.cpp:228
CaseStmt * Case(int value, Stmt *stmt)
Definition: ASTHelpers.cpp:478
Stmt * Comment(std::string_view comment)
Definition: ASTHelpers.cpp:506
ParenExpr * Paren(Expr *expr)
Definition: ASTHelpers.cpp:196
IfStmt * If(const Expr *condition, ArrayRef< Stmt * > bodyStmts)
Definition: ASTHelpers.cpp:293
BinaryOperator * And(VarDecl *lhs, Expr *rhs)
Definition: ASTHelpers.cpp:717
BinaryOperator * Mul(Expr *lhs, Expr *rhs)
Definition: ASTHelpers.cpp:711
GotoStmt * Goto(std::string_view labelName)
Definition: ASTHelpers.cpp:342
InitListExpr * InitList(ArrayRef< Expr * > initExprs, QualType t)
Definition: ASTHelpers.cpp:544
CXXCatchStmt * Catch(ArrayRef< Stmt * > body)
Definition: ASTHelpers.cpp:151
CXXThrowExpr * Throw(const Expr *expr)
Definition: ASTHelpers.cpp:165
void ReplaceNode(Stmt *parent, Stmt *oldNode, Stmt *newNode)
Definition: ASTHelpers.cpp:734
UnaryExprOrTypeTraitExpr * Sizeof(QualType toType)
Definition: ASTHelpers.cpp:171
QualType GetRecordDeclType(const CXXMethodDecl *md)
Definition: ASTHelpers.cpp:677
static CallExpr * CallConstructor(QualType ctorType, DeclRefExpr *lhsDeclRef, Expr *lhsMemberExpr, ArrayRef< Expr * > callParams, DoCast doCast, AsReference asReference)
Definition: ASTHelpers.cpp:582
LabelStmt * Label(std::string_view name)
Definition: ASTHelpers.cpp:281
std::vector< std::pair< std::string, QualType > > params_store
Definition: ASTHelpers.h:28
DeclStmt * _mkDeclStmt(std::span< Decl * > decls)
Definition: ASTHelpers.cpp:21
UnaryOperator * Not(const Expr *stmt)
Definition: ASTHelpers.cpp:81
CXXBoolLiteralExpr * Bool(bool b)
Definition: ASTHelpers.cpp:645
FunctionDecl * Function(std::string_view name, QualType returnType, const params_vector &parameters)
Definition: ASTHelpers.cpp:403
CompoundStmt * mkCompoundStmt(ArrayRef< Stmt * > bodyStmts, SourceLocation beginLoc, SourceLocation endLoc)
Definition: ASTHelpers.cpp:287
SwitchStmt * Switch(Expr *stmt)
Definition: ASTHelpers.cpp:466
IntegerLiteral * Int32(uint64_t value)
Definition: ASTHelpers.cpp:309
QualType ContantArrayTy(QualType t, int size)
Definition: ASTHelpers.cpp:202
ImplicitCastExpr * CastLToRValue(const VarDecl *vd)
Definition: ASTHelpers.cpp:441
ParmVarDecl * Parameter(const FunctionDecl *fd, std::string_view name, QualType type)
Definition: ASTHelpers.cpp:348
UnaryOperator * Dref(const Expr *stmt)
Definition: ASTHelpers.cpp:105
QualType Ptr(QualType srcType)
Definition: ASTHelpers.cpp:184
CXXStaticCastExpr * StaticCast(QualType toType, const Expr *toExpr, bool makePointer)
Definition: ASTHelpers.cpp:253
CXXMemberCallExpr * CallMemberFun(Expr *memExpr, QualType retType)
Definition: ASTHelpers.cpp:448
BinaryOperator * Assign(const VarDecl *var, Expr *assignExpr)
Definition: ASTHelpers.cpp:31
CXXTryStmt * Try(const Stmt *tryBody, CXXCatchStmt *catchAllBody)
Definition: ASTHelpers.cpp:144
CallExpr * CallDestructor(const VarDecl *varDecl)
Definition: ASTHelpers.cpp:652
! A helper type to have a container for ArrayRef
Definition: ASTHelpers.h:64
StmtsContainer(std::initializer_list< const Stmt * > stmts)
Definition: ASTHelpers.h:68
SmallVector< Stmt *, 64 > mStmts
Definition: ASTHelpers.h:65