From f1ecfd81fadfc188da7f2b9d18fe9f0ba7e8b48c Mon Sep 17 00:00:00 2001 From: uzmoi Date: Sat, 31 Aug 2024 11:05:33 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20define=E3=82=92=E5=90=8C?= =?UTF-8?q?=E6=9C=9F=E9=96=A2=E6=95=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/interpreter/index.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/interpreter/index.ts b/src/interpreter/index.ts index 3e4124d2..dce6daf7 100644 --- a/src/interpreter/index.ts +++ b/src/interpreter/index.ts @@ -724,7 +724,7 @@ export class Interpreter { } @autobind - private async define(scope: Scope, dest: Ast.Expression, value: Value, isMutable: boolean): Promise { + private define(scope: Scope, dest: Ast.Expression, value: Value, isMutable: boolean): void { switch (dest.type) { case 'identifier': { scope.add(dest.name, { isMutable, value }); @@ -732,16 +732,16 @@ export class Interpreter { } case 'arr': { assertArray(value); - await Promise.all(dest.value.map( - (item, index) => this.define(scope, item, value.value[index] ?? NULL, isMutable), - )); + for (const [index, item] of dest.value.entries()) { + this.define(scope, item, value.value[index] ?? NULL, isMutable); + } break; } case 'obj': { assertObject(value); - await Promise.all([...dest.value].map( - ([key, item]) => this.define(scope, item, value.value.get(key) ?? NULL, isMutable), - )); + for (const [key, item] of dest.value) { + this.define(scope, item, value.value.get(key) ?? NULL, isMutable); + } break; } default: { From 69386d98f664d70ea974ab667a7effff28d04cdc Mon Sep 17 00:00:00 2001 From: uzmoi Date: Sat, 31 Aug 2024 11:09:32 +0900 Subject: [PATCH 2/5] update comments --- src/parser/syntaxes/statements.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parser/syntaxes/statements.ts b/src/parser/syntaxes/statements.ts index 3ccf24d9..0a844871 100644 --- a/src/parser/syntaxes/statements.ts +++ b/src/parser/syntaxes/statements.ts @@ -100,7 +100,7 @@ export function parseBlockOrStatement(s: ITokenStream): Ast.Statement | Ast.Expr /** * ```abnf - * VarDef = ("let" / "var") IDENT [":" Type] "=" Expr + * VarDef = ("let" / "var") (IDENT / Expr) [":" Type] "=" Expr * ``` */ function parseVarDef(s: ITokenStream): Ast.Definition { @@ -123,7 +123,7 @@ function parseVarDef(s: ITokenStream): Ast.Definition { s.next(); let dest: Ast.Expression; - // 全部parseExprに任せるとparseReferenceが型注釈を巻き込んでしまうためIdentifierのみ個別に処理。 + // 全部parseExprに任せるとparseReferenceが型注釈を巻き込んでパースしてしまうためIdentifierのみ個別に処理。 if (s.is(TokenKind.Identifier)) { const nameStartPos = s.getPos(); const name = s.getTokenValue(); From 787fc6f41ff5f2cc8e3cc450ba1937dbf7207f88 Mon Sep 17 00:00:00 2001 From: uzmoi Date: Sat, 31 Aug 2024 21:36:58 +0900 Subject: [PATCH 3/5] fix validate keyword --- src/parser/plugins/validate-keyword.ts | 30 ++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/parser/plugins/validate-keyword.ts b/src/parser/plugins/validate-keyword.ts index d42db44d..6bd4bbb4 100644 --- a/src/parser/plugins/validate-keyword.ts +++ b/src/parser/plugins/validate-keyword.ts @@ -56,15 +56,33 @@ function throwReservedWordError(name: string, loc: Ast.Loc): void { throw new AiScriptSyntaxError(`Reserved word "${name}" cannot be used as variable name.`, loc.start); } +function validateDest(node: Ast.Node): Ast.Node { + return visitNode(node, node => { + switch (node.type) { + case 'null': { + throwReservedWordError(node.type, node.loc); + break; + } + case 'bool': { + throwReservedWordError(`${node.value}`, node.loc); + break; + } + case 'identifier': { + if (reservedWord.includes(node.name)) { + throwReservedWordError(node.name, node.loc); + } + break; + } + } + + return node; + }); +} + function validateNode(node: Ast.Node): Ast.Node { switch (node.type) { case 'def': { - visitNode(node, node => { - if (node.type === 'identifier' && reservedWord.includes(node.name)) { - throwReservedWordError(node.name, node.loc); - } - return node; - }); + validateDest(node.dest); break; } case 'ns': From 53a133bea1b9f215c651cede85b9d8b30e009daf Mon Sep 17 00:00:00 2001 From: uzmoi Date: Sat, 31 Aug 2024 22:21:28 +0900 Subject: [PATCH 4/5] =?UTF-8?q?Revert=20"refactor:=20define=E3=82=92?= =?UTF-8?q?=E5=90=8C=E6=9C=9F=E9=96=A2=E6=95=B0=E5=8C=96"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit f1ecfd81fadfc188da7f2b9d18fe9f0ba7e8b48c. --- src/interpreter/index.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/interpreter/index.ts b/src/interpreter/index.ts index dce6daf7..3e4124d2 100644 --- a/src/interpreter/index.ts +++ b/src/interpreter/index.ts @@ -724,7 +724,7 @@ export class Interpreter { } @autobind - private define(scope: Scope, dest: Ast.Expression, value: Value, isMutable: boolean): void { + private async define(scope: Scope, dest: Ast.Expression, value: Value, isMutable: boolean): Promise { switch (dest.type) { case 'identifier': { scope.add(dest.name, { isMutable, value }); @@ -732,16 +732,16 @@ export class Interpreter { } case 'arr': { assertArray(value); - for (const [index, item] of dest.value.entries()) { - this.define(scope, item, value.value[index] ?? NULL, isMutable); - } + await Promise.all(dest.value.map( + (item, index) => this.define(scope, item, value.value[index] ?? NULL, isMutable), + )); break; } case 'obj': { assertObject(value); - for (const [key, item] of dest.value) { - this.define(scope, item, value.value.get(key) ?? NULL, isMutable); - } + await Promise.all([...dest.value].map( + ([key, item]) => this.define(scope, item, value.value.get(key) ?? NULL, isMutable), + )); break; } default: { From 561c8ae1904df748bd05f58eb4af6b7f9fdf1ddf Mon Sep 17 00:00:00 2001 From: uzmoi Date: Sat, 31 Aug 2024 22:26:13 +0900 Subject: [PATCH 5/5] add await for define --- src/interpreter/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/interpreter/index.ts b/src/interpreter/index.ts index 3e4124d2..80cfbd7d 100644 --- a/src/interpreter/index.ts +++ b/src/interpreter/index.ts @@ -205,7 +205,7 @@ export class Interpreter { } const value = await this._eval(node.expr, nsScope); - this.define(nsScope, node.dest, value, node.mut); + await this.define(nsScope, node.dest, value, node.mut); break; } @@ -396,7 +396,7 @@ export class Interpreter { } value.attr = attrs; } - this.define(scope, node.dest, value, node.mut); + await this.define(scope, node.dest, value, node.mut); return NULL; }