[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:
committed by
Space Team
parent
b25e460beb
commit
e81f34d4b0
+8
@@ -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
|
||||
}
|
||||
+16
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user