[PATCH] D82360: Add StringLiteral to SyntaxTree
This revision was automatically updated to reflect the committed changes. Closed by commit rG466e8b7ea6e1: Add StringLiteral to SyntaxTree (authored by eduucaldas). Changed prior to commit: https://reviews.llvm.org/D82360?vs=273346&id=273438#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82360/new/ https://reviews.llvm.org/D82360 Files: clang/include/clang/Tooling/Syntax/Nodes.h clang/lib/Tooling/Syntax/BuildTree.cpp clang/lib/Tooling/Syntax/Nodes.cpp clang/unittests/Tooling/Syntax/TreeTest.cpp Index: clang/unittests/Tooling/Syntax/TreeTest.cpp === --- clang/unittests/Tooling/Syntax/TreeTest.cpp +++ clang/unittests/Tooling/Syntax/TreeTest.cpp @@ -1399,6 +1399,109 @@ )txt")); } +TEST_P(SyntaxTreeTest, StringLiteral) { + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test() { + "a\n\0\x20"; + L"αβ"; +} +)cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-StringLiteralExpression +| | `-"a\n\0\x20" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-L"αβ" +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, StringLiteralUtf) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test() { + u8"a\x1f\x05"; + u"C++抽象構文木"; + U"📖🌲\n"; +} +)cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-StringLiteralExpression +| | `-u8"a\x1f\x05" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-u"C++抽象構文木" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-U"📖🌲\n" +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, StringLiteralRaw) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test() { + R"SyntaxTree( + Hello "Syntax" \" + )SyntaxTree"; +} +)cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-StringLiteralExpression +| | `-R"SyntaxTree( + Hello "Syntax" \" + )SyntaxTree" +| `-; +`-} +)txt")); +} + TEST_P(SyntaxTreeTest, IntegerLiteral) { EXPECT_TRUE(treeDumpEqual( R"cpp( @@ -2730,7 +2833,7 @@ | |-BoolLiteralExpression | | `-true | |-, -| |-UnknownExpression +| |-StringLiteralExpression | | `-"message" | |-) | `-; Index: clang/lib/Tooling/Syntax/Nodes.cpp === --- clang/lib/Tooling/Syntax/Nodes.cpp +++ clang/lib/Tooling/Syntax/Nodes.cpp @@ -26,6 +26,8 @@ return OS << "BoolLiteralExpression"; case NodeKind::CharacterLiteralExpression: return OS << "CharacterLiteralExpression"; + case NodeKind::StringLiteralExpression: +return OS << "StringLiteralExpression"; case NodeKind::PrefixUnaryOperatorExpression: return OS << "PrefixUnaryOperatorExpression"; case NodeKind::PostfixUnaryOperatorExpression: @@ -214,6 +216,11 @@ findChild(syntax::NodeRole::LiteralToken)); } +syntax::Leaf *syntax::StringLiteralExpression::literalToken() { + return llvm::cast_or_null( + findChild(syntax::NodeRole::LiteralToken)); +} + syntax::Leaf *syntax::CxxNullPtrExpression::nullPtrKeyword() { return llvm::cast_or_null( findChild(syntax::NodeRole::LiteralToken)); Index: clang/lib/Tooling/Syntax/BuildTree.cpp === --- clang/lib/Tooling/Syntax/BuildTree.cpp +++ clang/lib/Tooling/Syntax/BuildTree.cpp @@ -667,6 +667,12 @@ new (allocator()) syntax::CharacterLiteralExpression, S); return true; } + bool WalkUpFromStringLiteral(StringLiteral *S) { +Builder.markChildToken(S->getBeginLoc(), syntax::NodeRole::LiteralToken); +Builder.foldNode(Builder.getExprRange(S), + new (allocator()) syntax::StringLiteralExpression, S); +return true; + } bool WalkUpFromCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *S) { Builder.markChildToken(S->getLocation(), syntax::NodeRole::LiteralToken); Index: clang/include/clang/Tooling/Syntax/Nodes.h === --- clang/include/clang/Tooling/Syntax/Nodes.h +++ clang/include/clang/Tooling/Syntax/Nodes.h @@ -47,6 +47,7 @@ IntegerLiteralExpression, BoolLiteralExpression, CharacterLiteralExpression, + StringLiteralExpression, IdExpression, // Statements. @@ -287,6 +288,16 @@ syntax::Leaf *literalToken(); };
[PATCH] D82360: Add StringLiteral to SyntaxTree
eduucaldas updated this revision to Diff 273346. eduucaldas added a comment. Add unicode tests Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82360/new/ https://reviews.llvm.org/D82360 Files: clang/include/clang/Tooling/Syntax/Nodes.h clang/lib/Tooling/Syntax/BuildTree.cpp clang/lib/Tooling/Syntax/Nodes.cpp clang/unittests/Tooling/Syntax/TreeTest.cpp Index: clang/unittests/Tooling/Syntax/TreeTest.cpp === --- clang/unittests/Tooling/Syntax/TreeTest.cpp +++ clang/unittests/Tooling/Syntax/TreeTest.cpp @@ -1228,6 +1228,109 @@ )txt")); } +TEST_P(SyntaxTreeTest, StringLiteral) { + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test() { + "a\n\0\x20"; + L"αβ"; +} +)cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-StringLiteralExpression +| | `-"a\n\0\x20" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-L"αβ" +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, StringLiteralUtf) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test() { + u8"a\x1f\x05"; + u"C++抽象構文木"; + U"📖🌲\n"; +} +)cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-StringLiteralExpression +| | `-u8"a\x1f\x05" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-u"C++抽象構文木" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-U"📖🌲\n" +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, StringLiteralRaw) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test() { + R"SyntaxTree( + Hello "Syntax" \" + )SyntaxTree"; +} +)cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-StringLiteralExpression +| | `-R"SyntaxTree( + Hello "Syntax" \" + )SyntaxTree" +| `-; +`-} +)txt")); +} + TEST_P(SyntaxTreeTest, IntegerLiteral) { EXPECT_TRUE(treeDumpEqual( R"cpp( @@ -2559,7 +2662,7 @@ | |-UnknownExpression | | `-true | |-, -| |-UnknownExpression +| |-StringLiteralExpression | | `-"message" | |-) | `-; Index: clang/lib/Tooling/Syntax/Nodes.cpp === --- clang/lib/Tooling/Syntax/Nodes.cpp +++ clang/lib/Tooling/Syntax/Nodes.cpp @@ -22,6 +22,8 @@ return OS << "CxxNullPtrExpression"; case NodeKind::IntegerLiteralExpression: return OS << "IntegerLiteralExpression"; + case NodeKind::StringLiteralExpression: +return OS << "StringLiteralExpression"; case NodeKind::PrefixUnaryOperatorExpression: return OS << "PrefixUnaryOperatorExpression"; case NodeKind::PostfixUnaryOperatorExpression: @@ -200,6 +202,11 @@ findChild(syntax::NodeRole::LiteralToken)); } +syntax::Leaf *syntax::StringLiteralExpression::literalToken() { + return llvm::cast_or_null( + findChild(syntax::NodeRole::LiteralToken)); +} + syntax::Leaf *syntax::CxxNullPtrExpression::nullPtrKeyword() { return llvm::cast_or_null( findChild(syntax::NodeRole::LiteralToken)); Index: clang/lib/Tooling/Syntax/BuildTree.cpp === --- clang/lib/Tooling/Syntax/BuildTree.cpp +++ clang/lib/Tooling/Syntax/BuildTree.cpp @@ -654,6 +654,13 @@ return true; } + bool WalkUpFromStringLiteral(StringLiteral *S) { +Builder.markChildToken(S->getBeginLoc(), syntax::NodeRole::LiteralToken); +Builder.foldNode(Builder.getExprRange(S), + new (allocator()) syntax::StringLiteralExpression, S); +return true; + } + bool WalkUpFromCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *S) { Builder.markChildToken(S->getLocation(), syntax::NodeRole::LiteralToken); Builder.foldNode(Builder.getExprRange(S), Index: clang/include/clang/Tooling/Syntax/Nodes.h === --- clang/include/clang/Tooling/Syntax/Nodes.h +++ clang/include/clang/Tooling/Syntax/Nodes.h @@ -45,6 +45,7 @@ BinaryOperatorExpression, CxxNullPtrExpression, IntegerLiteralExpression, + StringLiteralExpression, IdExpression, // Statements. @@ -264,6 +265,16 @@ syntax::Leaf *literalToken(); }; +/// Expression for string-literals. C++ [lex.string] +class StringLiteralExpression final : public Expression { +public: + StringLiteralExpression() : Expression(NodeKind::StringLiteralExpres
[PATCH] D82360: Add StringLiteral to SyntaxTree
gribozavr2 accepted this revision. gribozavr2 added a comment. This revision is now accepted and ready to land. LGTM with improved testing. Comment at: clang/unittests/Tooling/Syntax/TreeTest.cpp:1237 + "a\n"; + L"a"; +} Could you add some non-ASCII characters to tests? Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D82360/new/ https://reviews.llvm.org/D82360 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D82360: Add StringLiteral to SyntaxTree
eduucaldas created this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. eduucaldas added a reviewer: gribozavr2. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D82360 Files: clang/include/clang/Tooling/Syntax/Nodes.h clang/lib/Tooling/Syntax/BuildTree.cpp clang/lib/Tooling/Syntax/Nodes.cpp clang/unittests/Tooling/Syntax/TreeTest.cpp Index: clang/unittests/Tooling/Syntax/TreeTest.cpp === --- clang/unittests/Tooling/Syntax/TreeTest.cpp +++ clang/unittests/Tooling/Syntax/TreeTest.cpp @@ -1228,6 +1228,114 @@ )txt")); } +TEST_P(SyntaxTreeTest, StringLiteral) { + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test() { + "a"; + "a\n"; + L"a"; +} +)cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-StringLiteralExpression +| | `-"a" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-"a\n" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-L"a" +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, StringLiteralUtf) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test() { + u8"a"; + u"a"; + U"a"; +} +)cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-StringLiteralExpression +| | `-u8"a" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-u"a" +| `-; +|-ExpressionStatement +| |-StringLiteralExpression +| | `-U"a" +| `-; +`-} +)txt")); +} + +TEST_P(SyntaxTreeTest, StringLiteralRaw) { + if (!GetParam().isCXX11OrLater()) { +return; + } + EXPECT_TRUE(treeDumpEqual( + R"cpp( +void test() { + R"SyntaxTree( + Hello "Syntax" \" + )SyntaxTree"; +} +)cpp", + R"txt( +*: TranslationUnit +`-SimpleDeclaration + |-void + |-SimpleDeclarator + | |-test + | `-ParametersAndQualifiers + | |-( + | `-) + `-CompoundStatement +|-{ +|-ExpressionStatement +| |-StringLiteralExpression +| | `-R"SyntaxTree( + Hello "Syntax" \" + )SyntaxTree" +| `-; +`-} +)txt")); +} + TEST_P(SyntaxTreeTest, IntegerLiteral) { EXPECT_TRUE(treeDumpEqual( R"cpp( @@ -2559,7 +2667,7 @@ | |-UnknownExpression | | `-true | |-, -| |-UnknownExpression +| |-StringLiteralExpression | | `-"message" | |-) | `-; Index: clang/lib/Tooling/Syntax/Nodes.cpp === --- clang/lib/Tooling/Syntax/Nodes.cpp +++ clang/lib/Tooling/Syntax/Nodes.cpp @@ -22,6 +22,8 @@ return OS << "CxxNullPtrExpression"; case NodeKind::IntegerLiteralExpression: return OS << "IntegerLiteralExpression"; + case NodeKind::StringLiteralExpression: +return OS << "StringLiteralExpression"; case NodeKind::PrefixUnaryOperatorExpression: return OS << "PrefixUnaryOperatorExpression"; case NodeKind::PostfixUnaryOperatorExpression: @@ -200,6 +202,11 @@ findChild(syntax::NodeRole::LiteralToken)); } +syntax::Leaf *syntax::StringLiteralExpression::literalToken() { + return llvm::cast_or_null( + findChild(syntax::NodeRole::LiteralToken)); +} + syntax::Leaf *syntax::CxxNullPtrExpression::nullPtrKeyword() { return llvm::cast_or_null( findChild(syntax::NodeRole::LiteralToken)); Index: clang/lib/Tooling/Syntax/BuildTree.cpp === --- clang/lib/Tooling/Syntax/BuildTree.cpp +++ clang/lib/Tooling/Syntax/BuildTree.cpp @@ -654,6 +654,13 @@ return true; } + bool WalkUpFromStringLiteral(StringLiteral *S) { +Builder.markChildToken(S->getBeginLoc(), syntax::NodeRole::LiteralToken); +Builder.foldNode(Builder.getExprRange(S), + new (allocator()) syntax::StringLiteralExpression, S); +return true; + } + bool WalkUpFromCXXNullPtrLiteralExpr(CXXNullPtrLiteralExpr *S) { Builder.markChildToken(S->getLocation(), syntax::NodeRole::LiteralToken); Builder.foldNode(Builder.getExprRange(S), Index: clang/include/clang/Tooling/Syntax/Nodes.h === --- clang/include/clang/Tooling/Syntax/Nodes.h +++ clang/include/clang/Tooling/Syntax/Nodes.h @@ -45,6 +45,7 @@ BinaryOperatorExpression, CxxNullPtrExpression, IntegerLiteralExpression, + StringLiteralExpression, IdExpression, // Statements. @@ -264,6 +265,16 @@ syntax::Leaf *literalToken(); }; +/// Expression for string-literals. C++ [lex.string] +class StringLiteralExpression final : public Expression { +public: + StringLiteralExpression() : Expression(No