Skip to content

メソッド属性行で名前別の since/until を指定できるようにする#273

Merged
znz merged 2 commits into
rurema:masterfrom
znz:method-since-attributes
Jul 21, 2026
Merged

メソッド属性行で名前別の since/until を指定できるようにする#273
znz merged 2 commits into
rurema:masterfrom
znz:method-since-attributes

Conversation

@znz

@znz znz commented Jul 21, 2026

Copy link
Copy Markdown
Member

概要

#132P4: {: since="X"} / {: until="X"} メソッド属性の実装です(予約 → 解禁。2コミット)。ベースはマージ済みの P3 なので diff は P4 分のみです。

  • RD/MD 両パーサー共有の Context#method_attributes を拡張し、{: since="3.2"} / {: until="4.0"} を受理。値は数字とドットのみ(typo 検出。"1.6" のようなラダー外の値は floor 救済のため意図的に許可)
  • kv 属性はシグネチャ単位で束縛(kramdown IAL のまま)。nomethod/undef と違い全シグネチャ一致を要求せず、別名ごとに異なる追加/削除時期を書けるのが本来の用途。同一シグネチャ上のキー重複・非引用値・空値・未知キーはビルドエラー
  • 記録は fill_since/fill_until 経由なので、methodsince(P2)の算出値より明示値が常に優先されます(算出側は既存値を上書きしない)
  • MARKUP_SPEC §4 の「予約」記述を実仕様(構文・シグネチャ単位の意味・優先順位・別名の例)に差し替え
  • 案a(#@since のパース時取得)は実装しません: 完全なバージョンラダー(db-1.8.7〜4.1)がある今、#@since X は「X 未満の DB にエントリ/名前が存在しない」という形でそのまま反映され、算出が同じ since に到達します。パース時に必要なのは算出が届かない場合の明示上書き手段(本 PR)だけです
  • 2コミット目(査読での発見修正): 特殊変数の名前規約の食い違いを正規化。シグネチャ由来の名前は $SAFE のように $ 付きですが、エントリの names(= マップのキー)は $ を剥がした形(SAFE$$ なら $)で格納されるため、属性の紐付け先とバッジ描画の参照の両方で先頭の $ を1つ剥がします。これにより P3 の潜在バグ(特殊変数の算出バッジが版差別名の経路とサーバーのメソッド表で黙って消える)も同時に修正。紐付け先名が names に無い場合は黙って捨てずに ParseError にする安全網付き

検証

  • テスト 17739 → 17751 / 0 failures(属性パース 9・mdparser 2・算出との優先順位 1・特殊変数の判別 2 ほか)。正規化・判定を外すと対応テストだけが失敗することをミューテーションで確認済み
  • rbs validatesteep check エラーなし
  • E2E: RD 原稿の {: since="2.5"} → DB 構築 → method_screen 描画でバッジ表示。特殊変数 $0 / $PROGRAM_NAME の別名エントリでは $PROGRAM_NAME の dt にだけバッジが付き、names/since_map のキーが一致することを確認

refs #132

🤖 Generated with Claude Code

znz and others added 2 commits July 21, 2026 20:55
bitclust#132 P4。RD/MD 両パーサーが共有する Context#method_attributes
を拡張し、予約語だった {: since="X"} / {: until="X"} を受理するように
した。X は数字とドットのみ(typo 検出用。1.6 のようなラダー外の値も
フロア救済のため意図的に許可)。

- kv 属性はシグネチャ単位で束縛され(kramdown IAL のまま)、nomethod/undef
  と違って全シグネチャ一致を要求しない。別名ごとに異なる追加/削除時期を
  持てるのが本来の用途。同じシグネチャ上でキーが重複したらエラー
- 対象の名前はシグネチャ行(rd の `--- ...` / md の `### def ...` 等)を
  MethodSignature.parse で読み直して求める。md 側は mdcompiler/mdparser
  と同じ接頭辞正規化を再利用する
- method_attributes の返り値を Array[String] から
  Context::MethodAttributes(flags, since_until)に拡張。define_method は
  chunk.names を確定させた後に fill_since/fill_until を呼ぶ(未設定時のみ
  書き込むため、methodsince サブコマンド(P2)の算出値をパース時の明示値が
  常に上書きする側になる)
- MARKUP_SPEC.md §4 の「予約」記述を実際の構文・意味・優先順位の説明に
  差し替え

案a(#@SInCE 分岐のパース時取得)は実装しない: バージョンラダー(P2)が
既に全版横断で存在を算出しており、#@SInCE で追加されたメソッドは対象
バージョンの DB に「存在する」という形でそのまま反映されるため、算出は
同じ since に到達する。パース時に必要なのは算出が届かない場合の明示的な
上書き手段(このコミット)だけで足りる。

rbs validate / steep check ともエラー0。既存の巡回で見つかる
lib/bitclust/whole_file_gate.rb の背景 ERROR ログはこの変更前から出ている
無関係な既知ノイズ(最終結果は変更前後とも "No type error detected")。

refs rurema#132

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bitclust#132 P4 の査読で発見した名前規約の食い違いを補正する。特殊変数の
シグネチャ行から MethodSignature.parse で取り出した名前は "$SAFE" のように
$ 付きだが、エントリの names(= since_by_name/until_by_name のキー)は
先頭の $ を除いた形("SAFE"。"$$" なら "$")で格納されている
(rrdparser の method_signature が Signature.new(nil, '$', name[1..-1]) と
する規約)。

- 属性の紐付け先名(method_attribute_target_name)とバッジ描画の
  マップ参照(VersionBadges)の両方で先頭の $ を1つ剥がす。正規化が
  無いと、特殊変数への {: since} は参照されないキーで格納され、算出
  バッジも mixed 経路とサーバーのメソッド表で黙って消えていた
- 安全網として、since/until の紐付け先名が chunk.names に無い場合は
  黙って捨てずに ParseError にする(名前導出の規約ずれを CI で検出)。
  紐付け先シグネチャ名が導出できない場合の raise も ParseError に変更
- 判別テスト2本(パーサ側=$0/$PROGRAM_NAME 別名の since 格納先、
  描画側=mixed 経路で該当 dt にバッジが付くこと)。どちらも正規化を
  外すと失敗することをミューテーションで確認済み

refs rurema#132

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@znz
znz merged commit e936dba into rurema:master Jul 21, 2026
10 checks passed
@znz
znz deleted the method-since-attributes branch July 21, 2026 13:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant