Skip to content

Commit 007098d

Browse files
Eduardo Caldasgribozavr
authored andcommitted
Add support for nullptr in SyntaxTrees
Reviewers: gribozavr2 Reviewed By: gribozavr2 Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D81092
1 parent 15a1780 commit 007098d

File tree

4 files changed

+58
-0
lines changed

4 files changed

+58
-0
lines changed

clang/include/clang/Tooling/Syntax/Nodes.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ enum class NodeKind : uint16_t {
4343
PrefixUnaryOperatorExpression,
4444
PostfixUnaryOperatorExpression,
4545
BinaryOperatorExpression,
46+
CxxNullPtrExpression,
4647

4748
// Statements.
4849
UnknownStatement,
@@ -112,6 +113,7 @@ enum class NodeRole : uint8_t {
112113
BinaryOperatorExpression_leftHandSide,
113114
BinaryOperatorExpression_operatorToken,
114115
BinaryOperatorExpression_rightHandSide,
116+
CxxNullPtrExpression_keyword,
115117
CaseStatement_value,
116118
IfStatement_thenStatement,
117119
IfStatement_elseKeyword,
@@ -166,6 +168,16 @@ class UnknownExpression final : public Expression {
166168
}
167169
};
168170

171+
/// C++11 'nullptr' expression.
172+
class CxxNullPtrExpression final : public Expression {
173+
public:
174+
CxxNullPtrExpression() : Expression(NodeKind::CxxNullPtrExpression) {}
175+
static bool classof(const Node *N) {
176+
return N->kind() == NodeKind::CxxNullPtrExpression;
177+
}
178+
syntax::Leaf *nullPtrKeyword();
179+
};
180+
169181
/// An abstract class for prefix and postfix unary operators.
170182
class UnaryOperatorExpression : public Expression {
171183
public:

clang/lib/Tooling/Syntax/BuildTree.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,14 @@ class BuildTreeVisitor : public RecursiveASTVisitor<BuildTreeVisitor> {
608608
return true;
609609
}
610610

611+
bool WalkUpFromCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *S) {
612+
Builder.markChildToken(S->getLocation(),
613+
syntax::NodeRole::CxxNullPtrExpression_keyword);
614+
Builder.foldNode(Builder.getExprRange(S),
615+
new (allocator()) syntax::CxxNullPtrExpression, S);
616+
return true;
617+
}
618+
611619
bool WalkUpFromUnaryOperator(UnaryOperator *S) {
612620
Builder.markChildToken(
613621
S->getOperatorLoc(),

clang/lib/Tooling/Syntax/Nodes.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ llvm::raw_ostream &syntax::operator<<(llvm::raw_ostream &OS, NodeKind K) {
1818
return OS << "TranslationUnit";
1919
case NodeKind::UnknownExpression:
2020
return OS << "UnknownExpression";
21+
case NodeKind::CxxNullPtrExpression:
22+
return OS << "CxxNullPtrExpression";
2123
case NodeKind::PrefixUnaryOperatorExpression:
2224
return OS << "PrefixUnaryOperatorExpression";
2325
case NodeKind::PostfixUnaryOperatorExpression:
@@ -116,6 +118,8 @@ llvm::raw_ostream &syntax::operator<<(llvm::raw_ostream &OS, NodeRole R) {
116118
return OS << "IfStatement_elseKeyword";
117119
case syntax::NodeRole::IfStatement_elseStatement:
118120
return OS << "IfStatement_elseStatement";
121+
case syntax::NodeRole::CxxNullPtrExpression_keyword:
122+
return OS << "CxxNullPtrExpression_keyword";
119123
case syntax::NodeRole::UnaryOperatorExpression_operatorToken:
120124
return OS << "UnaryOperatorExpression_operatorToken";
121125
case syntax::NodeRole::UnaryOperatorExpression_operand:
@@ -158,6 +162,11 @@ llvm::raw_ostream &syntax::operator<<(llvm::raw_ostream &OS, NodeRole R) {
158162
llvm_unreachable("invalid role");
159163
}
160164

165+
syntax::Leaf *syntax::CxxNullPtrExpression::nullPtrKeyword() {
166+
return llvm::cast_or_null<syntax::Leaf>(
167+
findChild(syntax::NodeRole::CxxNullPtrExpression_keyword));
168+
}
169+
161170
syntax::Expression *syntax::BinaryOperatorExpression::lhs() {
162171
return llvm::cast_or_null<syntax::Expression>(
163172
findChild(syntax::NodeRole::BinaryOperatorExpression_leftHandSide));

clang/unittests/Tooling/Syntax/TreeTest.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -670,6 +670,35 @@ void test() {
670670
)txt");
671671
}
672672

673+
TEST_P(SyntaxTreeTest, CxxNullPtrLiteral) {
674+
if (!GetParam().isCXX11OrLater()) {
675+
return;
676+
}
677+
expectTreeDumpEqual(
678+
R"cpp(
679+
void test() {
680+
nullptr;
681+
}
682+
)cpp",
683+
R"txt(
684+
*: TranslationUnit
685+
`-SimpleDeclaration
686+
|-void
687+
|-SimpleDeclarator
688+
| |-test
689+
| `-ParametersAndQualifiers
690+
| |-(
691+
| `-)
692+
`-CompoundStatement
693+
|-{
694+
|-ExpressionStatement
695+
| |-CxxNullPtrExpression
696+
| | `-nullptr
697+
| `-;
698+
`-}
699+
)txt");
700+
}
701+
673702
TEST_P(SyntaxTreeTest, PostfixUnaryOperator) {
674703
expectTreeDumpEqual(
675704
R"cpp(

0 commit comments

Comments
 (0)