コンテンツにスキップ

rigor-rbs-inline

Rubyソース内のrbs-inline形式のコメント(# @rbs name: T#: () -> T# @rbs return: T、属性の#:キャスト、# @rbs!生RBS、…)を取り込み、合成されたRBSを解析環境に供給します ── これにより、本来Rigorが無視するはずの# @rbsアノテーションが、手書きの.rbsファイルと同じargument-type-mismatchのdiagnosticを発火する強制された契約(contract)になります。設計はADR-32に記録されています。

これはrigortypeにバンドルされて配布されます。plugins:の下で有効化します。

plugins:
- rigor-rbs-inline

完全なガイド。実践的な解説 ── サポートされるすべてのアノテーション形式、マジックコメントによるオプトイン、トップレベルdefに関する注意、パース失敗の扱い ── はハンドブック第7章 — RBSとExtendedの§「Inline RBS in Ruby source」にあります。このページは運用上のクイックリファレンスです。

ファイルごとに、upstreamのマジックコメントでオプトインします。

# rbs_inline: enabled
class AscDesc
# @rbs asc_or_desc: :asc | :desc
def ascdesc(asc_or_desc) = asc_or_desc
end
AscDesc.new.ascdesc(:bad) # エラー: 引数の型の不一致 — :asc | :desc を期待したが :bad だった

# rbs_inline: enabledを持たないファイルは手を付けられません(ファイル先頭のスキャンのみ)。合成されたRBSはファイルごとにキャッシュされ(コンテンツSHA+プラグインのid/version+設定をキーとする)、変更がない場合は2回目の実行でパースをスキップします。

ルール重大度発火条件
plugin.rbs-inline.source-rbs-synthesis-failedinforbs-inlineがファイルをパースできなかった。解析はインラインRBSの寄与なしにフォールバックし、diagnosticはupstreamのエラーを伴う
plugins:
- gem: rigor-rbs-inline
config:
require_magic_comment: true # デフォルト
  • require_magic_comment(デフォルトtrue)── trueのとき、# rbs_inline: enabledを持つファイルのみが処理されます。falseに設定すると、すべてのファイルがマジックコメントを持っているかのように扱われます ── これは解析スコープ全体を自分が所有している場合(単一ファイルのCI実行や、ホスト型のブラウザプレイグラウンド。後者はこれを設定し、貼り付けたスニペットがマジック行なしで解析されるようにしている)にのみ有用です。
  • トップレベルのdefはRBSを生成しません。 upstreamのrbs-inlineは、裸のトップレベルdefに対して何も出力しません(rbs-inline 0.14.0で検証済み)── メソッドをclass / moduleで包んでください。これはRigorの制限ではなく、upstreamから継承した挙動です。
  • パース失敗はソフトフェイルします。 rbs-inlineがパースできないファイルは、インラインRBSがなかったものとして解析されます(上記の:infoのdiagnosticがそれを記録します)。エスカレートさせるにはseverity_profile:で重大度を打ち直してください。
  • ランタイム依存。このプラグインはrbs-inline gemを取り込みます。コアのrigortypeはランタイム依存ゼロのままであり、オプトインしたプロジェクトだけがそのコストを負担します。

シンセサイザー、source_rbs_synthesizer:マニフェストフック、キャッシュの配線については、プラグインのREADMEにあります。プラグインの書き方についてはexamples/rigor-plugin-authorスキルを参照してください。

© 2026 TypedDuck. Licensed under CC BY-SA 4.0.