diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt index d77dd556fa1..b3c87e01859 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendContext.kt @@ -23,7 +23,6 @@ import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor -import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns @@ -87,6 +86,10 @@ class JvmBackendContext( internal val localDelegatedProperties = mutableMapOf>() + // If the JVM fqname of a class differs from what is implied by its parent, e.g. if it's a file class + // annotated with @JvmPackageName, the correct name is recorded here. + internal lateinit var classNameOverride: MutableMap + internal val multifileFacadesToAdd = mutableMapOf>() internal val multifileFacadeForPart = mutableMapOf() internal val multifileFacadeMemberToPartMember = mutableMapOf() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt index 5127de29f92..7f1deeee34f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmBackendFacade.kt @@ -24,7 +24,7 @@ import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator import org.jetbrains.kotlin.psi2ir.PsiSourceManager -import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext +import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource import org.jetbrains.kotlin.utils.addToStdlib.safeAs @@ -35,22 +35,12 @@ object JvmBackendFacade { errorHandler: CompilationErrorHandler, phaseConfig: PhaseConfig ) { - val psi2ir = Psi2IrTranslator(state.languageVersionSettings, facadeClassGenerator = ::facadeClassGenerator) + val facadeGenerator = FacadeClassGenerator() + val psi2ir = Psi2IrTranslator(state.languageVersionSettings, facadeClassGenerator = facadeGenerator::generate) val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, extensions = JvmGeneratorExtensions) val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files) - - doGenerateFilesInternal(state, errorHandler, irModuleFragment, psi2irContext, phaseConfig) - } - - internal fun doGenerateFilesInternal( - state: GenerationState, - errorHandler: CompilationErrorHandler, - irModuleFragment: IrModuleFragment, - psi2irContext: GeneratorContext, - phaseConfig: PhaseConfig - ) { doGenerateFilesInternal( - state, errorHandler, irModuleFragment, psi2irContext.symbolTable, psi2irContext.sourceManager, phaseConfig + state, errorHandler, irModuleFragment, psi2irContext.symbolTable, psi2irContext.sourceManager, phaseConfig, facadeGenerator ) } @@ -60,7 +50,8 @@ object JvmBackendFacade { irModuleFragment: IrModuleFragment, symbolTable: SymbolTable, sourceManager: PsiSourceManager, - phaseConfig: PhaseConfig + phaseConfig: PhaseConfig, + facadeGenerator: FacadeClassGenerator = FacadeClassGenerator() ) { val context = JvmBackendContext( state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig @@ -77,8 +68,9 @@ object JvmBackendFacade { symbolTable, irModuleFragment.irBuiltins, JvmGeneratorExtensions.externalDeclarationOrigin, - facadeClassGenerator = ::facadeClassGenerator + facadeClassGenerator = facadeGenerator::generate ).generateUnboundSymbolsAsDependencies() + context.classNameOverride = facadeGenerator.classNameOverride for (irFile in irModuleFragment.files) { for (extension in IrGenerationExtension.getInstances(context.state.project)) { @@ -116,14 +108,19 @@ object JvmBackendFacade { } } - internal fun facadeClassGenerator(source: DeserializedContainerSource): IrClass? { - val jvmPackagePartSource = source.safeAs() ?: return null - val facadeName = jvmPackagePartSource.facadeClassName ?: jvmPackagePartSource.className - return buildClass { - origin = IrDeclarationOrigin.FILE_CLASS - name = facadeName.fqNameForTopLevelClassMaybeWithDollars.shortName() - }.also { - it.createParameterDeclarations() + internal class FacadeClassGenerator { + val classNameOverride = mutableMapOf() + + fun generate(source: DeserializedContainerSource): IrClass? { + val jvmPackagePartSource = source.safeAs() ?: return null + val facadeName = jvmPackagePartSource.facadeClassName ?: jvmPackagePartSource.className + return buildClass { + origin = IrDeclarationOrigin.FILE_CLASS + name = facadeName.fqNameForTopLevelClassMaybeWithDollars.shortName() + }.also { + it.createParameterDeclarations() + classNameOverride[it] = facadeName + } } } } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt index 15d3437898d..5f51a3e1b18 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt @@ -24,16 +24,12 @@ import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator import org.jetbrains.kotlin.psi2ir.PsiSourceManager class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory { override fun generateModule(state: GenerationState, files: Collection, errorHandler: CompilationErrorHandler) { - val psi2ir = Psi2IrTranslator(state.languageVersionSettings, facadeClassGenerator = JvmBackendFacade::facadeClassGenerator) - val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, extensions = JvmGeneratorExtensions) - val irModuleFragment = psi2ir.generateModuleFragment(psi2irContext, files) - JvmBackendFacade.doGenerateFilesInternal(state, errorHandler, irModuleFragment, psi2irContext, phaseConfig) + JvmBackendFacade.doGenerateFiles(files, state, errorHandler, phaseConfig) } fun generateModuleInFrontendIRMode( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt index 371ba60d0fa..d5a04370e0a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrTypeMapper.kt @@ -51,6 +51,7 @@ class IrTypeMapper(private val context: JvmBackendContext) : KotlinTypeMapperBas fun classInternalName(irClass: IrClass): String { context.getLocalClassInfo(irClass)?.internalName?.let { return it } + context.classNameOverride[irClass]?.let { return it.internalName } val className = SpecialNames.safeIdentifier(irClass.name).identifier val internalName = when (val parent = irClass.parent) { is IrPackageFragment -> { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt index b96f83fb913..4b9c556cdc9 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt @@ -112,6 +112,7 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa if (fileClassInfo.withJvmMultifileClass) AsmUtil.asmTypeByFqNameWithoutInnerClasses(fileClassInfo.facadeClassFqName) else null context.state.factory.packagePartRegistry.addPart(irFile.fqName, partClassType.internalName, facadeClassType?.internalName) + context.classNameOverride[this] = JvmClassName.byInternalName(partClassType.internalName) if (facadeClassType != null) { val jvmClassName = JvmClassName.byInternalName(facadeClassType.internalName) diff --git a/compiler/testData/codegen/boxInline/jvmPackageName/simple.kt b/compiler/testData/codegen/boxInline/jvmPackageName/simple.kt index b0809744dde..f4e2d6ab848 100644 --- a/compiler/testData/codegen/boxInline/jvmPackageName/simple.kt +++ b/compiler/testData/codegen/boxInline/jvmPackageName/simple.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JVM_IR -// IGNORE_BACKEND_MULTI_MODULE: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME // FILE: 1.kt diff --git a/compiler/testData/compileKotlinAgainstKotlin/jvmPackageName.kt b/compiler/testData/compileKotlinAgainstKotlin/jvmPackageName.kt index 04d3640f8a8..8cc09416ed6 100644 --- a/compiler/testData/compileKotlinAgainstKotlin/jvmPackageName.kt +++ b/compiler/testData/compileKotlinAgainstKotlin/jvmPackageName.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // FILE: A.kt diff --git a/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameInRootPackage.kt b/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameInRootPackage.kt index 84aed08ff9f..7cf60d73870 100644 --- a/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameInRootPackage.kt +++ b/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameInRootPackage.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // FILE: A.kt diff --git a/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameMultifileClass.kt b/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameMultifileClass.kt index ef4e1b36d98..fc80cf8849d 100644 --- a/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameMultifileClass.kt +++ b/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameMultifileClass.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // WITH_RUNTIME diff --git a/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameWithJvmName.kt b/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameWithJvmName.kt index bb3c67541f3..29bcde0e05b 100644 --- a/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameWithJvmName.kt +++ b/compiler/testData/compileKotlinAgainstKotlin/jvmPackageNameWithJvmName.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR // TARGET_BACKEND: JVM // FILE: A.kt