diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index b296aad75cb..87825d60007 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -13,9 +13,11 @@ import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.dispatchReceiverClassLookupTagOrNull import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.isStatic import org.jetbrains.kotlin.fir.types.isNullableAny import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.declarations.* @@ -164,55 +166,44 @@ class Fir2IrLazyClass( } } - // Handle generated methods for enum classes (values(), valueOf(String)). if (fir.classKind == ClassKind.ENUM_CLASS) { for (declaration in fir.declarations) { - if (declaration !is FirCallableDeclaration || !declaration.isStatic || !shouldBuildStub(declaration)) continue - - when (declaration) { - is FirSimpleFunction -> { - // TODO we also come here for all deserialized / enhanced static enum members (with declaration.source == null). - // For such members we currently can't tell whether they are compiler-generated methods or not. - // Note: we must drop declarations from Java here to avoid FirJavaTypeRefs inside - if (declaration.source == null && declaration.origin !is FirDeclarationOrigin.Java || - declaration.source?.kind == KtFakeSourceElementKind.EnumGeneratedDeclaration - ) { - result += declarationStorage.getIrFunctionSymbol(declaration.symbol, forceTopLevelPrivate = isTopLevelPrivate).owner - } - } - - is FirEnumEntry -> { - result += declarationStorage.getIrValueSymbol(declaration.symbol).owner as IrDeclaration - } - - else -> {} + if (declaration is FirEnumEntry && shouldBuildStub(declaration)) { + result += declarationStorage.getIrValueSymbol(declaration.symbol).owner as IrDeclaration } } } val ownerLookupTag = fir.symbol.toLookupTag() - for (name in scope.getCallableNames()) { - scope.processFunctionsByName(name) { - if (it.isSubstitutionOrIntersectionOverride) return@processFunctionsByName - if (!shouldBuildStub(it.fir)) return@processFunctionsByName - if (it.dispatchReceiverClassLookupTagOrNull() == ownerLookupTag) { - if (it.isAbstractMethodOfAny()) { - return@processFunctionsByName + + fun addDeclarationsFromScope(scope: FirContainingNamesAwareScope?) { + if (scope == null) return + for (name in scope.getCallableNames()) { + scope.processFunctionsByName(name) { + if (it.isSubstitutionOrIntersectionOverride) return@processFunctionsByName + if (!shouldBuildStub(it.fir)) return@processFunctionsByName + if (it.isStatic || it.dispatchReceiverClassLookupTagOrNull() == ownerLookupTag) { + if (it.isAbstractMethodOfAny()) { + return@processFunctionsByName + } + result += declarationStorage.getIrFunctionSymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner } - result += declarationStorage.getIrFunctionSymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner } - } - scope.processPropertiesByName(name) { - if (it.isSubstitutionOrIntersectionOverride) return@processPropertiesByName - if (!shouldBuildStub(it.fir)) return@processPropertiesByName - if (it is FirPropertySymbol && it.dispatchReceiverClassLookupTagOrNull() == ownerLookupTag) { - result.addIfNotNull( - declarationStorage.getIrPropertySymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner as? IrDeclaration - ) + scope.processPropertiesByName(name) { + if (it.isSubstitutionOrIntersectionOverride) return@processPropertiesByName + if (!shouldBuildStub(it.fir)) return@processPropertiesByName + if (it is FirPropertySymbol && (it.isStatic || it.dispatchReceiverClassLookupTagOrNull() == ownerLookupTag)) { + result.addIfNotNull( + declarationStorage.getIrPropertySymbol(it, forceTopLevelPrivate = isTopLevelPrivate).owner as? IrDeclaration + ) + } } } } + addDeclarationsFromScope(scope) + addDeclarationsFromScope(fir.staticScope(session, scopeSession)) + with(classifierStorage) { result.addAll(this@Fir2IrLazyClass.createContextReceiverFields(fir)) } diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt index 756efc1fadf..2010b0f293b 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/declarations/ImplicitReceiverUtils.kt @@ -8,9 +8,11 @@ package org.jetbrains.kotlin.fir.declarations import kotlinx.collections.immutable.PersistentList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.labelName import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.* +import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirLocalScope import org.jetbrains.kotlin.fir.scopes.impl.wrapNestedClassifierScopeWithSubstitutionForSuperType @@ -240,8 +242,11 @@ fun ContextReceiverGroup.asTowerDataElement(): FirTowerDataElement = fun FirScope.asTowerDataElement(isLocal: Boolean): FirTowerDataElement = FirTowerDataElement(scope = this, implicitReceiver = null, isLocal = isLocal) -fun FirClass.staticScope(sessionHolder: SessionHolder) = - scopeProvider.getStaticScope(this, sessionHolder.session, sessionHolder.scopeSession) +fun FirClass.staticScope(sessionHolder: SessionHolder): FirContainingNamesAwareScope? = + staticScope(sessionHolder.session, sessionHolder.scopeSession) + +fun FirClass.staticScope(session: FirSession, scopeSession: ScopeSession): FirContainingNamesAwareScope? = + scopeProvider.getStaticScope(this, session, scopeSession) typealias ContextReceiverGroup = List> typealias FirLocalScopes = PersistentList diff --git a/compiler/testData/ir/irText/stubs/javaEnum.__JEnum.fir.ir.txt b/compiler/testData/ir/irText/stubs/javaEnum.__JEnum.fir.ir.txt index b26e56a9abb..34a1e1dc637 100644 --- a/compiler/testData/ir/irText/stubs/javaEnum.__JEnum.fir.ir.txt +++ b/compiler/testData/ir/irText/stubs/javaEnum.__JEnum.fir.ir.txt @@ -6,6 +6,10 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB ENUM_CLASS name:JEnum modality:FINAL vis FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:values visibility:public modality:FINAL <> () returnType:kotlin.Array<.JEnum> FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:.JEnum VALUE_PARAMETER name:value index:0 type:kotlin.String + PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:entries visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:entries type:kotlin.enums.EnumEntries visibility:public [final,static] + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.enums.EnumEntries + correspondingProperty: PROPERTY IR_EXTERNAL_JAVA_DECLARATION_STUB name:entries visibility:public modality:FINAL [val] FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:.JEnum) returnType:kotlin.Any [fake_override] overridden: protected final fun clone (): kotlin.Any declared in kotlin.Enum diff --git a/compiler/testData/ir/irText/stubs/javaStaticMethod.__J.fir.ir.txt b/compiler/testData/ir/irText/stubs/javaStaticMethod.__J.fir.ir.txt index 725c4170711..394b4d8e70a 100644 --- a/compiler/testData/ir/irText/stubs/javaStaticMethod.__J.fir.ir.txt +++ b/compiler/testData/ir/irText/stubs/javaStaticMethod.__J.fir.ir.txt @@ -1,6 +1,7 @@ CLASS IR_EXTERNAL_JAVA_DECLARATION_STUB CLASS name:J modality:OPEN visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.J CONSTRUCTOR IR_EXTERNAL_JAVA_DECLARATION_STUB visibility:public <> () returnType:.J [primary] + FUN IR_EXTERNAL_JAVA_DECLARATION_STUB name:bar visibility:public modality:OPEN <> () returnType:kotlin.Unit FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:.J, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] overridden: public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any