Skip to content

feat(reference): compute_line_diff を LCS / Myers 化(Phase 4-B / Refs #191)#193

Merged
akiojin merged 2 commits into
developfrom
work/20260511-0223
May 11, 2026
Merged

feat(reference): compute_line_diff を LCS / Myers 化(Phase 4-B / Refs #191)#193
akiojin merged 2 commits into
developfrom
work/20260511-0223

Conversation

@akiojin
Copy link
Copy Markdown
Owner

@akiojin akiojin commented May 11, 2026

Summary

Changes

  • Cargo.toml: similar = "2"[dependencies] に追加 (v2.7.0)。
  • src/reference/diff.rs::compute_line_diff: similar::TextDiff::from_slicesiter_all_changes を歩く実装に置換。Insert / Delete の連続グループを 1 Hunk にまとめ、Equal が来たら境界とする。before_start / after_start は変更開始行(1-indexed)。
  • src/reference/diff.rs のテスト:
    • compute_line_diff_produces_single_hunk_for_changescompute_line_diff_replacement_isolates_changed_lines に rename して、新挙動(差分行のみ含む)に合わせて assertion を更新。
    • 新規 RED テスト 3 件: compute_line_diff_for_inserts_only_returns_addition_hunk / compute_line_diff_for_deletes_only_returns_removal_hunk / compute_line_diff_for_separate_changes_produces_multiple_hunks
  • tasks/lessons.md: 「2026-05-12 子 SPEC 増殖の防止」を追記。umbrella SPEC が存在する Phase では新 SPEC を増やさず、Refs で commit / PR を umbrella に紐付けるルールを言語化。

Testing

  • cargo fmt -- --check — clean
  • cargo clippy --all-targets -- -D warnings — clean
  • cargo test --bin unity-cli382 passed / 0 failed
  • cargo llvm-cov --all-targets --summary-only -- --test-threads=1 — TOTAL line coverage 90.94%
  • unity-cli skills lint --severity error — 15 skills / 0 violations

Closing Issues

Related Issues / Links

Checklist

  • Tests added/updated (4 件)
  • Lint/format passed (cargo clippy, cargo fmt, unity-cli skills lint)
  • Documentation updated (tasks/lessons.md への運用ルール追記)
  • Migration/backfill plan included — Not applicable: 外部 API は Hunk 構造を維持。出力の内容(含まれる行)が all-or-nothing から細粒度に変わるが、JSON スキーマは同じ。
  • CHANGELOG impact considered — minor bump per Conventional Commits (feat)

Context

Phase 3 では compute_line_diff を意図的に MVP として実装し、SPEC #188 の本文と PR #190 の Notes に「LCS / Myers 化は別 Issue として後追い可能」と明記していた。本 PR がその後追い実装で、reference diff の利用シナリオ(特に LLM が「特定 symbol の差分だけを context に入れる」用途)で発生していた before / after の全行重複を解消する。

Notes

  • similar クレートは Rust diff ライブラリのデファクト標準で、依存追加コストは限定的。
  • 本 PR は umbrella SPEC feat(reference): unity-csharp-reference Phase 4 - 内部実装の改善 (umbrella) #191 の Phase 4 改善 5 件のうち B (compute_line_diff の LCS 化) だけを land する。残りの A (member-level) / C (C# lexer) / D (zip fallback) / E (vector embedding) は umbrella の Tasks を継続管理。
  • tasks/lessons.md の運用ルール追記は本 PR で導入したが、別 PR として切り出す方が clean な場合は revert + 再投入も可能。

SPEC #188 (Phase 3) で MVP として all-or-nothing 単一 hunk を返してい
た compute_line_diff を similar クレートの TextDiff::from_slices ベ
ースに置き換える。変更箇所のみを含む細粒度な Hunk のリストを返すよ
うになり、reference diff の出力が局所化されて LLM context と人間レ
ビューの両方で扱いやすくなる。

主な変更:

- Cargo.toml に similar = "2" を追加
- src/reference/diff.rs::compute_line_diff: TextDiff::from_slices と
  iter_all_changes を歩く実装に置換。Insert / Delete の連続グループ
  を 1 Hunk にまとめ、Equal が来たら境界にする。before_start /
  after_start は変更開始行(1-indexed)
- 既存テスト compute_line_diff_produces_single_hunk_for_changes を
  compute_line_diff_replacement_isolates_changed_lines に rename し
  て新挙動 (差分行のみ含む) に合わせる
- 新規 RED テスト 3 件: inserts_only / deletes_only /
  separate_changes_produces_multiple_hunks
- tasks/lessons.md に「2026-05-12 子 SPEC 増殖の防止」を追記して
  umbrella SPEC 下では新 SPEC を生やさないルールを言語化

ローカル検証:

- cargo fmt -- --check: clean
- cargo clippy --all-targets -- -D warnings: clean
- cargo test --bin unity-cli: 382 passed / 0 failed
- cargo llvm-cov --all-targets: TOTAL line coverage 90.94%
- unity-cli skills lint --severity error: 15 skills / 0 violations

Refs #191

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 11, 2026

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: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: cb386ce5-d561-44be-b21e-d9b1a7ddf706

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
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch work/20260511-0223

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

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