We can in fact lift sequences, but only if the operation is assignment and the left-hand side has no side effects nor property access -- that should guarantee that whatever we place before it cannot affect the sense of the assignment. Dropped contrived test case (too hard to support it now), added a more meaningful one.
164 lines
2.8 KiB
JavaScript
164 lines
2.8 KiB
JavaScript
make_sequences_1: {
|
|
options = {
|
|
sequences: true
|
|
};
|
|
input: {
|
|
foo();
|
|
bar();
|
|
baz();
|
|
}
|
|
expect: {
|
|
foo(),bar(),baz();
|
|
}
|
|
}
|
|
|
|
make_sequences_2: {
|
|
options = {
|
|
sequences: true
|
|
};
|
|
input: {
|
|
if (boo) {
|
|
foo();
|
|
bar();
|
|
baz();
|
|
} else {
|
|
x();
|
|
y();
|
|
z();
|
|
}
|
|
}
|
|
expect: {
|
|
if (boo) foo(),bar(),baz();
|
|
else x(),y(),z();
|
|
}
|
|
}
|
|
|
|
make_sequences_3: {
|
|
options = {
|
|
sequences: true
|
|
};
|
|
input: {
|
|
function f() {
|
|
foo();
|
|
bar();
|
|
return baz();
|
|
}
|
|
function g() {
|
|
foo();
|
|
bar();
|
|
throw new Error();
|
|
}
|
|
}
|
|
expect: {
|
|
function f() {
|
|
return foo(), bar(), baz();
|
|
}
|
|
function g() {
|
|
throw foo(), bar(), new Error();
|
|
}
|
|
}
|
|
}
|
|
|
|
make_sequences_4: {
|
|
options = {
|
|
sequences: true
|
|
};
|
|
input: {
|
|
x = 5;
|
|
if (y) z();
|
|
|
|
x = 5;
|
|
for (i = 0; i < 5; i++) console.log(i);
|
|
|
|
x = 5;
|
|
for (; i < 5; i++) console.log(i);
|
|
|
|
x = 5;
|
|
switch (y) {}
|
|
|
|
x = 5;
|
|
with (obj) {}
|
|
}
|
|
expect: {
|
|
if (x = 5, y) z();
|
|
for (x = 5, i = 0; i < 5; i++) console.log(i);
|
|
for (x = 5; i < 5; i++) console.log(i);
|
|
switch (x = 5, y) {}
|
|
with (x = 5, obj);
|
|
}
|
|
}
|
|
|
|
lift_sequences_1: {
|
|
options = { sequences: true };
|
|
input: {
|
|
foo = !(x(), y(), bar());
|
|
}
|
|
expect: {
|
|
x(), y(), foo = !bar();
|
|
}
|
|
}
|
|
|
|
lift_sequences_2: {
|
|
options = { sequences: true, evaluate: true };
|
|
input: {
|
|
foo.x = (foo = {}, 10);
|
|
bar = (bar = {}, 10);
|
|
}
|
|
expect: {
|
|
foo.x = (foo = {}, 10),
|
|
bar = {}, bar = 10;
|
|
}
|
|
}
|
|
|
|
lift_sequences_3: {
|
|
options = { sequences: true, conditionals: true };
|
|
input: {
|
|
x = (foo(), bar(), baz()) ? 10 : 20;
|
|
}
|
|
expect: {
|
|
foo(), bar(), x = baz() ? 10 : 20;
|
|
}
|
|
}
|
|
|
|
lift_sequences_4: {
|
|
options = { side_effects: true };
|
|
input: {
|
|
x = (foo, bar, baz);
|
|
}
|
|
expect: {
|
|
x = baz;
|
|
}
|
|
}
|
|
|
|
for_sequences: {
|
|
options = { sequences: true };
|
|
input: {
|
|
// 1
|
|
foo();
|
|
bar();
|
|
for (; false;);
|
|
// 2
|
|
foo();
|
|
bar();
|
|
for (x = 5; false;);
|
|
// 3
|
|
x = (foo in bar);
|
|
for (; false;);
|
|
// 4
|
|
x = (foo in bar);
|
|
for (y = 5; false;);
|
|
}
|
|
expect: {
|
|
// 1
|
|
for (foo(), bar(); false;);
|
|
// 2
|
|
for (foo(), bar(), x = 5; false;);
|
|
// 3
|
|
x = (foo in bar);
|
|
for (; false;);
|
|
// 4
|
|
x = (foo in bar);
|
|
for (y = 5; false;);
|
|
}
|
|
}
|