diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java index 81858ba4467..86ac9fd755b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassFileFactory.java @@ -49,7 +49,7 @@ import org.jetbrains.kotlin.serialization.StringTableImpl; import org.jetbrains.org.objectweb.asm.Type; import java.io.File; -import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.util.*; import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.getMappingFileName; @@ -62,7 +62,7 @@ public class ClassFileFactory implements OutputFileCollection { private boolean isDone = false; private final Set sourceFiles = new HashSet<>(); - private final Map partsGroupedByPackage = new LinkedHashMap<>(); + private final PackagePartRegistry packagePartRegistry = new PackagePartRegistry(); public ClassFileFactory(@NotNull GenerationState state, @NotNull ClassBuilderFactory builderFactory) { this.state = state; @@ -73,6 +73,11 @@ public class ClassFileFactory implements OutputFileCollection { return state; } + @NotNull + public PackagePartRegistry getPackagePartRegistry() { + return packagePartRegistry; + } + @NotNull public ClassBuilder newVisitor( @NotNull JvmDeclarationOrigin origin, @@ -110,7 +115,7 @@ public class ClassFileFactory implements OutputFileCollection { JvmModuleProtoBuf.Module.Builder builder = JvmModuleProtoBuf.Module.newBuilder(); String outputFilePath = getMappingFileName(state.getModuleName()); - for (PackageParts part : ClassFileUtilsKt.addCompiledPartsAndSort(partsGroupedByPackage.values(), state)) { + for (PackageParts part : ClassFileUtilsKt.addCompiledPartsAndSort(packagePartRegistry.getParts().values(), state)) { part.addTo(builder); } @@ -133,12 +138,7 @@ public class ClassFileFactory implements OutputFileCollection { @Override public String asText(ClassBuilderFactory factory) { - try { - return new String(asBytes(factory), "UTF-8"); - } - catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } + return new String(asBytes(factory), StandardCharsets.UTF_8); } }); } @@ -239,22 +239,14 @@ public class ClassFileFactory implements OutputFileCollection { public PackageCodegen forPackage(@NotNull FqName fqName, @NotNull Collection files) { assert !isDone : "Already done!"; registerSourceFiles(files); - return state.getCodegenFactory().createPackageCodegen(state, files, fqName, buildNewPackagePartRegistry(fqName)); + return state.getCodegenFactory().createPackageCodegen(state, files, fqName); } @NotNull public MultifileClassCodegen forMultifileClass(@NotNull FqName facadeFqName, @NotNull Collection files) { assert !isDone : "Already done!"; registerSourceFiles(files); - return state.getCodegenFactory().createMultifileClassCodegen(state, files, facadeFqName, buildNewPackagePartRegistry(facadeFqName.parent())); - } - - private PackagePartRegistry buildNewPackagePartRegistry(@NotNull FqName packageFqName) { - String packageFqNameAsString = packageFqName.asString(); - return (partInternalName, facadeInternalName) -> { - PackageParts packageParts = partsGroupedByPackage.computeIfAbsent(packageFqNameAsString, PackageParts::new); - packageParts.addPart(partInternalName, facadeInternalName); - }; + return state.getCodegenFactory().createMultifileClassCodegen(state, files, facadeFqName); } private void registerSourceFiles(Collection files) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFactory.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFactory.kt index 423276f6843..92323cd9f4e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFactory.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/CodegenFactory.kt @@ -26,8 +26,10 @@ import org.jetbrains.kotlin.psi.KtFile interface CodegenFactory { fun generateModule(state: GenerationState, files: Collection, errorHandler: CompilationErrorHandler) - fun createPackageCodegen(state: GenerationState, files: Collection, fqName: FqName, registry: PackagePartRegistry): PackageCodegen - fun createMultifileClassCodegen(state: GenerationState, files: Collection, fqName: FqName, registry: PackagePartRegistry): MultifileClassCodegen + + fun createPackageCodegen(state: GenerationState, files: Collection, fqName: FqName): PackageCodegen + + fun createMultifileClassCodegen(state: GenerationState, files: Collection, fqName: FqName): MultifileClassCodegen companion object { fun doCheckCancelled(state: GenerationState) { @@ -69,11 +71,11 @@ object DefaultCodegenFactory : CodegenFactory { } } - override fun createPackageCodegen(state: GenerationState, files: Collection, fqName: FqName, registry: PackagePartRegistry) = - PackageCodegenImpl(state, files, fqName, registry) + override fun createPackageCodegen(state: GenerationState, files: Collection, fqName: FqName) = + PackageCodegenImpl(state, files, fqName) - override fun createMultifileClassCodegen(state: GenerationState, files: Collection, fqName: FqName, registry: PackagePartRegistry) = - MultifileClassCodegenImpl(state, files, fqName, registry) + override fun createMultifileClassCodegen(state: GenerationState, files: Collection, fqName: FqName) = + MultifileClassCodegenImpl(state, files, fqName) private fun generateMultifileClass( state: GenerationState, @@ -96,5 +98,4 @@ object DefaultCodegenFactory : CodegenFactory { val codegen = state.factory.forPackage(packageFqName, jetFiles) codegen.generate(errorHandler) } - -} \ No newline at end of file +} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt index 81fecc593a2..7d94958651b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MultifileClassCodegen.kt @@ -58,10 +58,9 @@ interface MultifileClassCodegen { } class MultifileClassCodegenImpl( - private val state: GenerationState, - private val files: Collection, - private val facadeFqName: FqName, - private val packagePartRegistry: PackagePartRegistry + private val state: GenerationState, + private val files: Collection, + private val facadeFqName: FqName ) : MultifileClassCodegen { private val facadeClassType = AsmUtil.asmTypeByFqNameWithoutInnerClasses(facadeFqName) @@ -214,7 +213,7 @@ class MultifileClassCodegenImpl( !file.hasDeclarationsForPartClass(state.bindingContext) ) return - packagePartRegistry.addPart(partType.internalName, facadeClassType.internalName) + state.factory.packagePartRegistry.addPart(packageFragment.fqName, partType.internalName, facadeClassType.internalName) val builder = state.factory.newVisitor(MultifileClassPart(file, packageFragment), partType, file) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java index 17d6a9eb30d..afcde024067 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackageCodegenImpl.java @@ -44,18 +44,15 @@ public class PackageCodegenImpl implements PackageCodegen { private final GenerationState state; private final Collection files; private final PackageFragmentDescriptor packageFragment; - private final PackagePartRegistry packagePartRegistry; public PackageCodegenImpl( @NotNull GenerationState state, @NotNull Collection files, - @NotNull FqName packageFqName, - @NotNull PackagePartRegistry registry + @NotNull FqName packageFqName ) { this.state = state; this.files = files; this.packageFragment = getOnlyPackageFragment(packageFqName); - packagePartRegistry = registry; } @Override @@ -120,7 +117,7 @@ public class PackageCodegenImpl implements PackageCodegen { if (!generatePackagePart || !state.getGenerateDeclaredClassFilter().shouldGeneratePackagePart(file)) return; - packagePartRegistry.addPart(fileClassType.getInternalName(), null); + state.getFactory().getPackagePartRegistry().addPart(packageFragment.getFqName(), fileClassType.getInternalName(), null); ClassBuilder builder = state.getFactory().newVisitor(JvmDeclarationOriginKt.PackagePart(file, packageFragment), fileClassType, file); diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartRegistry.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartRegistry.kt index 5cd23ad1299..00991eab74c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartRegistry.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PackagePartRegistry.kt @@ -16,6 +16,13 @@ package org.jetbrains.kotlin.codegen -interface PackagePartRegistry { - fun addPart(partInternalName: String, facadeInternalName: String?) +import org.jetbrains.kotlin.metadata.jvm.deserialization.PackageParts +import org.jetbrains.kotlin.name.FqName + +internal class PackagePartRegistry { + val parts = mutableMapOf() + + fun addPart(packageFqName: FqName, partInternalName: String, facadeInternalName: String?) { + parts.computeIfAbsent(packageFqName) { PackageParts(it.asString()) }.addPart(partInternalName, facadeInternalName) + } } 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 94ba5b35335..708d769ca4b 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 @@ -36,8 +36,8 @@ object JvmIrCodegenFactory : CodegenFactory { JvmBackendFacade.doGenerateFilesInternal(state, errorHandler, irModuleFragment, psi2irContext) } - override fun createPackageCodegen(state: GenerationState, files: Collection, fqName: FqName, registry: PackagePartRegistry): PackageCodegen { - val impl = PackageCodegenImpl(state, files, fqName, registry) + override fun createPackageCodegen(state: GenerationState, files: Collection, fqName: FqName): PackageCodegen { + val impl = PackageCodegenImpl(state, files, fqName) return object : PackageCodegen { override fun generate(errorHandler: CompilationErrorHandler) { @@ -54,7 +54,7 @@ object JvmIrCodegenFactory : CodegenFactory { } } - override fun createMultifileClassCodegen(state: GenerationState, files: Collection, fqName: FqName, registry: PackagePartRegistry): MultifileClassCodegen { + override fun createMultifileClassCodegen(state: GenerationState, files: Collection, fqName: FqName): MultifileClassCodegen { TODO() } -} \ No newline at end of file +}