Skip to content

docs: define pure method call contract and interprocedural scope (#10) - #23

Closed
mao2009 wants to merge 1 commit into
feature/issue-9-rt-semanticsfrom
feature/issue-10-interprocedural
Closed

docs: define pure method call contract and interprocedural scope (#10)#23
mao2009 wants to merge 1 commit into
feature/issue-9-rt-semanticsfrom
feature/issue-10-interprocedural

Conversation

@mao2009

@mao2009 mao2009 commented Sep 3, 2026

Copy link
Copy Markdown
Owner

Issue #10: Define pure method contract and interprocedural analysis

Refs #10

[PureMethod] の契約を呼び出し先まで含めて一貫して扱えるようにします。テスト数 128 → 145

⚠️ Base branch: feature/issue-9-rt-semantics(merge order: #20#21#22 → this)。

呼び出し契約

[PureMethod]シンボルに宣言された契約であり、実装から推論される性質ではない。

pure method から呼べるのは (1) 静的に解決されたシンボルが [PureMethod] を持つメソッド、(2) 既知純粋型のメソッド — のみ。それ以外は RT0002。呼び出し先の本体は開かず、未マークのメソッドは常に非純粋として扱う fail-closed 規則です。

解決規則(すべて実測で確認)

契約は「静的に解決されたシンボル」に対して判定されるため、直感に反する帰結があります。

呼び出し [PureMethod] の必要箇所
interface メソッド interface 宣言側。実装クラス側に付けても interface 経由の呼び出しは満たさない
base 経由の virtual base 宣言側。override 側のみでは効かない
overload 選択されたそのオーバーロード
extension method extension method 自身
相互再帰 全参加者

⚠️ virtual dispatch は健全ではありません

base の virtual に [PureMethod] を付けると base 型経由の呼び出しがすべて許可されますが、override が純粋である保証はなく、PureSharp は検証しません。virtual / interface メンバへの付与は、全 override で契約を守る責任を著者が負う表明です。

Interprocedural scope

対象: 呼び出し 1 段階のみ。 対象外は呼び出し先本体の読解 / 未マークメソッド経由の推移的伝播 / override の契約遵守検証 / whole-program 解析 / delegate 実体の純粋性。

cross-method traversal を行わないことが線形コストの根拠です。

呼び出し契約の対象外(false negative)

構文 状態
ユーザー定義 property getter 未検査 — property 参照は I/O 型判定しか行わない
コンストラクタ new T() 未検査 — invocation として解析されない

External dependency の決定

外部アセンブリも同じ fail-closed 規則で扱い、特別扱いしません。 既知純粋型リストに含まれれば許可、それ以外は RT0002

却下した代替案と理由も記載: 外部 IL からの純粋性推論(analyzer 内で決定不能・環境依存で再現性なし)/ 既定で信頼(fail-open)/ 他ライブラリの [Pure] 属性採用(意味論が弱く一貫性がない)。

既知純粋型リストは allowlist なので取りこぼしは過剰報告になりますが、リストへの追加は検出範囲の縮小=非破壊的変更であり minor で修正可能です。

Performance(実測)

Methods Analyzer time Per method
100 186 ms 1.86 ms
500 349 ms 0.70 ms
2,000 844 ms 0.42 ms

線形で、超線形な挙動はありません。call graph を構築せず呼び出し先本体を訪問しないためで、1 段階契約の実利的な利点です。baseline compile 比 0.8–1.1×。

CallContractTests に再現可能な guard を含めましたが、閾値は環境差でフレークにならないよう十分緩く(2,000 メソッドで 60 秒)、絶対値は閾値ではなく傾向として記録しています。

⚠️ 挙動は変更していません

Open decisions として 5 件記載: override の契約検証 / 属性の継承 / property getter / コンストラクタ / ローカル関数の契約継承。

Verification

  • Build: PASS (0 error) / Tests: 145/145 PASS(baseline 56 から +89)/ git diff --check: PASS

Issue #10 完了条件

  • 呼び出し契約が仕様化されている
  • interprocedural analysis の対象範囲が明示されている
  • interface/virtual/overload 等のテストがある
  • external dependency をどう扱うか決定している
  • performance への影響を測定している

Merge boundary

技術検証を通過しても MERGE CANDIDATE にとどまります。merge には Merge Skill による検証と、この PR / HEAD に対する新しい明示的 human approval が必要です。

🤖 Generated with Claude Code

Issue #10 に対応し、[PureMethod] の契約を呼び出し先まで含めて一貫して
扱えるようにする。テスト数 128 -> 145。

追加: docs/CALL-CONTRACT.md

呼び出し契約を仕様化した。
[PureMethod] は「シンボルに宣言された契約」であり、実装から推論される
性質ではない。pure method から呼べるのは
(1) 静的に解決されたシンボルが [PureMethod] を持つメソッド
(2) 既知純粋型のメソッド
のみで、それ以外は RT0002 とする。呼び出し先の本体は開かない。
未マークのメソッドは常に非純粋として扱う fail-closed 規則である。

解決規則を表で確定した。契約は「静的に解決されたシンボル」に対して
判定されるため、以下が帰結する (すべて実測で確認):
- interface 呼び出しは interface メンバに解決されるため、
  実装クラス側の [PureMethod] では契約を満たさない
- base 型経由の virtual 呼び出しは base のシンボルに解決されるため、
  override 側のみの [PureMethod] は効かない
- overload は選択されたオーバーロード単位で判定される
- 相互再帰は全参加者が [PureMethod] を持つ必要がある

virtual dispatch が健全でないことを明記した。base の virtual に
[PureMethod] を付けると base 型経由の呼び出しがすべて許可されるが、
override が純粋である保証はなく、PureSharp は検証しない。
virtual / interface メンバへの [PureMethod] 付与は、全 override で
契約を守る責任を著者が負う表明である。

interprocedural analysis の対象範囲を明示した。
v1.0 の対象は「呼び出し 1 段階のみ」。呼び出し先本体の読解、
未マークメソッドを介した推移的伝播、override の契約遵守検証、
whole-program 解析、delegate 実体の純粋性は対象外とした。
cross-method traversal を行わないことが線形コストの根拠である。

呼び出し契約の対象外を 2 件明記した (いずれも false negative)。
ユーザー定義 property getter は property 参照が I/O 型判定しか
行わないため対象外。コンストラクタは invocation として解析されない
ため対象外。

external dependency の扱いを決定した。
外部アセンブリも同じ fail-closed 規則で扱い特別扱いしない。
既知純粋型リストに含まれれば許可、それ以外は RT0002。
却下した代替案とその理由も記載した (外部 IL からの純粋性推論は
analyzer 内で決定不能かつ環境依存で再現性がない、既定で信頼するのは
fail-open、他ライブラリの [Pure] 属性は意味論が弱く一貫性がない)。
既知純粋型リストは allowlist であり、取りこぼしは過剰報告になるが、
リストへの追加は検出範囲の縮小であり非破壊的変更として minor で
修正可能である。

performance を実測した。
methods=100 / 500 / 2000 に対し analyzer 時間は 186 / 349 / 844 ms、
1 メソッドあたり 1.86 / 0.70 / 0.42 ms。コストは解析対象 operation 数に
対して線形で、超線形な挙動はない。call graph を構築せず呼び出し先本体を
訪問しないことがその理由であり、1 段階契約の実利的な利点である。
同一ソースの baseline compile に対して概ね 0.8-1.1 倍。
測定方法も再現可能な形で記載した。

追加: CallContractTests.cs (17 tests)
上記の解決規則・external dependency・対象外ケースを実測で固定した。
performance guard も含む。厳密な閾値は環境差でフレークになるため
破滅的退行のみを検出する緩い上限 (2000 メソッドで 60 秒) とし、
絶対値は閾値ではなく傾向として文書に記録した。

本 PR は Analyzer の挙動を変更していない。
検出範囲の拡大を伴う項目は Open decisions として 5 件記載した
(override の契約検証、属性の継承、property getter、コンストラクタ、
ローカル関数の契約継承)。

更新: docs/DIAGNOSTICS.md, docs/PURITY-SEMANTICS.md
CALL-CONTRACT.md への相互参照を追加。

検証結果:
- dotnet build: PASS (0 error)
- dotnet test --no-build: PASS (145/145、baseline 56 から +89)
- git diff --check: PASS

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XB2mDSE67ZDQS9mk5KfAdZ
@coderabbitai

coderabbitai Bot commented Sep 3, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: 2b0fe1a8-0618-4eb4-8f33-ccae7fb63a92

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

@mao2009
mao2009 deleted the branch feature/issue-9-rt-semantics September 8, 2026 01:18
@mao2009 mao2009 closed this Sep 8, 2026
@mao2009
mao2009 deleted the feature/issue-10-interprocedural branch September 8, 2026 01:18
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