Hi djasper,
The current enum detection is overly aggressive. As NestingLevel only applies
per line (?) it classifies many if not most object literals as enum
declarations and adds superfluous line breaks into them. This change narrows
the heuristic by requiring an assignment just before the open brace and
requiring the line to start with an identifier.
http://reviews.llvm.org/D8330
Files:
lib/Format/TokenAnnotator.cpp
unittests/Format/FormatTestJS.cpp
Index: lib/Format/TokenAnnotator.cpp
===================================================================
--- lib/Format/TokenAnnotator.cpp
+++ lib/Format/TokenAnnotator.cpp
@@ -1960,7 +1960,13 @@
Left.Previous->is(tok::char_constant))
return true;
if (Left.is(TT_DictLiteral) && Left.is(tok::l_brace) &&
- Left.NestingLevel == 0)
+ Left.NestingLevel == 0 && Left.Previous &&
+ Left.Previous->is(tok::equal) &&
+ Line.First->isOneOf(tok::identifier, Keywords.kw_import,
+ tok::kw_export) &&
+ // kw_var is a pseudo-token that's a tok::identifier, so matches above.
+ !Line.First->is(Keywords.kw_var))
+ // Enum style object literal.
return true;
} else if (Style.Language == FormatStyle::LK_Java) {
if (Right.is(tok::plus) && Left.is(tok::string_literal) && Right.Next &&
Index: unittests/Format/FormatTestJS.cpp
===================================================================
--- unittests/Format/FormatTestJS.cpp
+++ unittests/Format/FormatTestJS.cpp
@@ -94,10 +94,7 @@
TEST_F(FormatTestJS, ES6DestructuringAssignment) {
verifyFormat("var [a, b, c] = [1, 2, 3];");
- verifyFormat("var {a, b} = {\n"
- " a: 1,\n"
- " b: 2\n"
- "};");
+ verifyFormat("var {a, b} = {a: 1, b: 2};");
}
TEST_F(FormatTestJS, ContainerLiterals) {
@@ -139,6 +136,12 @@
" return x.zIsTooLongForOneLineWithTheDeclarationLine();\n"
" }\n"
"};");
+ // Simple object literal, as opposed to enum style below.
+ verifyFormat("var obj = {a: 123};");
+ // Enum style top level assignment.
+ verifyFormat("X = {\n a: 123\n};");
+ verifyFormat("X.Y = {\n a: 123\n};");
+ verifyFormat("x = foo && {a: 123};");
}
TEST_F(FormatTestJS, SpacesInContainerLiterals) {
@@ -545,7 +548,7 @@
getGoogleJSStyleWithColumns(20));
verifyFormat("import {X as myLocalX, Y as myLocalY} from 'some/module.js';");
verifyFormat("import * as lib from 'some/module.js';");
- verifyFormat("var x = {\n import: 1\n};\nx.import = 2;");
+ verifyFormat("var x = {import: 1};\nx.import = 2;");
verifyFormat("export function fn() {\n"
" return 'fn';\n"
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
Index: lib/Format/TokenAnnotator.cpp
===================================================================
--- lib/Format/TokenAnnotator.cpp
+++ lib/Format/TokenAnnotator.cpp
@@ -1960,7 +1960,13 @@
Left.Previous->is(tok::char_constant))
return true;
if (Left.is(TT_DictLiteral) && Left.is(tok::l_brace) &&
- Left.NestingLevel == 0)
+ Left.NestingLevel == 0 && Left.Previous &&
+ Left.Previous->is(tok::equal) &&
+ Line.First->isOneOf(tok::identifier, Keywords.kw_import,
+ tok::kw_export) &&
+ // kw_var is a pseudo-token that's a tok::identifier, so matches above.
+ !Line.First->is(Keywords.kw_var))
+ // Enum style object literal.
return true;
} else if (Style.Language == FormatStyle::LK_Java) {
if (Right.is(tok::plus) && Left.is(tok::string_literal) && Right.Next &&
Index: unittests/Format/FormatTestJS.cpp
===================================================================
--- unittests/Format/FormatTestJS.cpp
+++ unittests/Format/FormatTestJS.cpp
@@ -94,10 +94,7 @@
TEST_F(FormatTestJS, ES6DestructuringAssignment) {
verifyFormat("var [a, b, c] = [1, 2, 3];");
- verifyFormat("var {a, b} = {\n"
- " a: 1,\n"
- " b: 2\n"
- "};");
+ verifyFormat("var {a, b} = {a: 1, b: 2};");
}
TEST_F(FormatTestJS, ContainerLiterals) {
@@ -139,6 +136,12 @@
" return x.zIsTooLongForOneLineWithTheDeclarationLine();\n"
" }\n"
"};");
+ // Simple object literal, as opposed to enum style below.
+ verifyFormat("var obj = {a: 123};");
+ // Enum style top level assignment.
+ verifyFormat("X = {\n a: 123\n};");
+ verifyFormat("X.Y = {\n a: 123\n};");
+ verifyFormat("x = foo && {a: 123};");
}
TEST_F(FormatTestJS, SpacesInContainerLiterals) {
@@ -545,7 +548,7 @@
getGoogleJSStyleWithColumns(20));
verifyFormat("import {X as myLocalX, Y as myLocalY} from 'some/module.js';");
verifyFormat("import * as lib from 'some/module.js';");
- verifyFormat("var x = {\n import: 1\n};\nx.import = 2;");
+ verifyFormat("var x = {import: 1};\nx.import = 2;");
verifyFormat("export function fn() {\n"
" return 'fn';\n"
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits