diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-11-14 22:06:55 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-11-14 22:06:55 +0000 |
commit | f64d0a4d00fba615f452940ac82654bf9b3efc02 (patch) | |
tree | 5839638cc3c8fa4cecb4b1e688846e4850360a1d /clang/unittests/Tooling/ASTSelectionTest.cpp | |
parent | 383fbd050cff65bd7568f5b94a18ee2c86273600 (diff) | |
download | bcm5719-llvm-f64d0a4d00fba615f452940ac82654bf9b3efc02.tar.gz bcm5719-llvm-f64d0a4d00fba615f452940ac82654bf9b3efc02.zip |
[refactor][selection] canonicalize member expr callee to the full
member call expression
We would like to extract the full call when just the callee is selected.
llvm-svn: 318205
Diffstat (limited to 'clang/unittests/Tooling/ASTSelectionTest.cpp')
-rw-r--r-- | clang/unittests/Tooling/ASTSelectionTest.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/clang/unittests/Tooling/ASTSelectionTest.cpp b/clang/unittests/Tooling/ASTSelectionTest.cpp index f10d899a0a7..fc5186ea208 100644 --- a/clang/unittests/Tooling/ASTSelectionTest.cpp +++ b/clang/unittests/Tooling/ASTSelectionTest.cpp @@ -1004,4 +1004,56 @@ void foo() { SelectionFinderVisitor::Lang_OBJC); } +TEST(ASTSelectionFinder, CanonicalizeMemberCalleeToCall) { + StringRef Source = R"( +class AClass { public: + void method(); + int afield; + void selectWholeCallWhenJustMethodSelected(int &i) { + method(); + } +}; +void selectWholeCallWhenJustMethodSelected() { + AClass a; + a.method(); +} +void dontSelectArgument(AClass &a) { + a.selectWholeCallWhenJustMethodSelected(a.afield); +} + )"; + // Just 'method' with implicit 'this': + findSelectedASTNodesWithRange( + Source, {6, 5}, FileRange{{6, 5}, {6, 11}}, + [](SourceRange SelectionRange, Optional<SelectedASTNode> Node) { + EXPECT_TRUE(Node); + Optional<CodeRangeASTSelection> SelectedCode = + CodeRangeASTSelection::create(SelectionRange, std::move(*Node)); + EXPECT_TRUE(SelectedCode); + EXPECT_EQ(SelectedCode->size(), 1u); + EXPECT_TRUE(isa<CXXMemberCallExpr>((*SelectedCode)[0])); + }); + // Just 'method': + findSelectedASTNodesWithRange( + Source, {11, 5}, FileRange{{11, 5}, {11, 11}}, + [](SourceRange SelectionRange, Optional<SelectedASTNode> Node) { + EXPECT_TRUE(Node); + Optional<CodeRangeASTSelection> SelectedCode = + CodeRangeASTSelection::create(SelectionRange, std::move(*Node)); + EXPECT_TRUE(SelectedCode); + EXPECT_EQ(SelectedCode->size(), 1u); + EXPECT_TRUE(isa<CXXMemberCallExpr>((*SelectedCode)[0])); + }); + // Just 'afield', which should not select the call. + findSelectedASTNodesWithRange( + Source, {14, 5}, FileRange{{14, 45}, {14, 51}}, + [](SourceRange SelectionRange, Optional<SelectedASTNode> Node) { + EXPECT_TRUE(Node); + Optional<CodeRangeASTSelection> SelectedCode = + CodeRangeASTSelection::create(SelectionRange, std::move(*Node)); + EXPECT_TRUE(SelectedCode); + EXPECT_EQ(SelectedCode->size(), 1u); + EXPECT_FALSE(isa<CXXMemberCallExpr>((*SelectedCode)[0])); + }); +} + } // end anonymous namespace |