5chmidti updated this revision to Diff 489232.
5chmidti added a comment.
Add change to release notes
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D141757/new/
https://reviews.llvm.org/D141757
Files:
clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp
clang-tools-extra/clangd/unittests/tweaks/ExtractVariableTests.cpp
clang-tools-extra/docs/ReleaseNotes.rst
Index: clang-tools-extra/docs/ReleaseNotes.rst
===================================================================
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools-extra/docs/ReleaseNotes.rst
@@ -78,6 +78,8 @@
Miscellaneous
^^^^^^^^^^^^^
+- The extract variable tweak gained support for extracting complete lambda
expressions to a variable.
+
Improvements to clang-doc
-------------------------
Index: clang-tools-extra/clangd/unittests/tweaks/ExtractVariableTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/tweaks/ExtractVariableTests.cpp
+++ clang-tools-extra/clangd/unittests/tweaks/ExtractVariableTests.cpp
@@ -98,6 +98,7 @@
return [[t]].bar([[t]].z);
}
void v() { return; }
+ template <typename T> void callable_sink(T) {}
// function default argument
void f(int b = [[1]]) {
// empty selection
@@ -131,6 +132,21 @@
goto label;
label:
a = [[1]];
+
+ // lambdas
+ callable_sink([][[(){}]]);
+
+ // captures
+ int x = 0;
+ callable_sink([ [[=]] ](){});
+ callable_sink([ [[&]] ](){});
+ callable_sink([ [[x]] ](){});
+ callable_sink([ [[&x] ]](){});
+ callable_sink([y = [[x]] ](){});
+ callable_sink([ [[y = x]] ](){});
+
+ // default args
+ callable_sink([](int x = [[10]]){});
}
)cpp";
EXPECT_UNAVAILABLE(UnavailableCases);
@@ -282,6 +298,19 @@
void f() {
auto placeholder = S(2) + S(3) + S(4); S x = S(1) +
placeholder + S(5);
})cpp"},
+ // Complete lambda expressions
+ {R"cpp(template <typename T> void f(T) {}
+ void f2() {
+ f([[ [](){ return 42; }]]);
+ }
+ )cpp",
+ R"cpp(template <typename T> void f(T) {}
+ void f2() {
+ auto placeholder = [](){ return 42; }; f( placeholder);
+ }
+ )cpp"},
+ {R"cpp(void f() { auto x = [[ [](){ return 42; }]]; })cpp",
+ R"cpp(void f() { auto placeholder = [](){ return 42; }; auto x =
placeholder; })cpp"},
// Don't try to analyze across macro boundaries
// FIXME: it'd be nice to do this someday (in a safe way)
{R"cpp(#define ECHO(X) X
Index: clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp
===================================================================
--- clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp
+++ clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp
@@ -152,10 +152,11 @@
auto CanExtractOutside =
[](const SelectionTree::Node *InsertionPoint) -> bool {
if (const clang::Stmt *Stmt = InsertionPoint->ASTNode.get<clang::Stmt>()) {
- // Allow all expressions except LambdaExpr since we don't want to extract
- // from the captures/default arguments of a lambda
+ // Allow all expressions except partial LambdaExpr selections since we
+ // don't want to extract from the captures/default arguments of a lambda
if (isa<clang::Expr>(Stmt))
- return !isa<LambdaExpr>(Stmt);
+ return !(isa<LambdaExpr>(Stmt) &&
+ InsertionPoint->Selected != SelectionTree::Complete);
// We don't yet allow extraction from switch/case stmt as we would need
to
// jump over the switch stmt even if there is a CompoundStmt inside the
// switch. And there are other Stmts which we don't care about (e.g.
Index: clang-tools-extra/docs/ReleaseNotes.rst
===================================================================
--- clang-tools-extra/docs/ReleaseNotes.rst
+++ clang-tools-extra/docs/ReleaseNotes.rst
@@ -78,6 +78,8 @@
Miscellaneous
^^^^^^^^^^^^^
+- The extract variable tweak gained support for extracting complete lambda expressions to a variable.
+
Improvements to clang-doc
-------------------------
Index: clang-tools-extra/clangd/unittests/tweaks/ExtractVariableTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/tweaks/ExtractVariableTests.cpp
+++ clang-tools-extra/clangd/unittests/tweaks/ExtractVariableTests.cpp
@@ -98,6 +98,7 @@
return [[t]].bar([[t]].z);
}
void v() { return; }
+ template <typename T> void callable_sink(T) {}
// function default argument
void f(int b = [[1]]) {
// empty selection
@@ -131,6 +132,21 @@
goto label;
label:
a = [[1]];
+
+ // lambdas
+ callable_sink([][[(){}]]);
+
+ // captures
+ int x = 0;
+ callable_sink([ [[=]] ](){});
+ callable_sink([ [[&]] ](){});
+ callable_sink([ [[x]] ](){});
+ callable_sink([ [[&x] ]](){});
+ callable_sink([y = [[x]] ](){});
+ callable_sink([ [[y = x]] ](){});
+
+ // default args
+ callable_sink([](int x = [[10]]){});
}
)cpp";
EXPECT_UNAVAILABLE(UnavailableCases);
@@ -282,6 +298,19 @@
void f() {
auto placeholder = S(2) + S(3) + S(4); S x = S(1) + placeholder + S(5);
})cpp"},
+ // Complete lambda expressions
+ {R"cpp(template <typename T> void f(T) {}
+ void f2() {
+ f([[ [](){ return 42; }]]);
+ }
+ )cpp",
+ R"cpp(template <typename T> void f(T) {}
+ void f2() {
+ auto placeholder = [](){ return 42; }; f( placeholder);
+ }
+ )cpp"},
+ {R"cpp(void f() { auto x = [[ [](){ return 42; }]]; })cpp",
+ R"cpp(void f() { auto placeholder = [](){ return 42; }; auto x = placeholder; })cpp"},
// Don't try to analyze across macro boundaries
// FIXME: it'd be nice to do this someday (in a safe way)
{R"cpp(#define ECHO(X) X
Index: clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp
===================================================================
--- clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp
+++ clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp
@@ -152,10 +152,11 @@
auto CanExtractOutside =
[](const SelectionTree::Node *InsertionPoint) -> bool {
if (const clang::Stmt *Stmt = InsertionPoint->ASTNode.get<clang::Stmt>()) {
- // Allow all expressions except LambdaExpr since we don't want to extract
- // from the captures/default arguments of a lambda
+ // Allow all expressions except partial LambdaExpr selections since we
+ // don't want to extract from the captures/default arguments of a lambda
if (isa<clang::Expr>(Stmt))
- return !isa<LambdaExpr>(Stmt);
+ return !(isa<LambdaExpr>(Stmt) &&
+ InsertionPoint->Selected != SelectionTree::Complete);
// We don't yet allow extraction from switch/case stmt as we would need to
// jump over the switch stmt even if there is a CompoundStmt inside the
// switch. And there are other Stmts which we don't care about (e.g.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits