skip following empty statements in toSequenceExpression (#11724)

* fix: statementlist behavior

* fixed prettier and babel-types/converter errors

* added check for first node

* remove node length check, only check if node is first

* add reset eLU if proceeding is non-empty

* fix failure for ci tests

* remove .expressions since sequence expression isn't produced

* changed test title
This commit is contained in:
William Law 2020-06-25 13:38:01 -04:00 committed by GitHub
parent 65911144e9
commit cfaa70dcf4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 4 deletions

View File

@ -0,0 +1,15 @@
expect(do {
x = do { 1; };
}).toBe(1);
expect(do {
z = do { 1;;;; };
}).toBe(1)
expect(do {
w = (do { 1;;;; });
}).toBe(1);
expect(do {
k = do { ; };
}).toBe(undefined);

View File

@ -25,7 +25,11 @@ export default function gatherSequenceExpressions(
let ensureLastUndefined = true;
for (const node of nodes) {
ensureLastUndefined = false;
// if we encounter emptyStatement before a non-emptyStatement
// we want to disregard that
if (!isEmptyStatement(node)) {
ensureLastUndefined = false;
}
if (isExpression(node)) {
exprs.push(node);
@ -66,7 +70,10 @@ export default function gatherSequenceExpressions(
exprs.push(body);
} else if (isEmptyStatement(node)) {
// empty statement so ensure the last item is undefined if we're last
ensureLastUndefined = true;
// checks if emptyStatement is first
if (nodes.indexOf(node) === 0) {
ensureLastUndefined = true;
}
} else {
// bailed, we can't turn this statement into an expression
return;

View File

@ -317,10 +317,10 @@ describe("converters", function () {
const sequence = t.toSequenceExpression([undefinedNode, node], scope);
expect(sequence).toBeUndefined();
});
it("gathers empty statements", function () {
it("gathers empty statements if first element", function () {
const node = parseCode(";");
const sequence = t.toSequenceExpression([undefinedNode, node], scope);
expect(generateCode(sequence.expressions[1])).toBe("undefined");
expect(generateCode(sequence)).toBe("undefined");
});
it("skips empty statement if expression afterwards", function () {
const node = parseCode("{ ; true }");