63 Expected<EntityPointerLevelSet>> {
67 llvm::Error fallback(
const Stmt *E) {
71 static EntityPointerLevel incrementPointerLevel(
const EntityPointerLevel &E) {
72 return EntityPointerLevel(E.getEntity(), E.getPointerLevel() + 1);
75 static EntityPointerLevel decrementPointerLevel(
const EntityPointerLevel &E) {
76 assert(E.getPointerLevel() > 0);
77 return EntityPointerLevel(E.getEntity(), E.getPointerLevel() - 1);
80 EntityPointerLevel createEntityPointerLevelFor(
const EntityName &Name) {
81 return EntityPointerLevel(AddEntity(Name), 1);
86 Expected<EntityPointerLevelSet> translateDereferencePointer(
const Expr *Ptr) {
89 Expected<EntityPointerLevelSet> SubResult =
Visit(Ptr);
91 return SubResult.takeError();
93 auto Incremented = llvm::map_range(*SubResult, incrementPointerLevel);
94 return EntityPointerLevelSet{Incremented.begin(), Incremented.end()};
103 : AddEntity(AddEntity), Ctx(Ctx) {}
124 case clang::BO_AddAssign:
125 case clang::BO_SubAssign:
126 case clang::BO_Assign:
128 case clang::BO_Comma:
140 Expected<EntityPointerLevelSet> VisitUnaryOperator(
const UnaryOperator *E) {
142 case clang::UO_PostInc:
143 case clang::UO_PostDec:
144 case clang::UO_PreInc:
145 case clang::UO_PreDec:
147 case clang::UO_AddrOf: {
150 return SubResult.takeError();
152 auto Decremented = llvm::map_range(*SubResult, decrementPointerLevel);
153 return EntityPointerLevelSet{Decremented.begin(), Decremented.end()};
155 case clang::UO_Deref:
156 return translateDereferencePointer(E->
getSubExpr());
164 Expected<EntityPointerLevelSet> VisitCastExpr(
const CastExpr *E) {
167 return EntityPointerLevelSet{};
172 Expected<EntityPointerLevelSet> VisitCallExpr(
const CallExpr *E) {
175 return EntityPointerLevelSet{
176 createEntityPointerLevelFor(*FDEntityName)};
177 return EntityPointerLevelSet{};
181 Expected<EntityPointerLevelSet>
182 VisitArraySubscriptExpr(
const ArraySubscriptExpr *E) {
183 return translateDereferencePointer(E->
getBase());
187 Expected<EntityPointerLevelSet>
188 VisitAbstractConditionalOperator(
const AbstractConditionalOperator *E) {
193 ReT->insert(ReF->begin(), ReF->end());
197 return llvm::joinErrors(ReT.takeError(), ReF.takeError());
199 return ReF.takeError();
200 return ReT.takeError();
203 Expected<EntityPointerLevelSet> VisitParenExpr(
const ParenExpr *E) {
210 Expected<EntityPointerLevelSet> VisitStringLiteral(
const StringLiteral *E) {
211 return EntityPointerLevelSet{};
215 Expected<EntityPointerLevelSet> VisitDeclRefExpr(
const DeclRefExpr *E) {
217 return EntityPointerLevelSet{createEntityPointerLevelFor(*EntityName)};
222 Expected<EntityPointerLevelSet> VisitMemberExpr(
const MemberExpr *E) {
224 return EntityPointerLevelSet{createEntityPointerLevelFor(*EntityName)};
228 Expected<EntityPointerLevelSet>
229 VisitOpaqueValueExpr(
const OpaqueValueExpr *S) {
Defines the clang::ASTContext interface.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
llvm::Expected< EntityPointerLevelSet > translateEntityPointerLevel(const Expr *E, ASTContext &Ctx, std::function< EntityId(EntityName EN)> AddEntity)
An EntityPointerLevel represents a level of the declared pointer/array type of an entity.