From dc81b51829a0622a8c14faaca5d327d48c547ac8 Mon Sep 17 00:00:00 2001 From: Anders Fugmann Date: Mon, 13 Jul 2026 10:07:02 +0200 Subject: [PATCH] Kotlin: converge synthetic value-parameter locations onto their owning declaration Two compiler-synthesised value parameters that carry no source token of their own were located differently by the K1 and K2 frontends: - the `` parameter of a delegated property's synthesised setter: K1 anchored it at the delegate expression (`delegates.kt:8:32:11:5`) while K2 spans the whole property declaration (`8:5:11:5`); and - the `value` parameter of the synthetic enum `valueOf` member: K1 has no offsets and emitted the null `0:0:0:0` location while K2 attributes it to the enum-class declaration (`1:1:4:1`). In both cases the parameter is synthesised, so the K2 span (the owning declaration) is a real, navigable location and strictly more useful than either the delegate-expression fragment or K1's null `0:0`. We therefore converge K1 onto the K2-native span, consistent with how the other synthesised members (accessors, implicit constructors, super calls, `$delegate` fields) are already being anchored on their owning declaration. `getPsiBasedSyntheticParameterLocation` recovers the span from the PSI under K1 and returns null under K2 (where `getKtFile` is unavailable and the raw offsets already carry the owning-declaration span) and for every ordinary, source-backed parameter, so the canonical K2 output is untouched. Relearn (both suites, CPUS=5): all 3333 tests pass. Only test-kotlin1 changes; methods/parameters is now byte-identical across suites (6 -> 0 divergent rows), and the same setter/valueOf parameter rows converge in the PrintAst/exprs projections that reference them (annotation_classes/PrintAst 88->84, classes/PrintAst 18->10, exprs/PrintAst 75->67, exprs/exprs 189->171, exprs_typeaccess/PrintAst 9->5, methods/exprs 36->30). Every touched file's divergence strictly decreases; no new divergence is introduced. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../src/main/kotlin/KotlinFileExtractor.kt | 50 +++++++++++++++++++ .../annotation_classes/PrintAst.expected | 4 +- .../library-tests/classes/PrintAst.expected | 8 +-- .../library-tests/exprs/PrintAst.expected | 8 +-- .../library-tests/exprs/exprs.expected | 18 +++---- .../exprs_typeaccess/PrintAst.expected | 4 +- .../library-tests/methods/exprs.expected | 6 +-- .../library-tests/methods/parameters.expected | 6 +-- 8 files changed, 77 insertions(+), 27 deletions(-) diff --git a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt index 0a938d8821f..543abaf1493 100644 --- a/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt +++ b/java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt @@ -1383,6 +1383,7 @@ open class KotlinFileExtractor( val location = locOverride ?: getGeneratedDataClassCopyParamLocation(vp, idx) + ?: getPsiBasedSyntheticParameterLocation(vp) ?: getPsiBasedValueParameterLocation(vp) ?: getLocation(vp, classTypeArgsIncludingOuterClasses) val maybeAlteredType = @@ -3166,6 +3167,55 @@ open class KotlinFileExtractor( return tw.getLocation(keyword.startOffset, vp.endOffset) } + /** + * Returns the PSI-based location for a *synthesised* value parameter that has no source + * token of its own, matching the span the K2 frontend emits natively, or null to leave the + * raw IR offset in place. + * + * Two synthetic members carry such parameters: + * - the compiler-generated setter of a *delegated* property (its `` parameter): the + * K1 frontend anchors it at the delegate expression (`8:32:11:5`) while K2 spans the whole + * property declaration (`8:5:11:5`); and + * - the enum `valueOf` special member (its `value` parameter): the K1 frontend has no offsets + * at all and emits the null `0:0:0:0` location while K2 attributes it to the enum-class + * declaration (`1:1:4:1`). + * + * In both cases the parameter is compiler-synthesised, so the K2 span (the owning declaration) + * is a real, navigable location and strictly more useful than either the delegate-expression + * fragment or the null `0:0` K1 records. As with the other convergence helpers we recover that + * span from the PSI under K1; the method returns null under K2 (where [getKtFile] is + * unavailable and the raw offsets already carry the owning-declaration span) and for every + * ordinary, source-backed parameter. + */ + private fun getPsiBasedSyntheticParameterLocation(vp: IrValueParameter): Label? { + val file = currentIrFile ?: return null + val ktFile = getPsi2Ir()?.getKtFile(file) ?: return null + val fn = vp.parent as? IrSimpleFunction ?: return null + + val property = fn.correspondingPropertySymbol?.owner + if (property != null && property.isDelegated && property.setter?.symbol == fn.symbol) { + val ktProperty = getEnclosingKtProperty(property) ?: return null + return tw.getLocation(ktProperty.startOffset, ktProperty.endOffset) + } + + if ( + fn.origin == IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER && + fn.name.asString() == "valueOf" + ) { + val enumClass = fn.parentClassOrNull ?: return null + if (enumClass.startOffset < 0) return null + val ktClass = ktFile.findElementAt(enumClass.startOffset) + ?.let { leaf -> + generateSequence(leaf) { it.parent } + .filterIsInstance() + .firstOrNull() + } + ?: return null + return tw.getLocation(ktClass.startOffset, ktClass.endOffset) + } + return null + } + /** * Returns the PSI-based location for a synthesised (`DEFAULT_PROPERTY_ACCESSOR`) * getter or setter, matching the span the K2 frontend emits natively. diff --git a/java/ql/test-kotlin1/library-tests/annotation_classes/PrintAst.expected b/java/ql/test-kotlin1/library-tests/annotation_classes/PrintAst.expected index 286c0cb18ce..e13226af219 100644 --- a/java/ql/test-kotlin1/library-tests/annotation_classes/PrintAst.expected +++ b/java/ql/test-kotlin1/library-tests/annotation_classes/PrintAst.expected @@ -175,8 +175,8 @@ def.kt: # 0| 3: [Method] valueOf # 0| 3: [TypeAccess] Y #-----| 4: (Parameters) -# 0| 0: [Parameter] value -# 0| 0: [TypeAccess] String +# 34| 0: [Parameter] value +# 34| 0: [TypeAccess] String # 0| 4: [Method] values # 0| 3: [TypeAccess] Y[] # 0| 0: [TypeAccess] Y diff --git a/java/ql/test-kotlin1/library-tests/classes/PrintAst.expected b/java/ql/test-kotlin1/library-tests/classes/PrintAst.expected index bac854ce33a..5b23fad008e 100644 --- a/java/ql/test-kotlin1/library-tests/classes/PrintAst.expected +++ b/java/ql/test-kotlin1/library-tests/classes/PrintAst.expected @@ -166,8 +166,8 @@ classes.kt: # 0| 3: [Method] valueOf # 0| 3: [TypeAccess] Direction #-----| 4: (Parameters) -# 0| 0: [Parameter] value -# 0| 0: [TypeAccess] String +# 49| 0: [Parameter] value +# 49| 0: [TypeAccess] String # 0| 4: [Method] values # 0| 3: [TypeAccess] Direction[] # 0| 0: [TypeAccess] Direction @@ -203,8 +203,8 @@ classes.kt: # 0| 3: [Method] valueOf # 0| 3: [TypeAccess] Color #-----| 4: (Parameters) -# 0| 0: [Parameter] value -# 0| 0: [TypeAccess] String +# 53| 0: [Parameter] value +# 53| 0: [TypeAccess] String # 0| 4: [Method] values # 0| 3: [TypeAccess] Color[] # 0| 0: [TypeAccess] Color diff --git a/java/ql/test-kotlin1/library-tests/exprs/PrintAst.expected b/java/ql/test-kotlin1/library-tests/exprs/PrintAst.expected index 9224ac81976..45bfea8c128 100644 --- a/java/ql/test-kotlin1/library-tests/exprs/PrintAst.expected +++ b/java/ql/test-kotlin1/library-tests/exprs/PrintAst.expected @@ -3350,8 +3350,8 @@ exprs.kt: # 0| 3: [Method] valueOf # 0| 3: [TypeAccess] Direction #-----| 4: (Parameters) -# 0| 0: [Parameter] value -# 0| 0: [TypeAccess] String +# 174| 0: [Parameter] value +# 174| 0: [TypeAccess] String # 0| 4: [Method] values # 0| 3: [TypeAccess] Direction[] # 0| 0: [TypeAccess] Direction @@ -3387,8 +3387,8 @@ exprs.kt: # 0| 3: [Method] valueOf # 0| 3: [TypeAccess] Color #-----| 4: (Parameters) -# 0| 0: [Parameter] value -# 0| 0: [TypeAccess] String +# 178| 0: [Parameter] value +# 178| 0: [TypeAccess] String # 0| 4: [Method] values # 0| 3: [TypeAccess] Color[] # 0| 0: [TypeAccess] Color diff --git a/java/ql/test-kotlin1/library-tests/exprs/exprs.expected b/java/ql/test-kotlin1/library-tests/exprs/exprs.expected index 6a950050a96..4a69ab873a0 100644 --- a/java/ql/test-kotlin1/library-tests/exprs/exprs.expected +++ b/java/ql/test-kotlin1/library-tests/exprs/exprs.expected @@ -226,7 +226,7 @@ | delegatedProperties.kt:39:34:39:51 | varResource2$delegate | delegatedProperties.kt:39:9:39:51 | | VarAccess | | delegatedProperties.kt:42:5:42:47 | Unit | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:42:5:42:47 | int | file://:0:0:0:0 | | TypeAccess | -| delegatedProperties.kt:42:27:42:47 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:42:5:42:47 | int | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:42:30:42:47 | ...::... | delegatedProperties.kt:42:5:42:47 | getVarResource0 | PropertyRefExpr | | delegatedProperties.kt:42:30:42:47 | ...::... | delegatedProperties.kt:42:5:42:47 | setVarResource0 | PropertyRefExpr | | delegatedProperties.kt:42:30:42:47 | ...=... | delegatedProperties.kt:17:1:43:1 | Owner | KtInitializerAssignExpr | @@ -336,7 +336,7 @@ | delegatedProperties.kt:65:87:65:95 | memberInt | delegatedProperties.kt:65:14:65:78 | MyClass | VarAccess | | delegatedProperties.kt:66:5:66:50 | Unit | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:66:5:66:50 | int | file://:0:0:0:0 | | TypeAccess | -| delegatedProperties.kt:66:33:66:50 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:66:5:66:50 | int | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:66:36:66:39 | MyClass | delegatedProperties.kt:65:14:65:78 | MyClass | TypeAccess | | delegatedProperties.kt:66:36:66:39 | MyClass.this | delegatedProperties.kt:65:14:65:78 | MyClass | ThisAccess | | delegatedProperties.kt:66:36:66:50 | ...::... | delegatedProperties.kt:65:14:65:78 | MyClass | PropertyRefExpr | @@ -399,7 +399,7 @@ | delegatedProperties.kt:66:36:66:50 | this.delegatedToMember1$delegate | delegatedProperties.kt:66:5:66:50 | setDelegatedToMember1 | VarAccess | | delegatedProperties.kt:67:5:67:53 | Unit | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:67:5:67:53 | int | file://:0:0:0:0 | | TypeAccess | -| delegatedProperties.kt:67:33:67:53 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:67:5:67:53 | int | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:67:36:67:53 | ...::... | delegatedProperties.kt:65:14:65:78 | MyClass | PropertyRefExpr | | delegatedProperties.kt:67:36:67:53 | ...::... | delegatedProperties.kt:67:5:67:53 | getDelegatedToMember2 | PropertyRefExpr | | delegatedProperties.kt:67:36:67:53 | ...::... | delegatedProperties.kt:67:5:67:53 | setDelegatedToMember2 | PropertyRefExpr | @@ -458,7 +458,7 @@ | delegatedProperties.kt:67:36:67:53 | this.delegatedToMember2$delegate | delegatedProperties.kt:67:5:67:53 | setDelegatedToMember2 | VarAccess | | delegatedProperties.kt:69:5:69:56 | Unit | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:69:5:69:56 | int | file://:0:0:0:0 | | TypeAccess | -| delegatedProperties.kt:69:36:69:56 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:69:5:69:56 | int | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:69:39:69:42 | MyClass | delegatedProperties.kt:65:14:65:78 | MyClass | TypeAccess | | delegatedProperties.kt:69:39:69:42 | MyClass.this | delegatedProperties.kt:65:14:65:78 | MyClass | ThisAccess | | delegatedProperties.kt:69:39:69:56 | ...::... | delegatedProperties.kt:65:14:65:78 | MyClass | PropertyRefExpr | @@ -523,7 +523,7 @@ | delegatedProperties.kt:69:39:69:56 | this.delegatedToExtMember1$delegate | delegatedProperties.kt:69:5:69:56 | setDelegatedToExtMember1 | VarAccess | | delegatedProperties.kt:70:5:70:59 | Unit | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:70:5:70:59 | int | file://:0:0:0:0 | | TypeAccess | -| delegatedProperties.kt:70:36:70:59 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:70:5:70:59 | int | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:70:39:70:59 | ...::... | delegatedProperties.kt:65:14:65:78 | MyClass | PropertyRefExpr | | delegatedProperties.kt:70:39:70:59 | ...::... | delegatedProperties.kt:70:5:70:59 | getDelegatedToExtMember2 | PropertyRefExpr | | delegatedProperties.kt:70:39:70:59 | ...::... | delegatedProperties.kt:70:5:70:59 | setDelegatedToExtMember2 | PropertyRefExpr | @@ -686,7 +686,7 @@ | delegatedProperties.kt:75:42:75:78 | this.delegatedToAnotherClass1$delegate | delegatedProperties.kt:75:5:75:78 | getDelegatedToAnotherClass1 | VarAccess | | delegatedProperties.kt:77:5:77:49 | Unit | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:77:5:77:49 | int | file://:0:0:0:0 | | TypeAccess | -| delegatedProperties.kt:77:34:77:49 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:77:5:77:49 | int | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:77:37:77:49 | ...::... | delegatedProperties.kt:65:14:65:78 | MyClass | PropertyRefExpr | | delegatedProperties.kt:77:37:77:49 | ...::... | delegatedProperties.kt:77:5:77:49 | getDelegatedToTopLevel | PropertyRefExpr | | delegatedProperties.kt:77:37:77:49 | ...::... | delegatedProperties.kt:77:5:77:49 | setDelegatedToTopLevel | PropertyRefExpr | @@ -826,7 +826,7 @@ | delegatedProperties.kt:87:1:87:46 | MyClass | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:87:1:87:46 | Unit | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:87:1:87:46 | int | file://:0:0:0:0 | | TypeAccess | -| delegatedProperties.kt:87:31:87:46 | int | file://:0:0:0:0 | | TypeAccess | +| delegatedProperties.kt:87:1:87:46 | int | file://:0:0:0:0 | | TypeAccess | | delegatedProperties.kt:87:34:87:46 | ...::... | delegatedProperties.kt:0:0:0:0 | | PropertyRefExpr | | delegatedProperties.kt:87:34:87:46 | ...::... | delegatedProperties.kt:87:1:87:46 | getExtDelegated | PropertyRefExpr | | delegatedProperties.kt:87:34:87:46 | ...::... | delegatedProperties.kt:87:1:87:46 | setExtDelegated | PropertyRefExpr | @@ -893,8 +893,6 @@ | exprs.kt:0:0:0:0 | Direction[] | file://:0:0:0:0 | | TypeAccess | | exprs.kt:0:0:0:0 | EnumEntries | file://:0:0:0:0 | | TypeAccess | | exprs.kt:0:0:0:0 | EnumEntries | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:0:0:0:0 | String | file://:0:0:0:0 | | TypeAccess | -| exprs.kt:0:0:0:0 | String | file://:0:0:0:0 | | TypeAccess | | exprs.kt:4:1:142:1 | int | file://:0:0:0:0 | | TypeAccess | | exprs.kt:4:20:4:25 | int | file://:0:0:0:0 | | TypeAccess | | exprs.kt:4:28:4:33 | int | file://:0:0:0:0 | | TypeAccess | @@ -1477,6 +1475,7 @@ | exprs.kt:174:1:176:1 | 0 | exprs.kt:174:1:176:1 | Direction | IntegerLiteral | | exprs.kt:174:1:176:1 | Direction | exprs.kt:174:1:176:1 | Direction | TypeAccess | | exprs.kt:174:1:176:1 | Enum | exprs.kt:174:1:176:1 | Direction | TypeAccess | +| exprs.kt:174:1:176:1 | String | file://:0:0:0:0 | | TypeAccess | | exprs.kt:174:1:176:1 | new Enum(...) | exprs.kt:174:1:176:1 | Direction | ClassInstanceExpr | | exprs.kt:174:1:176:1 | null | exprs.kt:174:1:176:1 | Direction | NullLiteral | | exprs.kt:175:5:175:10 | ...=... | exprs.kt:0:0:0:0 | | KtInitializerAssignExpr | @@ -1506,6 +1505,7 @@ | exprs.kt:178:1:182:1 | 0 | exprs.kt:178:17:178:30 | Color | IntegerLiteral | | exprs.kt:178:1:182:1 | Color | exprs.kt:178:17:178:30 | Color | TypeAccess | | exprs.kt:178:1:182:1 | Enum | exprs.kt:178:17:178:30 | Color | TypeAccess | +| exprs.kt:178:1:182:1 | String | file://:0:0:0:0 | | TypeAccess | | exprs.kt:178:1:182:1 | new Enum(...) | exprs.kt:178:17:178:30 | Color | ClassInstanceExpr | | exprs.kt:178:1:182:1 | null | exprs.kt:178:17:178:30 | Color | NullLiteral | | exprs.kt:178:18:178:29 | ...=... | exprs.kt:178:17:178:30 | Color | KtInitializerAssignExpr | diff --git a/java/ql/test-kotlin1/library-tests/exprs_typeaccess/PrintAst.expected b/java/ql/test-kotlin1/library-tests/exprs_typeaccess/PrintAst.expected index e8b7b5dc239..4968ed4b013 100644 --- a/java/ql/test-kotlin1/library-tests/exprs_typeaccess/PrintAst.expected +++ b/java/ql/test-kotlin1/library-tests/exprs_typeaccess/PrintAst.expected @@ -80,8 +80,8 @@ A.kt: # 0| 3: [Method] valueOf # 0| 3: [TypeAccess] Enu #-----| 4: (Parameters) -# 0| 0: [Parameter] value -# 0| 0: [TypeAccess] String +# 23| 0: [Parameter] value +# 23| 0: [TypeAccess] String # 0| 4: [Method] values # 0| 3: [TypeAccess] Enu[] # 0| 0: [TypeAccess] Enu diff --git a/java/ql/test-kotlin1/library-tests/methods/exprs.expected b/java/ql/test-kotlin1/library-tests/methods/exprs.expected index de1c4049cad..256ca4cbfbe 100644 --- a/java/ql/test-kotlin1/library-tests/methods/exprs.expected +++ b/java/ql/test-kotlin1/library-tests/methods/exprs.expected @@ -161,8 +161,8 @@ | delegates.kt:4:26:6:5 | int | TypeAccess | | delegates.kt:5:9:5:9 | 5 | IntegerLiteral | | delegates.kt:8:5:11:5 | String | TypeAccess | +| delegates.kt:8:5:11:5 | String | TypeAccess | | delegates.kt:8:5:11:5 | Unit | TypeAccess | -| delegates.kt:8:32:11:5 | String | TypeAccess | | delegates.kt:8:35:8:43 | INSTANCE | VarAccess | | delegates.kt:8:35:11:5 | ...::... | PropertyRefExpr | | delegates.kt:8:35:11:5 | ...::... | PropertyRefExpr | @@ -233,11 +233,10 @@ | enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess | | enumClass.kt:0:0:0:0 | EnumWithFunctions | TypeAccess | | enumClass.kt:0:0:0:0 | EnumWithFunctions[] | TypeAccess | -| enumClass.kt:0:0:0:0 | String | TypeAccess | -| enumClass.kt:0:0:0:0 | String | TypeAccess | | enumClass.kt:1:1:4:1 | 0 | IntegerLiteral | | enumClass.kt:1:1:4:1 | Enum | TypeAccess | | enumClass.kt:1:1:4:1 | EnumClass | TypeAccess | +| enumClass.kt:1:1:4:1 | String | TypeAccess | | enumClass.kt:1:1:4:1 | new Enum(...) | ClassInstanceExpr | | enumClass.kt:1:1:4:1 | null | NullLiteral | | enumClass.kt:1:22:1:31 | ...=... | KtInitializerAssignExpr | @@ -265,6 +264,7 @@ | enumClass.kt:6:1:16:1 | 0 | IntegerLiteral | | enumClass.kt:6:1:16:1 | Enum | TypeAccess | | enumClass.kt:6:1:16:1 | EnumWithFunctions | TypeAccess | +| enumClass.kt:6:1:16:1 | String | TypeAccess | | enumClass.kt:6:1:16:1 | new Enum(...) | ClassInstanceExpr | | enumClass.kt:6:1:16:1 | null | NullLiteral | | enumClass.kt:8:3:11:4 | ...=... | KtInitializerAssignExpr | diff --git a/java/ql/test-kotlin1/library-tests/methods/parameters.expected b/java/ql/test-kotlin1/library-tests/methods/parameters.expected index 6c193da1c46..87eb45458cf 100644 --- a/java/ql/test-kotlin1/library-tests/methods/parameters.expected +++ b/java/ql/test-kotlin1/library-tests/methods/parameters.expected @@ -10,7 +10,7 @@ | dataClass.kt:1:34:1:46 | setY | dataClass.kt:1:34:1:46 | | 0 | | delegates.kt:4:21:6:5 | get | delegates.kt:4:21:6:5 | a0 | 0 | | delegates.kt:4:21:6:5 | invoke | delegates.kt:4:21:6:5 | a0 | 0 | -| delegates.kt:8:5:11:5 | setObservableProp | delegates.kt:8:32:11:5 | | 0 | +| delegates.kt:8:5:11:5 | setObservableProp | delegates.kt:8:5:11:5 | | 0 | | delegates.kt:8:35:11:5 | get | delegates.kt:8:35:11:5 | a0 | 0 | | delegates.kt:8:35:11:5 | get | delegates.kt:8:35:11:5 | a0 | 0 | | delegates.kt:8:35:11:5 | invoke | delegates.kt:8:35:11:5 | a0 | 0 | @@ -22,8 +22,8 @@ | delegates.kt:8:66:11:5 | invoke | delegates.kt:9:9:9:12 | prop | 0 | | delegates.kt:8:66:11:5 | invoke | delegates.kt:9:15:9:17 | old | 1 | | delegates.kt:8:66:11:5 | invoke | delegates.kt:9:20:9:22 | new | 2 | -| enumClass.kt:0:0:0:0 | valueOf | enumClass.kt:0:0:0:0 | value | 0 | -| enumClass.kt:0:0:0:0 | valueOf | enumClass.kt:0:0:0:0 | value | 0 | +| enumClass.kt:0:0:0:0 | valueOf | enumClass.kt:1:1:4:1 | value | 0 | +| enumClass.kt:0:0:0:0 | valueOf | enumClass.kt:6:1:16:1 | value | 0 | | enumClass.kt:9:14:9:30 | f | enumClass.kt:9:20:9:25 | i | 0 | | enumClass.kt:10:14:10:42 | g | enumClass.kt:10:20:10:25 | i | 0 | | enumClass.kt:13:12:13:29 | f | enumClass.kt:13:18:13:23 | i | 0 |