Differentiate accessors by FieldAccessorKind
Otherwise accessors for backing fields (as in '{ field }') clash with
accessors for properties (as in '{ prop }').
#KT-21258 Fixed Target versions 1.2.30
This commit is contained in:
@@ -57,13 +57,16 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
||||
private static class AccessorKey {
|
||||
public final DeclarationDescriptor descriptor;
|
||||
public final ClassDescriptor superCallLabelTarget;
|
||||
public final FieldAccessorKind fieldAccessorKind;
|
||||
|
||||
public AccessorKey(
|
||||
@NotNull DeclarationDescriptor descriptor,
|
||||
@Nullable ClassDescriptor superCallLabelTarget
|
||||
@Nullable ClassDescriptor superCallLabelTarget,
|
||||
@NotNull FieldAccessorKind fieldAccessorKind
|
||||
) {
|
||||
this.descriptor = descriptor;
|
||||
this.superCallLabelTarget = superCallLabelTarget;
|
||||
this.fieldAccessorKind = fieldAccessorKind;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -71,13 +74,16 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
||||
if (!(obj instanceof AccessorKey)) return false;
|
||||
AccessorKey other = (AccessorKey) obj;
|
||||
return descriptor.equals(other.descriptor) &&
|
||||
fieldAccessorKind == other.fieldAccessorKind &&
|
||||
(superCallLabelTarget == null ? other.superCallLabelTarget == null
|
||||
: superCallLabelTarget.equals(other.superCallLabelTarget));
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return 31 * descriptor.hashCode() + (superCallLabelTarget == null ? 0 : superCallLabelTarget.hashCode());
|
||||
return 31 * descriptor.hashCode() +
|
||||
fieldAccessorKind.hashCode() +
|
||||
(superCallLabelTarget == null ? 0 : superCallLabelTarget.hashCode());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -458,7 +464,7 @@ public abstract class CodegenContext<T extends DeclarationDescriptor> {
|
||||
}
|
||||
|
||||
D descriptor = (D) possiblySubstitutedDescriptor.getOriginal();
|
||||
AccessorKey key = new AccessorKey(descriptor, superCallTarget);
|
||||
AccessorKey key = new AccessorKey(descriptor, superCallTarget, accessorKind);
|
||||
|
||||
// NB should check for property accessor factory first (or change property accessor tracking under propertyAccessorFactory creation)
|
||||
if (propertyAccessorFactories.containsKey(key)) {
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
class Foo {
|
||||
private val fld: String = "O"
|
||||
get() = { field }() + "K"
|
||||
|
||||
val indirectFldGetter: () -> String = { fld }
|
||||
}
|
||||
|
||||
fun box() = Foo().indirectFldGetter()
|
||||
@@ -0,0 +1,12 @@
|
||||
class Foo {
|
||||
private val fld: String = "O"
|
||||
get() = { field }() + "K"
|
||||
|
||||
val indirectFldGetter: () -> String = { fld }
|
||||
|
||||
fun simpleFldGetter(): String {
|
||||
return fld
|
||||
}
|
||||
}
|
||||
|
||||
fun box() = Foo().simpleFldGetter()
|
||||
+12
@@ -20153,6 +20153,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt21258_indirect.kt")
|
||||
public void testKt21258_indirect() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt21258_simple.kt")
|
||||
public void testKt21258_simple() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt9717.kt")
|
||||
public void testKt9717() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt");
|
||||
|
||||
@@ -20153,6 +20153,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt21258_indirect.kt")
|
||||
public void testKt21258_indirect() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt21258_simple.kt")
|
||||
public void testKt21258_simple() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt9717.kt")
|
||||
public void testKt9717() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt");
|
||||
|
||||
@@ -20153,6 +20153,18 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt21258_indirect.kt")
|
||||
public void testKt21258_indirect() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt21258_simple.kt")
|
||||
public void testKt21258_simple() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt9717.kt")
|
||||
public void testKt9717() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt");
|
||||
|
||||
+12
@@ -23819,6 +23819,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt21258_indirect.kt")
|
||||
public void testKt21258_indirect() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_indirect.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt21258_simple.kt")
|
||||
public void testKt21258_simple() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt21258_simple.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt9717.kt")
|
||||
public void testKt9717() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/syntheticAccessors/kt9717.kt");
|
||||
|
||||
Reference in New Issue
Block a user