From 751d7ad2e20b22a24717fcca69d7bc813ed19ecf Mon Sep 17 00:00:00 2001 From: Jenny Messerly Date: Tue, 20 Nov 2018 22:56:35 +0000 Subject: [PATCH] [dartdevc] fix js_ast comma expression not generating parentheses This happened because for-of printed using EXPRESSION precedence for the iteration expression, but it should be ASSIGNMENT per the spec (https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements). Change-Id: I869ad3f1181cfb33c57fe79aebfa3699f66a0712 Reviewed-on: https://dart-review.googlesource.com/c/84833 Commit-Queue: Jenny Messerly Reviewed-by: Jake Macdonald Auto-Submit: Jenny Messerly --- pkg/dev_compiler/lib/src/js_ast/printer.dart | 2 +- tests/language_2/cascade_2_test.dart | 8 ++++++++ tests/lib_2/lib_2_dartdevc.status | 7 +------ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/pkg/dev_compiler/lib/src/js_ast/printer.dart b/pkg/dev_compiler/lib/src/js_ast/printer.dart index 56f032c04cc..bdd29bdaeee 100644 --- a/pkg/dev_compiler/lib/src/js_ast/printer.dart +++ b/pkg/dev_compiler/lib/src/js_ast/printer.dart @@ -402,7 +402,7 @@ class Printer implements NodeVisitor { newInForInit: true, newAtStatementBegin: false); out(" of"); pendingSpace = true; - visitNestedExpression(loop.iterable, EXPRESSION, + visitNestedExpression(loop.iterable, ASSIGNMENT, newInForInit: false, newAtStatementBegin: false); out(")"); blockBody(loop.body, needsSeparation: false, needsNewline: true); diff --git a/tests/language_2/cascade_2_test.dart b/tests/language_2/cascade_2_test.dart index 1742f48f0fc..11b29741dd3 100644 --- a/tests/language_2/cascade_2_test.dart +++ b/tests/language_2/cascade_2_test.dart @@ -29,6 +29,14 @@ main() { Expect.equals(b, b.path1[2]); Expect.equals(2, b.path2.length); // NPE. + + // Regression test for dartdevc comma expressions (js_ast printer did not + // generate parentheses around the comma expression). + var expectedList = [3, 2, 1]; + for (var actual in expectedList.toList()..sort()) { + Expect.equals( + expectedList.removeLast(), actual, "list items should be sorted"); + } } class Element { diff --git a/tests/lib_2/lib_2_dartdevc.status b/tests/lib_2/lib_2_dartdevc.status index 610f4b973c7..55192e70c99 100644 --- a/tests/lib_2/lib_2_dartdevc.status +++ b/tests/lib_2/lib_2_dartdevc.status @@ -9,10 +9,6 @@ html/xhr_test: Pass, Slow [ $compiler == dartdevk ] async/slow_consumer_test: CompileTimeError -convert/chunked_conversion_utf82_test: RuntimeError -convert/chunked_conversion_utf86_test: RuntimeError -convert/chunked_conversion_utf87_test: RuntimeError -convert/utf82_test: RuntimeError html/debugger_test: CompileTimeError [ $runtime == chrome && ($compiler == dartdevc || $compiler == dartdevk) ] @@ -43,8 +39,7 @@ convert/base64_test/01: Fail, OK # Uses bit-wise operations to detect invalid va convert/chunked_conversion_utf88_test: Slow, Pass convert/json_utf8_chunk_test: Slow, Pass convert/streamed_conversion_json_utf8_encode_test: Pass, Timeout # Issue 29922 -convert/streamed_conversion_utf8_decode_test: Slow, Pass -convert/streamed_conversion_utf8_encode_test: Pass, Timeout # Issue 29922 +convert/streamed_conversion_utf8_decode_test: Slow, Pass, Timeout # Issue 29922 convert/utf85_test: Slow, Pass html/async_spawnuri_test: RuntimeError # Issue 29922 html/async_test: RuntimeError # Issue 29922