[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.backend.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
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.defaultType
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
import org.jetbrains.kotlin.fir.scopes.*
|
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
|
// This parameter is only needed for data-class methods that is irrelevant for lazy library classes
|
||||||
realDeclarationSymbols = emptySet()
|
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
|
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)
|
val staticScope = firClass.scopeProvider.getStaticMemberScopeForCallables(firClass, session, scopeSession)
|
||||||
if (staticScope != null) {
|
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");
|
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:
|
overridden:
|
||||||
public abstract fun getA (): @[FlexibleNullability] <root>.X? declared in <root>.X
|
public abstract fun getA (): @[FlexibleNullability] <root>.X? declared in <root>.X
|
||||||
$this: VALUE_PARAMETER FAKE_OVERRIDE name:<this> type:<root>.AX
|
$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]
|
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:<root>.AX, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
|
||||||
overridden:
|
overridden:
|
||||||
public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in <root>.A
|
public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in <root>.A
|
||||||
|
|||||||
Reference in New Issue
Block a user