Skip to content

fix(parser): Go/Java/PHP call graph absent/broken → every function false-flagged dead #293

Description

@Wolfvin

Mengapa (falsifiable — repro dijalankan 2026-07-13)

CodeLens klaim 13-bahasa, tapi call-graph (dasar rc/dead-code/trace/impact) TIDAK berfungsi untuk Go, Java, PHP. Fungsi yang jelas dipanggil dapat ref_count=0/status=dead.

Repro (scan tiap fixture, cek backend.json). Tiap file: helper() dipanggil dari caller() DAN top-level:

Bahasa nodes edges helper rc/status
Go 3 0 rc=0 dead (SALAH)
Java 3 0 rc=0 dead (SALAH)
PHP 2 1 rc=0 dead (SALAH — edge tak resolve ke helper)
Ruby 2 3 rc=1 active ✓ (bekerja)

Mekanisme (dari inspeksi parser)

  • scripts/parsers/fallback_java.py (73 baris) — TIDAK ada kode ekstraksi call (call-refs=0) → nol edge by omission.
  • scripts/parsers/fallback_go.py (208 baris) — ADA kode call (call-refs=20) tapi hasil 0 resolving edge (bug/ineffective).
  • scripts/parsers/fallback_php.py (688 baris) — ADA kode, tapi edge tak resolve ke node callee (helper rc tetap 0).
  • scripts/parsers/fallback_ruby.py — bekerja (referensi implementasi yang benar).

Konteks

Untuk project Go/Java/PHP: audit --check dead-code false-positive MASAL (SETIAP fungsi kelihatan dead), search --mode symbol rc salah, context --check trace kosong, impact blast-radius salah. #220 nambah same-file-usage untuk bahasa ini — indikasi call-edge memang lemah — tapi cross-function call tetap wajib untuk analisis benar. Ini contoh konkret kritik breadth-over-depth (lihat RFC #279): N bahasa diklaim, call-graph jalan untuk sedikit.

Tujuan

Go/Java/PHP call extraction hasilkan edge yang resolve ke node callee (rc benar, dead-code akurat), pakai fallback_ruby.py sebagai referensi pola yang bekerja. ATAU (kalau selaras keputusan RFC #279) turunkan klaim dukungan + tandai bahasa ini "symbol-only, no call-graph" secara eksplisit di output + docs supaya user tak tertipu hasil dead-code palsu.

Constraint

Definition of Done

  • Untuk tiap bahasa yang diputuskan di-support: fungsi cross-called rc>=1 not dead + golden test
  • Atau: output/docs eksplisit tandai bahasa symbol-only (tak ada call-graph) sehingga dead-code tak menyesatkan
  • Ruby (yang bekerja) tetap tak regres

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: bug-fixRegression or broken behavior

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions