Preserve type arguments in generic invocation expressions.
Fix #621.
It already handled generic *method* invocations like "foo<int>(1)".
This fixes cases where the receiver is itself an expression, like
"(<T>(T t) => t)<int>(1)".
R=kevmoo@google.com
Review-Url: https://codereview.chromium.org//2844573002 .
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 58bbc3a..d71f499 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,9 @@
# 1.0.4-dev
+
* Ensure formatter throws an exception instead of introducing non-whitespace
- changes.
+ changes. This sanity check ensures the formatter does not erase user code
+ when the formatter itself contains a bug.
+* Preserve type arguments in function expression invocations (#621).
# 1.0.3
diff --git a/lib/src/source_visitor.dart b/lib/src/source_visitor.dart
index 213f7a4..f78627e 100644
--- a/lib/src/source_visitor.dart
+++ b/lib/src/source_visitor.dart
@@ -1151,8 +1151,16 @@
}
visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+ // Try to keep the entire invocation one line.
+ builder.startSpan();
+ builder.nestExpression();
+
visit(node.function);
- visit(node.argumentList);
+ visit(node.typeArguments);
+ visitArgumentList(node.argumentList, nestExpression: false);
+
+ builder.unnest();
+ builder.endSpan();
}
visitFunctionTypeAlias(FunctionTypeAlias node) {
diff --git a/test/regression/0600/0621.stmt b/test/regression/0600/0621.stmt
new file mode 100644
index 0000000..08cb930
--- /dev/null
+++ b/test/regression/0600/0621.stmt
@@ -0,0 +1,8 @@
+>>>
+var x = (f as dynamic)<int>(40, 2);
+<<<
+var x = (f as dynamic)<int>(40, 2);
+>>>
+var y = (f as dynamic)<String>('hi', '!');
+<<<
+var y = (f as dynamic)<String>('hi', '!');
\ No newline at end of file
diff --git a/test/splitting/type_arguments.stmt b/test/splitting/type_arguments.stmt
index 2ba351a..9675153 100644
--- a/test/splitting/type_arguments.stmt
+++ b/test/splitting/type_arguments.stmt
@@ -65,4 +65,33 @@
{
<int>[];
<int>[];
-}
\ No newline at end of file
+}
+>>> type arguments on invocation expressions, all on one line
+(fn)<T, S>(1, 2);
+<<<
+(fn)<T, S>(1, 2);
+>>> type arguments on invocation, prefer to not split at type args
+(longFunction)<TypeArgument>(valueArgument);
+<<<
+(longFunction)<TypeArgument>(
+ valueArgument);
+>>> type arguments on invocation expressions split both type and value arguments
+(longFunction)<First, Second, Third, Fourth, Fifth, Sixth, Seventh, Eighth>(first, second, third, fourth, fifth, sixth, seventh, eighth);
+<<<
+(longFunction)<
+ First,
+ Second,
+ Third,
+ Fourth,
+ Fifth,
+ Sixth,
+ Seventh,
+ Eighth>(
+ first,
+ second,
+ third,
+ fourth,
+ fifth,
+ sixth,
+ seventh,
+ eighth);
\ No newline at end of file