Repository: syuilo/aiscript
Pull request #251 (2023-03-15 05:28:11)

fix v0.12.4にて数式などが名前空間の定義内では関数呼び出しに変換されない
<!-- ℹ お読みください
PRありがとうございます！ PRを作成する前に、以下をご確認ください:
- 可能であればタイトルに、以下で示すようなPRの種類が分かるキーワードをプリフィクスしてください。
  - fix / refactor / feat / enhance / perf / chore
  - また、PRの粒度が適切であることを確認してください。ひとつのPRに複数の種類の変更や関心を含めることは避けてください。
- このPRによって解決されるIssueがある場合は、そのIssueへの参照を本文内に含めてください。
- CHANGELOG.mdに変更点を追記してください。リファクタリングなど、利用者に影響を与えない変更についてはこの限りではありません。
- この変更により新たに作成、もしくは更新すべきドキュメントがないか確認してください。
- 機能追加やバグ修正をした場合は、可能であればテストケースを追加してください。
- テスト、Lintが通っていることを予め確認してください。
  - `npm run test`、`npm run lint`でぞれぞれ実施可能です
- `npm run api`を実行してAPIレポートを更新し、差分がある場合はコミットしてください。
ご協力ありがとうございます🤗
-->
<!-- ℹ README
Thank you for your PR! Before creating a PR, please check the following:
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
  - fix / refactor / feat / enhance / perf / chore
  - Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
- Please add the summary of the changes to CHANGELOG.md. However, this is not necessary for changes that do not affect the users, such as refactoring.
- Check if there are any documents that need to be created or updated due to this change.
- If you have added a feature or fixed a bug, please add a test case if possible.
- Please make sure that tests and Lint are passed in advance.
  - You can run it with `npm run test` and `npm run lint`.
- Run `npm run api` to update the API report and commit it if there are any diffs.
Thanks for your cooperation 🤗
-->

# What
名前空間の宣言内ではinfixが適切に処理されない ( #238 ) ので修正。
<!-- このPRで何をしたのか？ どう変わるのか？ -->
<!-- What did you do with this PR? How will it change things? -->

# Why
名前空間の宣言内では数式を入れてもエラーが起こるので、
これはちゃんとした動作じゃなさそうと思いissueを作成したところバグらしいのでPRを作成いたしました。
<!-- なぜそうするのか？ どういう意図なのか？ 何が困っているのか？ -->
<!-- Why do you do it? What are your intentions? What is the problem? -->

# Additional info (optional)
<!-- テスト観点など -->
<!-- Test perspective, etc -->



Patch:
diff --git a/src/parser/visit.ts b/src/parser/visit.ts
index 5716f3c..6a5aaea 100644
--- a/src/parser/visit.ts
+++ b/src/parser/visit.ts
@@ -136,6 +136,12 @@ export function visitNode(node: Cst.Node, fn: (node: Cst.Node) => Cst.Node): Cst
 			result.target = visitNode(result.target, fn) as Cst.Prop['target'];
 			break;
 		}
+		case 'ns': {
+			for (let i = 0; i < result.members.length; i++) {
+				result.members[i] = visitNode(result.members[i]!, fn) as (typeof result.members)[number];
+			}
+			break;
+		}
 	}
 
 	if (Cst.hasChainProp(result)) {


Test patch:
diff --git a/test/index.ts b/test/index.ts
index ad71812..0a37cbf 100644
--- a/test/index.ts
+++ b/test/index.ts
@@ -214,6 +214,20 @@ describe('Infix expression', () => {
 			1 + 1
 		`), NUM(3));
 	});
+
+	test.concurrent('infix-to-fncall on namespace', async () => {
+		eq(
+			await exe(`
+				:: Hoge {
+					@add(x, y) {
+						x + y
+					}
+				}
+				<: Hoge:add(1, 2)
+			`),
+			NUM(3)
+		);
+	});
 });
 
 describe('Comment', () => {