LibJS: Fix mixing of logical and coalescing operators

The same expression is not allowed to contain both the
logical && and || operators, and the coalescing ?? operator.

This patch changes how "forbidden" tokens are handled, using a
finite set instead of an Vector. This supports much more efficient
merging of the forbidden tokens when propagating forward, and
allowing the return of forbidden tokens to parent contexts.
This commit is contained in:
Anonymous 2022-02-15 22:34:59 -08:00 committed by Linus Groh
commit 602190f66f
Notes: sideshowbarker 2024-07-19 18:29:43 +09:00
3 changed files with 160 additions and 19 deletions

View file

@ -0,0 +1,28 @@
test("mixing coalescing and logical operators isn't allowed", () => {
expect("if (0) a ?? b || c").not.toEval();
expect("if (0) a ?? b && c").not.toEval();
expect("if (0) a ?? b * c || d").not.toEval();
expect("if (0) a ?? b * c && d").not.toEval();
expect("if (0) a && b ?? c").not.toEval();
expect("if (0) a || b ?? c").not.toEval();
expect("if (0) a && b * c ?? d").not.toEval();
expect("if (0) a || b * c ?? d").not.toEval();
});
test("mixing coalescing and logical operators with parens", () => {
expect("if (0) a ?? (b || c)").toEval();
expect("if (0) (a ?? b) && c").toEval();
expect("if (0) a ?? (b * c || d)").toEval();
expect("if (0) (a ?? b * c) && d").toEval();
expect("if (0) a && (b ?? c)").toEval();
expect("if (0) (a || b) ?? c").toEval();
expect("if (0) a && (b * c) ?? d").not.toEval();
expect("if (0) a || (b * c) ?? d").not.toEval();
});
test("mixing coalescing and logical operators when 'in' isn't allowed", () => {
expect("for (a ?? b || c in a; false;);").not.toEval();
expect("for (a ?? b && c in a; false;);").not.toEval();
expect("for (a || b ?? c in a; false;);").not.toEval();
expect("for (a && b ?? c in a; false;);").not.toEval();
});