diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index ed0ad426223..afd33567d9f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -232,7 +232,7 @@ class Fir2IrClassifierStorage( } else { regularClass.modality ?: Modality.FINAL } - val signature = signatureComposer.composeSignature(regularClass) + val signature = if (regularClass.isLocal) null else signatureComposer.composeSignature(regularClass) val irClass = regularClass.convertWithOffsets { startOffset, endOffset -> declareIrClass(signature) { symbol -> IrClassImpl( @@ -275,7 +275,7 @@ class Fir2IrClassifierStorage( ): IrClass { val origin = IrDeclarationOrigin.DEFINED val modality = Modality.FINAL - val signature = signatureComposer.composeSignature(anonymousObject) + val signature = null val result = anonymousObject.convertWithOffsets { startOffset, endOffset -> declareIrClass(signature) { symbol -> IrClassImpl( diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index 0f3de9b67d2..d1619a901aa 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -85,7 +85,9 @@ class Fir2IrConverter( irClass: IrClass = classifierStorage.getCachedIrClass(anonymousObject)!! ): IrClass { anonymousObject.getPrimaryConstructorIfAny()?.let { - irClass.declarations += declarationStorage.createIrConstructor(it, irClass) + irClass.declarations += declarationStorage.createIrConstructor( + it, irClass, isLocal = true + ) } for (declaration in sortBySynthetic(anonymousObject.declarations)) { if (declaration is FirRegularClass) { @@ -110,7 +112,9 @@ class Fir2IrConverter( irClass: IrClass = classifierStorage.getCachedIrClass(regularClass)!! ): IrClass { regularClass.getPrimaryConstructorIfAny()?.let { - irClass.declarations += declarationStorage.createIrConstructor(it, irClass) + irClass.declarations += declarationStorage.createIrConstructor( + it, irClass, isLocal = regularClass.isLocal + ) } for (declaration in sortBySynthetic(regularClass.declarations)) { val irDeclaration = processMemberDeclaration(declaration, regularClass, irClass) ?: continue @@ -143,15 +147,21 @@ class Fir2IrConverter( containingClass: FirClass<*>?, parent: IrDeclarationParent ): IrDeclaration? { + val isLocal = containingClass != null && + (containingClass !is FirRegularClass || containingClass.isLocal) return when (declaration) { is FirRegularClass -> { processClassMembers(declaration) } is FirSimpleFunction -> { - declarationStorage.createIrFunction(declaration, parent) + declarationStorage.createIrFunction( + declaration, parent, isLocal = isLocal + ) } is FirProperty -> { - declarationStorage.createIrProperty(declaration, parent) + declarationStorage.createIrProperty( + declaration, parent, isLocal = isLocal + ) } is FirField -> { if (declaration.isSynthetic) { @@ -161,7 +171,9 @@ class Fir2IrConverter( } } is FirConstructor -> if (!declaration.isPrimary) { - declarationStorage.createIrConstructor(declaration, parent as IrClass) + declarationStorage.createIrConstructor( + declaration, parent as IrClass, isLocal = isLocal + ) } else { null } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index e5ef66526cf..507f6691a15 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -367,7 +367,8 @@ class Fir2IrDeclarationStorage( function: FirFunction<*>, irParent: IrDeclarationParent?, thisReceiverOwner: IrClass? = irParent as? IrClass, - origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED + origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED, + isLocal: Boolean = false ): IrSimpleFunction { val simpleFunction = function as? FirSimpleFunction val isLambda = function.source?.elementType == KtNodeTypes.FUNCTION_LITERAL @@ -384,7 +385,7 @@ class Fir2IrDeclarationStorage( val isSuspend = if (isLambda) ((function as FirAnonymousFunction).typeRef as? FirResolvedTypeRef)?.isSuspend == true else simpleFunction?.isSuspend == true - val signature = signatureComposer.composeSignature(function) + val signature = if (isLocal) null else signatureComposer.composeSignature(function) val created = function.convertWithOffsets { startOffset, endOffset -> val result = declareIrSimpleFunction(signature, simpleFunction?.containerSource) { symbol -> IrFunctionImpl( @@ -455,11 +456,12 @@ class Fir2IrDeclarationStorage( fun createIrConstructor( constructor: FirConstructor, irParent: IrClass, - origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED + origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED, + isLocal: Boolean = false ): IrConstructor { val isPrimary = constructor.isPrimary classifierStorage.preCacheTypeParameters(constructor) - val signature = signatureComposer.composeSignature(constructor) + val signature = if (isLocal) null else signatureComposer.composeSignature(constructor) val created = constructor.convertWithOffsets { startOffset, endOffset -> declareIrConstructor(signature) { symbol -> IrConstructorImpl( @@ -504,10 +506,11 @@ class Fir2IrDeclarationStorage( isSetter: Boolean, origin: IrDeclarationOrigin, startOffset: Int, - endOffset: Int + endOffset: Int, + isLocal: Boolean = false ): IrSimpleFunction { val prefix = if (isSetter) "set" else "get" - val signature = signatureComposer.composeAccessorSignature(property, isSetter) + val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter) return declareIrAccessor( signature, (correspondingProperty.descriptor as? WrappedPropertyDescriptorWithContainerSource)?.containerSource, @@ -617,10 +620,11 @@ class Fir2IrDeclarationStorage( property: FirProperty, irParent: IrDeclarationParent?, thisReceiverOwner: IrClass? = irParent as? IrClass, - origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED + origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED, + isLocal: Boolean = false ): IrProperty { classifierStorage.preCacheTypeParameters(property) - val signature = signatureComposer.composeSignature(property) + val signature = if (isLocal) null else signatureComposer.composeSignature(property) return property.convertWithOffsets { startOffset, endOffset -> val result = declareIrProperty(signature, property.containerSource) { symbol -> IrPropertyImpl( @@ -680,7 +684,7 @@ class Fir2IrDeclarationStorage( getter is FirDefaultPropertyGetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR else -> origin }, - startOffset, endOffset + startOffset, endOffset, isLocal ) if (property.isVar) { this.setter = createIrPropertyAccessor( @@ -690,7 +694,7 @@ class Fir2IrDeclarationStorage( setter is FirDefaultPropertySetter -> IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR else -> origin }, - startOffset, endOffset + startOffset, endOffset, isLocal ) } leaveScope(this) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 294381f5271..59bdf99a1d2 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -222,7 +222,7 @@ class Fir2IrVisitor( override fun visitSimpleFunction(simpleFunction: FirSimpleFunction, data: Any?): IrElement { val irFunction = if (simpleFunction.visibility == Visibilities.LOCAL) { declarationStorage.createIrFunction( - simpleFunction, irParent = conversionScope.parent() + simpleFunction, irParent = conversionScope.parent(), isLocal = true ) } else { declarationStorage.getCachedIrFunction(simpleFunction)!! @@ -237,7 +237,7 @@ class Fir2IrVisitor( override fun visitAnonymousFunction(anonymousFunction: FirAnonymousFunction, data: Any?): IrElement { return anonymousFunction.convertWithOffsets { startOffset, endOffset -> val irFunction = declarationStorage.createIrFunction( - anonymousFunction, irParent = conversionScope.parent() + anonymousFunction, irParent = conversionScope.parent(), isLocal = true ) conversionScope.withFunction(irFunction) { memberGenerator.convertFunctionContent(irFunction, anonymousFunction, containingClass = null) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt index 53f7a84503f..3ec4165036f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt @@ -243,7 +243,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) { ) } } - val signature = components.signatureComposer.composeSignature(firFunction) + val signature = if (classId.isLocal) null else components.signatureComposer.composeSignature(firFunction) return components.declarationStorage.declareIrSimpleFunction(signature, null) { symbol -> IrFunctionImpl( UNDEFINED_OFFSET, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index 96578e005b6..1d7b13f145d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -67,6 +67,7 @@ class FakeOverrideGenerator( for (name in superTypesCallableNames) { if (name in processedCallableNames) continue processedCallableNames += name + val isLocal = klass !is FirRegularClass || klass.isLocal useSiteMemberScope.processFunctionsByName(name) { functionSymbol -> if (functionSymbol is FirNamedFunctionSymbol) { val originalFunction = functionSymbol.fir @@ -91,7 +92,8 @@ class FakeOverrideGenerator( originalFunction, irParent = this, thisReceiverOwner = declarationStorage.findIrParent(baseSymbol.fir) as? IrClass, - origin = origin + origin = origin, + isLocal = isLocal ) // In fake overrides, parent logic is a bit specific, because // parent of *original* function (base class) is used for dispatch receiver, @@ -115,7 +117,8 @@ class FakeOverrideGenerator( fakeOverrideFunction, irParent = this, thisReceiverOwner = declarationStorage.findIrParent(originalFunction) as? IrClass, - origin = origin + origin = origin, + isLocal = isLocal ) if (irFunction.returnType.containsErrorType() || irFunction.valueParameters.any { it.type.containsErrorType() }) { return@processFunctionsByName @@ -142,7 +145,8 @@ class FakeOverrideGenerator( ?: declarationStorage.createIrProperty( originalProperty, irParent = this, thisReceiverOwner = declarationStorage.findIrParent(baseSymbol.fir) as? IrClass, - origin = origin + origin = origin, + isLocal = isLocal ) irProperty.parent = this result += irProperty.withProperty { @@ -162,7 +166,8 @@ class FakeOverrideGenerator( val irProperty = declarationStorage.createIrProperty( fakeOverrideProperty, irParent = this, thisReceiverOwner = declarationStorage.findIrParent(originalProperty) as? IrClass, - origin = origin + origin = origin, + isLocal = isLocal ) if (irProperty.backingField?.type?.containsErrorType() == true || irProperty.getter?.returnType?.containsErrorType() == true diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt index ffbff4bca81..0c094fce9e2 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt @@ -63,30 +63,26 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu override fun composeSignature(declaration: FirDeclaration): IdSignature? { if (declaration is FirAnonymousObject || declaration is FirAnonymousFunction) return null - if (declaration is FirMemberDeclaration && declaration.effectiveVisibility == FirEffectiveVisibilityImpl.Local) { - return null - } val builder = SignatureBuilder() declaration.accept(builder) - return when { - declaration is FirRegularClass && declaration.visibility != Visibilities.LOCAL -> { + return when (declaration) { + is FirRegularClass -> { // TODO: private classes are probably not acceptable here too val classId = declaration.classId IdSignature.PublicSignature( classId.packageFqName.asString(), classId.relativeClassName.asString(), builder.hashId, builder.mask ) } - declaration is FirTypeAlias -> { + is FirTypeAlias -> { if (declaration.visibility == Visibilities.PRIVATE) return null val classId = declaration.symbol.classId IdSignature.PublicSignature( classId.packageFqName.asString(), classId.relativeClassName.asString(), builder.hashId, builder.mask ) } - declaration is FirCallableMemberDeclaration<*> -> { + is FirCallableMemberDeclaration<*> -> { if (declaration.visibility == Visibilities.PRIVATE) return null val callableId = declaration.symbol.callableId - if (callableId.classId?.isLocal == true) return null IdSignature.PublicSignature( callableId.packageName.asString(), callableId.relativeCallableName.asString(), builder.hashId, builder.mask )