diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt index ca4885326db..5d56965aad5 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.kt @@ -29,7 +29,10 @@ import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoot import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoot import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots -import org.jetbrains.kotlin.codegen.* +import org.jetbrains.kotlin.codegen.ClassBuilderFactories +import org.jetbrains.kotlin.codegen.CompilationErrorHandler +import org.jetbrains.kotlin.codegen.GeneratedClassLoader +import org.jetbrains.kotlin.codegen.KotlinCodegenFacade import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationStateEventCallback import org.jetbrains.kotlin.config.CompilerConfiguration @@ -49,11 +52,11 @@ import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM import org.jetbrains.kotlin.util.PerformanceCounter import org.jetbrains.kotlin.utils.KotlinPaths import org.jetbrains.kotlin.utils.PathUtil +import org.jetbrains.kotlin.utils.newLinkedHashMapWithExpectedSize import java.io.File import java.lang.reflect.Constructor import java.lang.reflect.InvocationTargetException import java.net.URLClassLoader -import java.util.* import java.util.concurrent.TimeUnit import java.util.jar.Attributes @@ -98,8 +101,6 @@ object KotlinToJVMBytecodeCompiler { } fun compileModules(environment: KotlinCoreEnvironment, directory: File): Boolean { - val outputFiles = hashMapOf() - ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() val moduleVisibilityManager = ModuleVisibilityManager.SERVICE.getInstance(environment.project) @@ -123,8 +124,7 @@ object KotlinToJVMBytecodeCompiler { result.throwIfError() - val moduleConfigurations = ArrayList(chunk.size) - val generationStates = ArrayList(chunk.size) + val outputs = newLinkedHashMapWithExpectedSize(chunk.size) for (module in chunk) { ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() @@ -137,24 +137,18 @@ object KotlinToJVMBytecodeCompiler { put(JVMConfigurationKeys.OUTPUT_DIRECTORY, File(module.getOutputDirectory())) } - val generationState = generate(environment, moduleConfiguration, result, ktFiles, module) - - outputFiles.put(module, generationState.factory) - moduleConfigurations.add(moduleConfiguration) - generationStates.add(generationState) + outputs[module] = generate(environment, moduleConfiguration, result, ktFiles, module) } try { - for ((module, configuration) in chunk.zip(moduleConfigurations)) { + for ((module, state) in outputs) { ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() - writeOutput(configuration, outputFiles[module]!!, null) + writeOutput(state.configuration, state.factory, null) } return true } finally { - for (generationState in generationStates) { - generationState.destroy() - } + outputs.values.forEach(GenerationState::destroy) } } diff --git a/core/util.runtime/src/org/jetbrains/kotlin/utils/collections.kt b/core/util.runtime/src/org/jetbrains/kotlin/utils/collections.kt index 8677202b0e7..8a143164451 100644 --- a/core/util.runtime/src/org/jetbrains/kotlin/utils/collections.kt +++ b/core/util.runtime/src/org/jetbrains/kotlin/utils/collections.kt @@ -62,17 +62,20 @@ fun MutableCollection.addIfNotNull(t: T?) { if (t != null) add(t) } -fun newHashMapWithExpectedSize(expectedSize: Int): HashMap { - return HashMap(if (expectedSize < 3) 3 else expectedSize + expectedSize / 3 + 1) -} +fun newHashMapWithExpectedSize(expectedSize: Int): HashMap = + HashMap(capacity(expectedSize)) -fun newHashSetWithExpectedSize(expectedSize: Int): HashSet { - return HashSet(if (expectedSize < 3) 3 else expectedSize + expectedSize / 3 + 1) -} +fun newHashSetWithExpectedSize(expectedSize: Int): HashSet = + HashSet(capacity(expectedSize)) -fun newLinkedHashSetWithExpectedSize(expectedSize: Int): LinkedHashSet { - return LinkedHashSet(if (expectedSize < 3) 3 else expectedSize + expectedSize / 3 + 1) -} +fun newLinkedHashMapWithExpectedSize(expectedSize: Int): LinkedHashMap = + LinkedHashMap(capacity(expectedSize)) + +fun newLinkedHashSetWithExpectedSize(expectedSize: Int): LinkedHashSet = + LinkedHashSet(capacity(expectedSize)) + +private fun capacity(expectedSize: Int): Int = + if (expectedSize < 3) 3 else expectedSize + expectedSize / 3 + 1 fun Collection.toReadOnlyList(): List = when (size) {