aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Tooling/Syntax/BuildTree.cpp
diff options
context:
space:
mode:
authorEduardo Caldas <ecaldas@google.com>2020-08-19 16:43:33 +0000
committerEduardo Caldas <ecaldas@google.com>2020-08-20 14:57:35 +0000
commitba32915db2ce78256115a9db7b07bb3806e6364a (patch)
tree3e0d8d8095d8d60dd325b73b18a7b71876652e93 /clang/lib/Tooling/Syntax/BuildTree.cpp
parent7f009389752c758ccd9f7cc46867e991d482933e (diff)
downloadllvm-ba32915db2ce78256115a9db7b07bb3806e6364a.zip
llvm-ba32915db2ce78256115a9db7b07bb3806e6364a.tar.gz
llvm-ba32915db2ce78256115a9db7b07bb3806e6364a.tar.bz2
[SyntaxTree] Add support for `MemberExpression`
Differential Revision: https://reviews.llvm.org/D86227
Diffstat (limited to 'clang/lib/Tooling/Syntax/BuildTree.cpp')
-rw-r--r--clang/lib/Tooling/Syntax/BuildTree.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp
index 11d3997..a77149d 100644
--- a/clang/lib/Tooling/Syntax/BuildTree.cpp
+++ b/clang/lib/Tooling/Syntax/BuildTree.cpp
@@ -881,6 +881,49 @@ public:
return true;
}
+ bool WalkUpFromMemberExpr(MemberExpr *S) {
+ if (auto QualifierLoc = S->getQualifierLoc())
+ Builder.markChild(QualifierLoc, syntax::NodeRole::IdExpression_qualifier);
+
+ auto TemplateKeywordLoc = S->getTemplateKeywordLoc();
+ if (TemplateKeywordLoc.isValid())
+ Builder.markChildToken(TemplateKeywordLoc,
+ syntax::NodeRole::TemplateKeyword);
+
+ auto *TheUnqualifiedId = new (allocator()) syntax::UnqualifiedId;
+ Builder.foldNode(Builder.getRange(S->getMemberLoc(), S->getEndLoc()),
+ TheUnqualifiedId, nullptr);
+
+ Builder.markChild(TheUnqualifiedId, syntax::NodeRole::IdExpression_id);
+
+ auto *TheIdExpression = new (allocator()) syntax::IdExpression;
+ auto MemberRange =
+ Builder.getRange(S->hasQualifier() ? S->getQualifierLoc().getBeginLoc()
+ : S->getMemberLoc(),
+ S->getEndLoc());
+
+ // For `MemberExpr` with implicit `this->` we generate a simple
+ // `id-expression` syntax node, beacuse an implicit `member-expression` is
+ // syntactically undistinguishable from an `id-expression`
+ if (S->isImplicitAccess()) {
+ Builder.foldNode(MemberRange, TheIdExpression, S);
+ return true;
+ }
+ Builder.foldNode(MemberRange, TheIdExpression, nullptr);
+
+ Builder.markChild(TheIdExpression,
+ syntax::NodeRole::MemberExpression_member);
+
+ Builder.markExprChild(S->getBase(),
+ syntax::NodeRole::MemberExpression_object);
+ Builder.markChildToken(S->getOperatorLoc(),
+ syntax::NodeRole::MemberExpression_accessToken);
+
+ Builder.foldNode(Builder.getExprRange(S),
+ new (allocator()) syntax::MemberExpression, S);
+ return true;
+ }
+
bool WalkUpFromDeclRefExpr(DeclRefExpr *S) {
if (auto QualifierLoc = S->getQualifierLoc())
Builder.markChild(QualifierLoc, syntax::NodeRole::IdExpression_qualifier);