Files
codeql/java/kotlin-extractor
Anders Fugmann 2e814a7b22 Kotlin: anchor synthetic exhaustive-when throw to the when
An exhaustive `when` expression (one with no explicit `else` that the
compiler proves total) gets a synthetic `throw NoWhenBranchMatchedException(...)`
as its fallback branch. The two frontends locate that synthetic call
differently:

  * K2 gives the call the source offsets of the enclosing `when`
    expression, so the throw (and the `new NoWhenBranchMatchedException`)
    are located at the `when` block, e.g. `6:3:9:3`.
  * K1 leaves the synthetic call with undefined offsets, so the extractor
    emits a `0:0:0:0` (no-source) location for both nodes.

A real source location is strictly more useful than none, and anchoring
the implicit fallback to the `when` it belongs to is the intuitive
choice, so we adopt the K2 behaviour for both frontends.

`extractCall` now records the enclosing `when`'s location while
extracting its branches (`currentSyntheticWhenLocation`) and uses it as
the fallback for the `noWhenBranchMatchedException` builtin whenever the
synthetic call itself has undefined offsets. This only changes K1: under
K2 the call already carries valid offsets, so `tw.getLocation(c)` is used
unchanged and K2 output is byte-identical.

Relearned both suites: all 3333 tests pass and the only changed row is
test-kotlin1/library-tests/no-when-branch-found, which now matches
test-kotlin2 exactly (`0:0:0:0` -> `6:3:9:3`).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-07-12 11:26:32 +02:00
..
2022-05-10 18:45:56 +01:00
2025-05-13 14:42:05 +01:00
2022-05-10 18:45:51 +01:00