From 688181654e96f50cea8d5e6fe1167691174636e8 Mon Sep 17 00:00:00 2001 From: Chris Wanstrath Date: Tue, 2 Dec 2025 16:46:34 -0800 Subject: [PATCH] enable [ a = true ] --- src/parser/node.ts | 1 + src/parser/parser2.ts | 21 ++++++++++++++++++++- src/parser/tests/literals.test.ts | 20 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/parser/node.ts b/src/parser/node.ts index 67838ef..a08e9c8 100644 --- a/src/parser/node.ts +++ b/src/parser/node.ts @@ -10,6 +10,7 @@ export type NodeType = | 'FunctionCallWithBlock' | 'PositionalArg' | 'NamedArg' + | 'NamedArgPrefix' | 'FunctionDef' | 'Params' diff --git a/src/parser/parser2.ts b/src/parser/parser2.ts index 862f4b9..d4afbf7 100644 --- a/src/parser/parser2.ts +++ b/src/parser/parser2.ts @@ -305,6 +305,13 @@ export class Parser { break } + // [ a = true ] + const next = this.peek(peek) + if (next?.type === $T.Operator && next.value === '=') { + isDict = true + break + } + // probably an array if (curr.type !== $T.Comment && curr.type !== $T.Semicolon && curr.type !== $T.Newline) break @@ -445,7 +452,19 @@ export class Parser { continue } - values.push(this.is($T.NamedArgPrefix) ? this.namedArg() : this.arg()) + // check for named arg with space after it (vs connected) + if (this.nextIs($T.Operator, '=')) { + const ident = this.identifier() + const op = this.op('=') + const val = this.arg(true) + const prefix = new SyntaxNode('NamedArgPrefix', ident.from, op.to) + const node = new SyntaxNode('NamedArg', ident.from, val.to) + node.add(prefix) + node.add(val) + values.push(node) + } else { + values.push(this.is($T.NamedArgPrefix) ? this.namedArg() : this.arg()) + } } const close = this.expect($T.CloseBracket) diff --git a/src/parser/tests/literals.test.ts b/src/parser/tests/literals.test.ts index ba423ab..44e2794 100644 --- a/src/parser/tests/literals.test.ts +++ b/src/parser/tests/literals.test.ts @@ -387,6 +387,26 @@ describe('dict literals', () => { Number 3 `) }) + + test('can have spaces between equals', () => { + expect(`[ + a = 1 + b = 2 + c = 3 + ]`).toMatchTree(` + Dict + NamedArg + NamedArgPrefix a = + Number 1 + NamedArg + NamedArgPrefix b = + Number 2 + NamedArg + NamedArgPrefix c = + Number 3 + `) + }) + test('empty dict', () => { expect('[=]').toMatchTree(` Dict [=]