[FIR2IR] Generate fake overrides for synthetic properties

This fixes "IllegalStateException: Fir2IrSimpleFunctionSymbol for
<paramName> is already bound" when creating a callable reference to a
synthetic property

^KT-56072 Fixed
This commit is contained in:
Kirill Rakhman
2023-01-31 18:48:43 +01:00
committed by Space Team
parent b25e460beb
commit e81f34d4b0
4 changed files with 65 additions and 0 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope
import org.jetbrains.kotlin.fir.resolve.defaultType
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.scopes.*
@@ -82,6 +83,13 @@ class FakeOverrideGenerator(
// This parameter is only needed for data-class methods that is irrelevant for lazy library classes
realDeclarationSymbols = emptySet()
)
FirSyntheticPropertiesScope.createIfSyntheticNamesProviderIsDefined(session, firClass.defaultType(), useSiteMemberScope)?.let {
generateFakeOverridesForName(
irClass, it, name, firClass, this,
// This parameter is only needed for data-class methods that is irrelevant for lazy library classes
realDeclarationSymbols = emptySet()
)
}
if (firClass.isEnumClass) return@buildList // F/O for values/valueOf/entries aren't needed, for other members aren't possible
val staticScope = firClass.scopeProvider.getStaticMemberScopeForCallables(firClass, session, scopeSession)
if (staticScope != null) {
@@ -0,0 +1,31 @@
// FILE: SuperClass.java
public class SuperClass {
private String stringParam;
public SuperClass(String stringParam)
{
this.stringParam = stringParam;
}
public String getStringParam()
{
return stringParam;
}
}
// FILE: InheritedClass.java
public class InheritedClass extends SuperClass {
public InheritedClass(String stringParam) {
super(stringParam);
}
}
// FILE: test.kt
fun box(): String {
val superValue = (SuperClass::stringParam)(SuperClass("O"))
val inheritedValue = (InheritedClass("K")::stringParam)()
return superValue + inheritedValue
}
@@ -117,6 +117,22 @@ public class FirSpecificBlackBoxCodegenTestGenerated extends AbstractFirBlackBox
runTest("compiler/fir/fir2ir/testData/codegen/box/properties/backingField/overriddenPropertiesWithExplicitBackingFields.kt");
}
}
@Nested
@TestMetadata("compiler/fir/fir2ir/testData/codegen/box/properties/synthetic")
@TestDataPath("$PROJECT_ROOT")
public class Synthetic {
@Test
public void testAllFilesPresentInSynthetic() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/fir/fir2ir/testData/codegen/box/properties/synthetic"), Pattern.compile("^(.+)\\.kt$"), null, TargetBackend.JVM_IR, true);
}
@Test
@TestMetadata("kt56072.kt")
public void testKt56072() throws Exception {
runTest("compiler/fir/fir2ir/testData/codegen/box/properties/synthetic/kt56072.kt");
}
}
}
}
@@ -15,6 +15,16 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:AX modality:ABSTRACT visibili
overridden:
public abstract fun getA (): @[FlexibleNullability] <root>.X? declared in <root>.X
$this: VALUE_PARAMETER FAKE_OVERRIDE name:<this> type:<root>.AX
PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:a visibility:public modality:OPEN [val]
overridden:
public abstract a: <root>.A? [val]
FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:<get-a> visibility:public modality:OPEN <> ($this:<root>.AX) returnType:@[FlexibleNullability] <root>.AX?
annotations:
Override
correspondingProperty: PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:a visibility:public modality:OPEN [val]
overridden:
public abstract fun <get-a> (): <root>.A? declared in <root>.A
$this: VALUE_PARAMETER IR_EXTERNAL_JAVA_DECLARATION_STUB name:<this> type:<root>.AX
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:<root>.AX, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in <root>.A