diff options
author | Eduardo Caldas <ecaldas@google.com> | 2020-08-19 16:43:33 +0000 |
---|---|---|
committer | Eduardo Caldas <ecaldas@google.com> | 2020-08-20 14:57:35 +0000 |
commit | ba32915db2ce78256115a9db7b07bb3806e6364a (patch) | |
tree | 3e0d8d8095d8d60dd325b73b18a7b71876652e93 /clang/lib/Tooling/Syntax/BuildTree.cpp | |
parent | 7f009389752c758ccd9f7cc46867e991d482933e (diff) | |
download | llvm-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.cpp | 43 |
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); |