From 41aee75b6da83526365bda2d38a55ffe37a8a60f Mon Sep 17 00:00:00 2001 From: alufers Date: Sun, 2 Jun 2024 21:43:19 +0200 Subject: [PATCH] Handle for loops over ranges with unnamed arguments --- src/Parser.test.ts | 12 ++++++++++++ src/Parser.ts | 15 ++++++++++----- src/__snapshots__/Parser.test.ts.snap | 2 +- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/Parser.test.ts b/src/Parser.test.ts index 3381007..f6aae39 100644 --- a/src/Parser.test.ts +++ b/src/Parser.test.ts @@ -1064,4 +1064,16 @@ describe("Parser", () => { echo(x); `); }); + + it("Can parse for loops with unnamed variables", () => { + doParse(` + for ([-1, 1]){ + echo("should print two times"); + } + + intersection_for([-1, 1]){ + echo("this also should print two times"); + } + `) + }) }); diff --git a/src/Parser.ts b/src/Parser.ts index 3053edc..f4c0382 100644 --- a/src/Parser.ts +++ b/src/Parser.ts @@ -448,7 +448,7 @@ export default class Parser { } } let isForLoop = name === "for" || name === "intersection_for"; - const args = this.args(!isForLoop); + const args = this.args(true, isForLoop ? AssignmentNodeRole.VARIABLE_DECLARATION : null); const secondParen = this.previous(); return new ModuleInstantiationStmt(name, args, null, { firstParen, @@ -462,7 +462,10 @@ export default class Parser { * The initial paren must be consumed. * @param allowPositional Set to true when in call mode, positional arguments will be allowed. */ - protected args(allowPositional = false): AssignmentNode[] { + protected args( + allowPositional = false, + forceType: AssignmentNodeRole | null = null + ): AssignmentNode[] { this.consumeUselessCommas(); const args: AssignmentNode[] = []; if (this.matchToken(TokenType.RightParen)) { @@ -498,9 +501,11 @@ export default class Parser { const arg = new AssignmentNode( name, value, - allowPositional - ? AssignmentNodeRole.ARGUMENT_ASSIGNMENT - : AssignmentNodeRole.ARGUMENT_DECLARATION, + forceType == null + ? allowPositional + ? AssignmentNodeRole.ARGUMENT_ASSIGNMENT + : AssignmentNodeRole.ARGUMENT_DECLARATION + : forceType, { name: nameToken, equals, diff --git a/src/__snapshots__/Parser.test.ts.snap b/src/__snapshots__/Parser.test.ts.snap index fb68217..00d1da1 100644 --- a/src/__snapshots__/Parser.test.ts.snap +++ b/src/__snapshots__/Parser.test.ts.snap @@ -46391,7 +46391,7 @@ polyhedron [[i1,i2,i3],[i2,i3,i4],...]", "__c": "AssignmentNode", "docComment": null, "name": "i", - "role": 1, + "role": 0, "tokens": { "__c": "Object", "equals": {