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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions