Results 23 issues of Take-John

## 目的 オブジェクトリテラルのプロパティ名に予約語も書けるようにしたい ## 現状 Misskeyの拡張APIにおいて、`Ui:C:textInput`関数などの引数のプロパティに`default`があるが、 AiScriptがバージョン1.0.0になると`default`が予約語となるため、既存のコードが動かなくなってしまう懸念がある。 例えば、Misskey Playだとこういうコードが動くが、 1.0.0になると`Syntax: unexpected token: DefaultKeyword`のエラーになる。 ```js /// @ 0.19.0 Ui:render([ Ui:C:textInput({ default: 'text', }) ]) ``` ## 解決策 オブジェクトリテラルのキー名に予約語を使えるようになる。 JSON5の識別子(=ECMAScriptにおけるIdentifierName)では、一部の非ASCII文字・$・Unicodeエスケープシーケンス・予約語も使えるため、それに準拠してみる。 JSON5Identifier: https://spec.json5.org/#prod-JSON5Identifier

冗長な条件分岐や`as`, `!`のアサーションが多すぎる

`utils.valToJs`関数にerror型を渡すと`Unrecognized value type: error`のエラーが出る。 `Json:stringify`関数の処理は`utils.valToJs`を呼び出すのでerror型を含む値を渡すとプログラムが終了してしまう。 ```js Json:stringify(Error:create('message')) // Unrecognized value type: error ``` ドキュメンテーションサイトのプレイグラウンドでもerror型の値を出力しようとするとエラーになる: https://aiscript-dev.github.io/ja/playground.html#N4Igxg9gJgpiBcIA88AEBRATpin5kxgEMAXGACgHIBbGAZzqIHMZKBKEAXyA (このリポジトリのプレイグラウンドでは`utils.valToString`関数を使用しているのでエラーにはならない)

関数の仮引数を同じ名前で複数定義しても文法エラーにならず、実行してもエラーが発生しない ```js @f(a, a) { a } 1 ```

bug

# What `visitNode`によってASTの`Break['expr']`, `NamedTypeSource['inner']`, `FnTypeSource['result']`の内容が走査されるようになります。 これらの場所における不正な変数名、return文、break文、continue文、型注釈がある場合に文法エラーが発生するようになります。 # Why Fixes #999 Fixes #1000 # Additional info (optional) テストにおいて`expect.hasAssertion()`が上手く機能しなかったので、`test/testutils.ts`の`eq`関数の実装を変えて、`assert`でなくVitestの`expect`を使用するように変更しています。

https://github.com/aiscript-dev/aiscript/pull/1003#issuecomment-3616380821

``` { a: print(1) a: print(2) } ``` 上記のコードにおいて、`2`のみが出力されます。

bug

``` @f(x: T) {} ``` `T`が`str`だとすると、`str`という不正な型を意味してしまうため、 これはエラーになってほしい。 プレイグラウンド: https://aiscript-dev.github.io/ja/playground.html#N4Igxg9gJgpiBcIACAzAPAFQHwAoAe8ABBmgHYCuAtlgJSHAC+IANCAG4wBOAzgJYSkEIAIwA6AEyiADCAZA

bug

# What 関数の型注釈の名前が重複した場合に発生するエラーを`Error`から`AiScriptSyntaxError`に変更します。 また、関数の引数や返り値の型注釈がない場合であっても型引数の名前が重複した際のエラーが発生するようにします。 # Why Fixes #997 Fixes #998 # Additional info (optional)

以下のような、配列のスライス記法を提案します。 ``` let a = [0, 1, 2, 3]