[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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user