[C14b] Kotlin: name/locate destructuring container <destruct> in both frontends

A destructuring declaration `val (a, b) = subject` introduces a temporary that
holds the subject; each component is then read from it via `componentN()`. The
two frontends represent that temporary differently:

- K1 names it `tmp<N>_container` and locates it at the subject expression only
  (e.g. `7:26:7:26`, pointing at `p`).
- K2 names it `<destruct>` and locates it across the whole destructuring
  declaration (e.g. `7:9:7:26`, `val (first, _) = p`).

Decision: adopt the K2 representation from both frontends. The `<destruct>` name
is uniform and frontend-independent (K1's `tmp<N>` counter cannot be reproduced
under K2, consistent with C14a), and the full-declaration span is more
informative than a bare pointer at the subject.

Implementation: `isDestructuringContainerVariable` recognises the temporary by
its frontend name (`<destruct>` under K2, `tmp<N>_container` under K1).
`extractVariableExpr` then emits the name `<destruct>` and, under K1 only, a
PSI-based location spanning the enclosing `KtDestructuringDeclaration`
(`getPsiBasedDestructuringContainerLocation`); under K2 the IR offsets are
already correct so the helper returns null and the existing location is kept.

Full dual-suite relearn: all 3333 tests pass. The only changed row is in
query-tests/UnderscoreIdentifier, where the K1 container converges from
`7:26:7:26 | tmp0_container` to `7:9:7:26 | <destruct>`, matching K2. With this
and C15, query-tests/UnderscoreIdentifier is now byte-identical across both
suites. The for-loop destructuring shape (`for ((v, i) in ...)`, where K1 omits
the container entirely) is a separate AST-shape difference tracked as C14c.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
Anders Fugmann
2026-07-12 20:34:56 +02:00
parent f8e33a2742
commit a1ae9f7649
2 changed files with 48 additions and 3 deletions

View File

@@ -2,6 +2,6 @@
| Test.kt:4:28:4:32 | index |
| Test.kt:4:35:4:35 | p1 |
| Test.kt:6:9:6:26 | Pair<Integer,Integer> p |
| Test.kt:7:9:7:26 | Pair<Integer,Integer> <destruct> |
| Test.kt:7:14:7:18 | int first |
| Test.kt:7:26:7:26 | Pair<Integer,Integer> tmp0_container |
| Test.kt:8:14:8:25 | Exception _ |