mprobst updated this revision to Diff 240202.
mprobst added a comment.
- Disable arrow functions on single lines by default.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D73335/new/
https://reviews.llvm.org/D73335
Files:
clang/lib/Format/Format.cpp
clang/lib/Format/TokenAnnotator.cpp
clang/unittests/Format/FormatTestJS.cpp
Index: clang/unittests/Format/FormatTestJS.cpp
===================================================================
--- clang/unittests/Format/FormatTestJS.cpp
+++ clang/unittests/Format/FormatTestJS.cpp
@@ -459,8 +459,9 @@
// Arrow functions in object literals.
verifyFormat("var x = {\n"
" y: (a) => {\n"
+ " x();\n"
" return a;\n"
- " }\n"
+ " },\n"
"};");
verifyFormat("var x = {y: (a) => a};");
@@ -486,7 +487,8 @@
// Object literals can leave out labels.
verifyFormat("f({a}, () => {\n"
- " g(); //\n"
+ " x;\n"
+ " g();\n"
"});");
// Keys can be quoted.
@@ -1112,8 +1114,9 @@
TEST_F(FormatTestJS, ArrowFunctions) {
verifyFormat("var x = (a) => {\n"
+ " x;\n"
" return a;\n"
- "};");
+ "};\n");
verifyFormat("var x = (a) => {\n"
" function y() {\n"
" return 42;\n"
@@ -1121,6 +1124,7 @@
" return a;\n"
"};");
verifyFormat("var x = (a: type): {some: type} => {\n"
+ " y;\n"
" return a;\n"
"};");
verifyFormat("var x = (a) => a;");
@@ -1147,10 +1151,36 @@
" // break\n"
" );");
verifyFormat("const f = (x: string|null): string|null => {\n"
+ " y;\n"
" return x;\n"
"}\n");
}
+TEST_F(FormatTestJS, ArrowFunctionStyle) {
+ FormatStyle Style = getGoogleStyle(FormatStyle::LK_JavaScript);
+ Style.AllowShortLambdasOnASingleLine = FormatStyle::SLS_All;
+ verifyFormat("const arr = () => { x; };", Style);
+ Style.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
+ verifyFormat("const arr = () => {\n"
+ " x;\n"
+ "};",
+ Style);
+ Style.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Empty;
+ verifyFormat("const arr = () => {\n"
+ " x;\n"
+ "};",
+ Style);
+ verifyFormat("const arr = () => {};",
+ Style);
+ Style.AllowShortLambdasOnASingleLine = FormatStyle::SLS_Inline;
+ verifyFormat("const arr = () => {\n"
+ " x;\n"
+ "};",
+ Style);
+ verifyFormat("foo(() => {});",
+ Style);
+}
+
TEST_F(FormatTestJS, ReturnStatements) {
verifyFormat("function() {\n"
" return [hello, world];\n"
@@ -1711,10 +1741,12 @@
TEST_F(FormatTestJS, RemoveEmptyLinesInArrowFunctions) {
verifyFormat("x = () => {\n"
" foo();\n"
+ " bar();\n"
"};\n",
"x = () => {\n"
"\n"
" foo();\n"
+ " bar();\n"
"\n"
"};\n");
}
@@ -1790,7 +1822,10 @@
" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
"];");
verifyFormat("export default [];");
- verifyFormat("export default () => {};");
+ verifyFormat("export default () => {\n"
+ " x;\n"
+ " x;\n"
+ "};");
verifyFormat("export interface Foo {\n"
" foo: number;\n"
"}\n"
Index: clang/lib/Format/TokenAnnotator.cpp
===================================================================
--- clang/lib/Format/TokenAnnotator.cpp
+++ clang/lib/Format/TokenAnnotator.cpp
@@ -3142,6 +3142,23 @@
// JavaScript top-level enum key/value pairs are put on separate lines
// instead of bin-packing.
return true;
+ if (Right.is(tok::r_brace) && Left.is(tok::l_brace) && Left.Previous &&
+ Left.Previous->is(TT_JsFatArrow)) {
+ // JS arrow function (=> {...}).
+ switch (Style.AllowShortLambdasOnASingleLine) {
+ case FormatStyle::SLS_All:
+ return false;
+ case FormatStyle::SLS_None:
+ return true;
+ case FormatStyle::SLS_Empty:
+ return !Left.Children.empty();
+ case FormatStyle::SLS_Inline:
+ return (Left.NestingLevel == 0 && Line.Level == 0);
+ default:
+ break;
+ }
+ }
+
if (Right.is(tok::r_brace) && Left.is(tok::l_brace) &&
!Left.Children.empty())
// Support AllowShortFunctionsOnASingleLine for JavaScript.
Index: clang/lib/Format/Format.cpp
===================================================================
--- clang/lib/Format/Format.cpp
+++ clang/lib/Format/Format.cpp
@@ -939,6 +939,8 @@
GoogleStyle.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
GoogleStyle.AlignOperands = false;
GoogleStyle.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Empty;
+ // TODO: still under discussion whether to switch to SLS_All.
+ GoogleStyle.AllowShortLambdasOnASingleLine = FormatStyle::SLS_None;
GoogleStyle.AlwaysBreakBeforeMultilineStrings = false;
GoogleStyle.BreakBeforeTernaryOperators = false;
// taze:, triple slash directives (`/// <...`), tslint:, and @see, which is
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits