Skip to content

fix(dead-code): JSX prop function references (onClick={fn}) not counted as usage → React handlers false-flagged dead #294

Description

@Wolfvin

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

Fungsi yang dilewatkan sebagai nilai atribut JSX (onClick={handleClick}, onSubmit={handleSubmit}) dapat ref_count=0 / status=dead, padahal jelas dipakai sebagai event handler. Ini pola PALING umum di React — dan React/frontend adalah use-case utama CodeLens (scope: react/css/html).

Repro (scan, cek backend.json). File src/App.tsx:

function handleClick() { return 1; }
function handleSubmit() { return 2; }
function directlyCalled() { return 3; }
export function App() {
  directlyCalled();
  return <div onClick={handleClick}><form onSubmit={handleSubmit} /></div>;
}

Hasil aktual:

  • handleClick (di onClick={handleClick}): rc=0 DEAD (SALAH — dipakai)
  • handleSubmit (di onSubmit={handleSubmit}): rc=0 DEAD (SALAH)
  • directlyCalled (dipanggil directlyCalled()): rc=1 active ✓

Konteks

ref_count dihitung dari CALLS edge. Handler dilewatkan sebagai prop JSX = REFERENSI, bukan CALL — jadi nol edge → rc=0 → false-dead. Same-file-usage (#220) hanya cover 7 bahasa non-TS, jadi tak menyelamatkan TSX. Dampak: audit --check dead-code di HAMPIR SEMUA komponen React false-positive massal (setiap event handler kelihatan dead); search --mode symbol rc salah; impact blast-radius handler salah.

Tujuan

Referensi fungsi di dalam JSX expression container ({identifier} sebagai nilai atribut, DAN {handler} di posisi lain seperti {items.map(renderItem)}) dihitung sebagai usage sehingga handler tidak false-flagged dead dan rc mencerminkan pemakaian nyata. Cek parser TSX (ts_backend_parser.py/fallback_js_backend.py) atau dead-code layer untuk lokasi yang tepat.

Constraint

Definition of Done

  • handleClick/handleSubmit (via JSX prop) → rc>=1, NOT dead
  • directlyCalled tetap rc>=1 (tak regres)
  • Fungsi TSX genuinely-unused tetap terdeteksi dead (control)
  • Golden test TSX JSX-handler-reference

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions