mirror of
https://github.com/github/codeql.git
synced 2026-07-14 07:48:16 +02:00
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>