mirror of
https://github.com/github/codeql.git
synced 2026-07-15 16:29:39 +02:00
The K1 and K2 frontends record different source locations for the
compiler-synthesised primary constructor of a class that declares no primary
constructor in source. K2 uses the class declaration's raw IR offsets, which
include any leading modifier keywords, while K1's raw offsets start at the
`class` keyword and omit the modifiers.
Since K1 (unlike K2) retains the PSI, we recover the modifier-inclusive span
from the enclosing KtClassOrObject so K1 matches the K2-native span.
Example, for `open class C0<V> {}` on line 11 (the `open` modifier is at
column 1, the `class` keyword at column 6):
before (K1): generics.kt:11:6:11:19 | C0 | C0()
after (K1): generics.kt:11:1:11:19 | C0 | C0() (matches K2)
The fix is deliberately narrow and leaves all other constructors untouched:
- explicit primary constructors (`class C1(val t: T)`, `class C2()`) keep
their own parameter-list location, which both frontends already agree on;
- explicit secondary constructors keep their own location (only the
`isPrimary` constructor is adjusted);
- specialised/parameterised copies of a generic constructor
(`typeSubstitution != null`) are excluded, so they do not gain a spurious
source location and appear in source-filtered queries.
Relearned test-kotlin1 (K1) and test-kotlin2 (K2): all 3333 tests pass with
database-consistency checks. Only test-kotlin1 expected files change (K2 output
is unchanged, as K2 already emits these spans natively). No previously matching
row diverges; net K1-vs-K2 divergence decreases on every affected file, with
generics, generic-inner-classes and modifiers now fully identical.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
19 lines
1.8 KiB
Plaintext
19 lines
1.8 KiB
Plaintext
| dataClass.kt:1:21:1:47 | DataClass | dataClass.kt:1:1:1:47 | DataClass | file://:0:0:0:0 | void |
|
|
| delegates.kt:3:1:12:1 | MyClass | delegates.kt:3:1:12:1 | MyClass | file://:0:0:0:0 | void |
|
|
| delegates.kt:4:18:6:5 | | delegates.kt:4:18:6:5 | new KProperty1<MyClass,Integer>(...) { ... } | file://:0:0:0:0 | void |
|
|
| delegates.kt:4:26:6:5 | | delegates.kt:4:26:6:5 | new Function0<Integer>(...) { ... } | file://:0:0:0:0 | void |
|
|
| delegates.kt:8:32:11:5 | | delegates.kt:8:32:11:5 | new KMutableProperty1<MyClass,String>(...) { ... } | file://:0:0:0:0 | void |
|
|
| delegates.kt:8:32:11:5 | | delegates.kt:8:32:11:5 | new KMutableProperty1<MyClass,String>(...) { ... } | file://:0:0:0:0 | void |
|
|
| delegates.kt:8:66:11:5 | | delegates.kt:8:66:11:5 | new Function3<KProperty<?>,String,String,Unit>(...) { ... } | file://:0:0:0:0 | void |
|
|
| enumClass.kt:1:21:1:32 | EnumClass | enumClass.kt:1:1:4:1 | EnumClass | file://:0:0:0:0 | void |
|
|
| enumClass.kt:6:1:16:1 | EnumWithFunctions | enumClass.kt:6:1:16:1 | EnumWithFunctions | file://:0:0:0:0 | void |
|
|
| enumClass.kt:8:3:11:4 | VAL | enumClass.kt:8:3:11:4 | VAL | file://:0:0:0:0 | void |
|
|
| methods2.kt:7:1:10:1 | Class2 | methods2.kt:7:1:10:1 | Class2 | file://:0:0:0:0 | void |
|
|
| methods3.kt:5:1:7:1 | Class3 | methods3.kt:5:1:7:1 | Class3 | file://:0:0:0:0 | void |
|
|
| methods4.kt:3:1:11:1 | NestedTest | methods4.kt:3:1:11:1 | NestedTest | file://:0:0:0:0 | void |
|
|
| methods4.kt:5:3:9:3 | InsideNestedTest | methods4.kt:5:3:9:3 | InsideNestedTest | file://:0:0:0:0 | void |
|
|
| methods5.kt:5:3:5:27 | | methods5.kt:5:3:5:27 | | file://:0:0:0:0 | void |
|
|
| methods5.kt:9:3:9:32 | | methods5.kt:9:3:9:32 | | file://:0:0:0:0 | void |
|
|
| methods5.kt:13:1:13:14 | C1 | methods5.kt:13:1:13:14 | C1 | file://:0:0:0:0 | void |
|
|
| methods.kt:5:1:20:1 | Class | methods.kt:5:1:20:1 | Class | file://:0:0:0:0 | void |
|