42 Expected<EntityPointerLevelSet>> {
46 llvm::Error fallback(
const Stmt *E) {
48 "attempt to translate %s to EntityPointerLevels",
53 createEntityPointerLevelFor(
const NamedDecl *ND) {
54 std::optional<EntityId> Id = Extractor.
addEntity(ND);
56 return makeErrAtNode(Ctx, ND,
"failed to create EntityId for %s",
58 return EntityPointerLevel{buildEntityPointerLevel(*Id, 1)};
62 createEntityPointerLevelForReturn(
const FunctionDecl *FD) {
65 return makeErrAtNode(Ctx, FD,
"failed to create EntityId for function %s",
68 return EntityPointerLevel{buildEntityPointerLevel(*Id, 1)};
73 Expected<EntityPointerLevelSet> translateDereferencePointer(
const Expr *Ptr) {
76 Expected<EntityPointerLevelSet> SubResult =
Visit(Ptr);
78 return SubResult.takeError();
81 return EntityPointerLevelSet{Incremented.begin(), Incremented.end()};
84 TUSummaryExtractor &Extractor;
89 : Extractor(Extractor), Ctx(Ctx) {}
94 return createEntityPointerLevelFor(D);
96 if (
const auto *FD = dyn_cast<FunctionDecl>(D))
97 return createEntityPointerLevelForReturn(FD);
99 return makeErrAtNode(Ctx, D,
"attempt to get entity for return of %s",
104 return EntityPointerLevel({E.getEntity(), E.getPointerLevel() + 1});
108 assert(E.getPointerLevel() > 0);
109 return EntityPointerLevel({E.getEntity(), E.getPointerLevel() - 1});
129 case clang::BO_AddAssign:
130 case clang::BO_SubAssign:
131 case clang::BO_Assign:
133 case clang::BO_Comma:
145 Expected<EntityPointerLevelSet> VisitUnaryOperator(
const UnaryOperator *E) {
147 case clang::UO_PostInc:
148 case clang::UO_PostDec:
149 case clang::UO_PreInc:
150 case clang::UO_PreDec:
152 case clang::UO_AddrOf: {
155 return SubResult.takeError();
158 return EntityPointerLevelSet{Decremented.begin(), Decremented.end()};
160 case clang::UO_Deref:
161 return translateDereferencePointer(E->
getSubExpr());
169 Expected<EntityPointerLevelSet> VisitCastExpr(
const CastExpr *E) {
172 return EntityPointerLevelSet{};
177 Expected<EntityPointerLevelSet> VisitCallExpr(
const CallExpr *E) {
179 if (
auto ReturnId = Extractor.addEntityForReturn(FD))
180 return EntityPointerLevelSet{buildEntityPointerLevel(*ReturnId, 1)};
182 return EntityPointerLevelSet{};
186 Expected<EntityPointerLevelSet>
187 VisitArraySubscriptExpr(
const ArraySubscriptExpr *E) {
188 return translateDereferencePointer(E->
getBase());
192 Expected<EntityPointerLevelSet>
193 VisitAbstractConditionalOperator(
const AbstractConditionalOperator *E) {
198 ReT->insert(ReF->begin(), ReF->end());
202 return llvm::joinErrors(ReT.takeError(), ReF.takeError());
204 return ReF.takeError();
205 return ReT.takeError();
208 Expected<EntityPointerLevelSet> VisitParenExpr(
const ParenExpr *E) {
215 Expected<EntityPointerLevelSet> VisitStringLiteral(
const StringLiteral *E) {
216 return EntityPointerLevelSet{};
220 Expected<EntityPointerLevelSet> VisitDeclRefExpr(
const DeclRefExpr *E) {
221 auto Res = createEntityPointerLevelFor(E->
getDecl());
223 return Res.takeError();
224 return EntityPointerLevelSet{*Res};
228 Expected<EntityPointerLevelSet> VisitMemberExpr(
const MemberExpr *E) {
231 return Res.takeError();
232 return EntityPointerLevelSet{*Res};
236 Expected<EntityPointerLevelSet>
237 VisitCXXDefaultArgExpr(
const CXXDefaultArgExpr *E) {
241 Expected<EntityPointerLevelSet>
242 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 ...