From 6eaeada1e6e691f4aff75237a87b99f2903a0d49 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 2 Nov 2021 16:09:50 +0300 Subject: [PATCH] FIR: cache properties in use-site scope properly --- .../FirBlackBoxCodegenTestGenerated.java | 6 +++++ .../scopes/JavaClassUseSiteMemberScope.kt | 12 +++++---- .../impl/AbstractFirUseSiteMemberScope.kt | 11 ++++++++ .../scopes/impl/FirClassUseSiteMemberScope.kt | 8 +++--- .../codegen/box/fir/JKEnumConstant.kt | 27 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ 6 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/codegen/box/fir/JKEnumConstant.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 8e737758c42..7c0cdae99fa 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -16408,6 +16408,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/fir/IrBuiltIns.kt"); } + @Test + @TestMetadata("JKEnumConstant.kt") + public void testJKEnumConstant() throws Exception { + runTest("compiler/testData/codegen/box/fir/JKEnumConstant.kt"); + } + @Test @TestMetadata("jvmFieldInLocalClass.kt") public void testJvmFieldInLocalClass() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 949a3d41e75..9d2272ca75d 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -103,16 +103,17 @@ class JavaClassUseSiteMemberScope( return minOf(a, b) } - override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) { + override fun doProcessProperties(name: Name): Collection> { val fields = mutableSetOf>() val fieldNames = mutableSetOf() + val result = mutableSetOf>() // fields declaredMemberScope.processPropertiesByName(name) processor@{ variableSymbol -> if (variableSymbol.isStatic) return@processor fields += variableSymbol fieldNames += variableSymbol.fir.name - processor(variableSymbol) + result += variableSymbol } val fromSupertypes = superTypesScope.getProperties(name) @@ -120,7 +121,7 @@ class JavaClassUseSiteMemberScope( for (propertyFromSupertype in fromSupertypes) { if (propertyFromSupertype is FirFieldSymbol) { if (propertyFromSupertype.fir.name !in fieldNames) { - processor(propertyFromSupertype) + result += propertyFromSupertype } continue } @@ -132,11 +133,12 @@ class JavaClassUseSiteMemberScope( overrideInClass != null -> { directOverriddenProperties.getOrPut(overrideInClass) { mutableListOf() }.add(propertyFromSupertype) overrideByBase[propertyFromSupertype] = overrideInClass - processor(overrideInClass) + result += overrideInClass } - else -> processor(propertyFromSupertype) + else -> result += propertyFromSupertype } } + return result } private fun FirVariableSymbol<*>.createOverridePropertyIfExists( diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt index c54c6b4da9d..3bd0856d2f0 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/AbstractFirUseSiteMemberScope.kt @@ -22,6 +22,7 @@ abstract class AbstractFirUseSiteMemberScope( ) : AbstractFirOverrideScope(session, overrideChecker) { private val functions = hashMapOf>() + private val properties = hashMapOf>>() val directOverriddenFunctions = hashMapOf>() protected val directOverriddenProperties = hashMapOf>() @@ -57,6 +58,16 @@ abstract class AbstractFirUseSiteMemberScope( } } + final override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) { + properties.getOrPut(name) { + doProcessProperties(name) + }.forEach { + processor(it) + } + } + + protected abstract fun doProcessProperties(name: Name): Collection> + private fun computeDirectOverridden(symbol: FirNamedFunctionSymbol): Collection { val result = mutableListOf() val firSimpleFunction = symbol.fir diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt index ac90fcd5bc9..6a56374a66e 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassUseSiteMemberScope.kt @@ -20,8 +20,9 @@ class FirClassUseSiteMemberScope( declaredMemberScope: FirContainingNamesAwareScope ) : AbstractFirUseSiteMemberScope(session, FirStandardOverrideChecker(session), superTypesScope, declaredMemberScope) { - override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) { + override fun doProcessProperties(name: Name): Collection> { val seen = mutableSetOf>() + val result = mutableSetOf>() declaredMemberScope.processPropertiesByName(name) l@{ if (it.isStatic) return@l if (it is FirPropertySymbol) { @@ -29,15 +30,16 @@ class FirClassUseSiteMemberScope( this@FirClassUseSiteMemberScope.directOverriddenProperties[it] = directOverridden } seen += it - processor(it) + result += it } superTypesScope.processPropertiesByName(name) { val overriddenBy = it.getOverridden(seen) if (overriddenBy == null) { - processor(it) + result += it } } + return result } private fun computeDirectOverridden(property: FirProperty): MutableList { diff --git a/compiler/testData/codegen/box/fir/JKEnumConstant.kt b/compiler/testData/codegen/box/fir/JKEnumConstant.kt new file mode 100644 index 00000000000..6f41d1d8ae0 --- /dev/null +++ b/compiler/testData/codegen/box/fir/JKEnumConstant.kt @@ -0,0 +1,27 @@ +// TARGET_BACKEND: JVM_IR +// WITH_RUNTIME + +interface PsiOwner { + var psi: String? +} + +class PsiOwnerImpl(override var psi: String? = null) : PsiOwner + +interface JKElement + +interface JKFormattingOwner + +abstract class JKTreeElement : JKElement, JKFormattingOwner + +abstract class JKDeclaration : JKTreeElement(), PsiOwner by PsiOwnerImpl() + +interface JKAnnotationListOwner : JKFormattingOwner + +open class JKVariable : JKDeclaration(), JKAnnotationListOwner + +class JKEnumConstant : JKVariable() + +fun box(): String { + val constant = JKEnumConstant().also { it.psi = "OK" } + return constant.psi!! +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index abbb4c2138f..cec7d71ab2d 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -16408,6 +16408,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/fir/IrBuiltIns.kt"); } + @Test + @TestMetadata("JKEnumConstant.kt") + public void testJKEnumConstant() throws Exception { + runTest("compiler/testData/codegen/box/fir/JKEnumConstant.kt"); + } + @Test @TestMetadata("jvmFieldInLocalClass.kt") public void testJvmFieldInLocalClass() throws Exception {