From 2d0606810d649799c61fbb7ca36480c7b4118f8d Mon Sep 17 00:00:00 2001 From: takejohn Date: Thu, 2 Jan 2025 22:28:22 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7?= =?UTF-8?q?=E3=82=AF=E3=83=88=E3=83=AA=E3=83=86=E3=83=A9=E3=83=AB=E3=81=AE?= =?UTF-8?q?=E3=82=AD=E3=83=BC=E3=81=AB=E6=96=87=E5=AD=97=E5=88=97=E3=82=92?= =?UTF-8?q?=E6=9B=B8=E3=81=91=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/syntaxes/expressions.ts | 5 ++++- test/index.ts | 2 +- test/literals.ts | 9 +++++++++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/parser/syntaxes/expressions.ts b/src/parser/syntaxes/expressions.ts index 5d6e2641..ca86cd95 100644 --- a/src/parser/syntaxes/expressions.ts +++ b/src/parser/syntaxes/expressions.ts @@ -565,7 +565,10 @@ function parseObject(s: ITokenStream, isStatic: boolean): Ast.Obj { const map = new Map(); while (!s.is(TokenKind.CloseBrace)) { - s.expect(TokenKind.Identifier); + const keyTokenKind = s.getTokenKind(); + if (keyTokenKind !== TokenKind.Identifier && keyTokenKind !== TokenKind.StringLiteral) { + throw unexpectedTokenError(keyTokenKind, s.getPos()); + } const k = s.getTokenValue(); s.next(); diff --git a/test/index.ts b/test/index.ts index af97bf11..ca6d75ee 100644 --- a/test/index.ts +++ b/test/index.ts @@ -197,7 +197,7 @@ describe('Object', () => { ]))); }); - /* 未実装 + /* 未実装 - see also: test/literals.ts > literal > obj (string key) test.concurrent('string key', async () => { const res = await exe(` let obj = { diff --git a/test/literals.ts b/test/literals.ts index 772ba990..462cb5b7 100644 --- a/test/literals.ts +++ b/test/literals.ts @@ -130,6 +130,15 @@ describe('literal', () => { eq(res, OBJ(new Map([['a', NUM(1)], ['b', NUM(2)], ['c', NUM(3)]]))); }); + test.concurrent('obj (string key)', async () => { + const res = await exe(` + <: { + "藍": 42, + } + `); + eq(res, OBJ(new Map([['藍', NUM(42)]]))); + }); + test.concurrent('obj and arr (separated by line break)', async () => { const res = await exe(` <: { From c2887eaec8a5684ee982bea3f3cf5e7c6546e957 Mon Sep 17 00:00:00 2001 From: takejohn Date: Thu, 2 Jan 2025 22:30:16 +0900 Subject: [PATCH 2/3] CHANGELOG --- unreleased/object-key-string.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 unreleased/object-key-string.md diff --git a/unreleased/object-key-string.md b/unreleased/object-key-string.md new file mode 100644 index 00000000..b04b8f29 --- /dev/null +++ b/unreleased/object-key-string.md @@ -0,0 +1 @@ +- オブジェクトリテラルのキーに文字列リテラルを記述できるようになりました。 From 544610d7409ff311a22dcb9a43a82882eedcddda Mon Sep 17 00:00:00 2001 From: takejohn Date: Thu, 2 Jan 2025 22:33:02 +0900 Subject: [PATCH 3/3] =?UTF-8?q?issue=E3=83=AA=E3=83=B3=E3=82=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/index.ts b/test/index.ts index ca6d75ee..e66b855b 100644 --- a/test/index.ts +++ b/test/index.ts @@ -197,7 +197,9 @@ describe('Object', () => { ]))); }); - /* 未実装 - see also: test/literals.ts > literal > obj (string key) + /* 未実装 + * see also: test/literals.ts > literal > obj (string key) + * issue: https://github.com/aiscript-dev/aiscript/issues/62 test.concurrent('string key', async () => { const res = await exe(` let obj = {