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:
Dmitry Petrov
2017-12-15 16:15:52 +03:00
parent d8cd926a8c
commit 17b4d4a973
7 changed files with 77 additions and 3 deletions
@@ -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()
@@ -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");
@@ -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");