Skip to content

fix(ruby-generator): v1 でリスト要素読み出しが配列記法 $名前[N] を出力し v1 で再変換できない (list() 記法にする) #839

Description

@smalruby3-editor-bot

概要(Epic #738 / DoD で発覚)

Ruby v1 で、リスト要素の読み出しが 配列記法 $名前[N] で生成されるが、v1 のコンバータは
配列記法を拒否するため、Ruby タブ → コードタブのラウンドトリップが壊れる。

再現(v1 の koshien AI)

「AIを試す」用に作った v1 koshien AI で、リスト要素を読むと:

koshien.connect_game(name: "player1")
loop do
  koshien.get_map_area(koshien.player)
  koshien.calc_route(result: list("$最短経路"))
  koshien.move_to($最短経路[1])      # ← v1 なのに配列記法で生成される(バグ)
  koshien.turn_over
end

この状態で Ruby タブ → コードタブに切り替えると、次のエラーで変換できない:

配列の書き方はルビーバージョン2でのみ使えます。
設定メニューからルビーバージョン2に切り替えるか、
list()の書き方を使ってください。

→ v1 では list("$最短経路")[2](List 記法・1 始まり)が期待値。

根本原因

packages/scratch-gui/src/lib/ruby-generator/data-list.jsdata_itemoflist
バージョン分岐が無い:

const index = getListIndex(block);   // 1始まり→0始まり (N-1)
const list = getListName(block);     // "$最短経路"
return [`${list}[${index}]`, Generator.ORDER_FUNCTION_CALL];  // 常に配列記法

v1/v2 を問わず $名前[N](配列記法・0 始まり)を出力している。koshien.jskoshienListArg
は result 引数で既に v1=list("$名前") / v2=$名前 の分岐を持つが、リスト要素読み出し
(および他の添字操作)には同等の分岐が無い

あるべき挙動

  • v1: list("$名前")[scratchIndex](1 始まり)
  • v2: $名前[rubyIndex](0 始まり・現状維持)

やること

  • data_itemoflist をバージョン分岐させる(v1 = list("$名前")[1始まりindex]、v2 = 現状)。
  • 他の添字を取る/壊すリスト操作も監査して同様に修正(v1 で配列記法を出すものは全て):
    • data_replaceitemoflist$名前[i] = v
    • data_insertatlist$名前.insert(i, v)
    • data_deleteoflist$名前.delete_at(i)
    • data_addtolist$名前.push(v))/ data_lengthoflist.length)等、List ラッパーで
      表現すべきものが v1 で配列メソッド呼び出しになっていないか確認
  • v1 の round-trip(Ruby → blocks → Ruby)で list("$名前")[...] 記法が保たれること。

受け入れ条件

  • v1 でリスト要素読み出しが list("$名前")[1始まりindex] で生成される
  • v1 の koshien AI(上記)が Ruby タブ → コードタブに変換でき、エラーが出ない
  • v1 の他の添字リスト操作も v1 で再変換可能(配列記法を出さない)
  • v2 は現状($名前[0始まり])のまま変わらない
  • test/unit/lib/ruby-roundtrip/ 等にユニットテスト追加(v1/v2 双方)

ベースブランチ

関連

Epic #738 / #743(Ruby v2 対応)/ #827(AIを試す 出力)/ #763#764(ゲームサーバー)
DoD(実エディタ v1 で「AIを試す」)で発覚。

Metadata

Metadata

Assignees

No one assigned

    Labels

    🤖 autopilotautopilot(AI)が管理する PR/Issue(AI処理対象)

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions