diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java index 3d964c88537..7cb86b43fd8 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/KotlinToJVMBytecodeCompiler.java @@ -55,6 +55,7 @@ import org.jetbrains.jet.lang.resolve.BindingTraceContext; import org.jetbrains.jet.lang.resolve.ScriptNameUtil; import org.jetbrains.jet.lang.resolve.java.AnalyzerFacadeForJVM; import org.jetbrains.jet.lang.resolve.java.PackageClassUtils; +import org.jetbrains.jet.lang.resolve.kotlin.incremental.IncrementalCache; import org.jetbrains.jet.lang.resolve.kotlin.incremental.IncrementalCacheProvider; import org.jetbrains.jet.lang.resolve.kotlin.incremental.IncrementalPackage; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -291,6 +292,24 @@ public class KotlinToJVMBytecodeCompiler { CliLightClassGenerationSupport support = CliLightClassGenerationSupport.getInstanceForCli(environment.getProject()); BindingTrace sharedTrace = support.getTrace(); ModuleDescriptorImpl sharedModule = support.getModule(); + + IncrementalCacheProvider incrementalCacheProvider = IncrementalCacheProvider.object$.getInstance(); + File incrementalCacheBaseDir = environment.getConfiguration().get(JVMConfigurationKeys.INCREMENTAL_CACHE_BASE_DIR); + final IncrementalCache incrementalCache; + if (incrementalCacheProvider != null && incrementalCacheBaseDir != null) { + incrementalCache = incrementalCacheProvider.getIncrementalCache(incrementalCacheBaseDir); + Disposer.register(environment.getApplication(), new Disposable() { + @Override + public void dispose() { + incrementalCache.close(); + } + }); + } + else { + incrementalCache = null; + } + + return AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( environment.getProject(), environment.getSourceFiles(), @@ -298,7 +317,7 @@ public class KotlinToJVMBytecodeCompiler { Predicates.alwaysTrue(), sharedModule, environment.getConfiguration().get(JVMConfigurationKeys.MODULE_IDS), - environment.getConfiguration().get(JVMConfigurationKeys.INCREMENTAL_CACHE_BASE_DIR) + incrementalCache ); } } @@ -328,11 +347,20 @@ public class KotlinToJVMBytecodeCompiler { File incrementalCacheDir = configuration.get(JVMConfigurationKeys.INCREMENTAL_CACHE_BASE_DIR); IncrementalCacheProvider incrementalCacheProvider = IncrementalCacheProvider.object$.getInstance(); - Collection packagesWithRemovedFiles = - incrementalCacheDir == null || moduleId == null || incrementalCacheProvider == null - ? null - : IncrementalPackage.getPackagesWithRemovedFiles( - incrementalCacheProvider.getIncrementalCache(incrementalCacheDir), moduleId, environment.getSourceFiles()); + Collection packagesWithRemovedFiles; + if (incrementalCacheDir == null || moduleId == null || incrementalCacheProvider == null) { + packagesWithRemovedFiles = null; + } + else { + IncrementalCache incrementalCache = incrementalCacheProvider.getIncrementalCache(incrementalCacheDir); + try { + packagesWithRemovedFiles = IncrementalPackage.getPackagesWithRemovedFiles( + incrementalCache, moduleId, environment.getSourceFiles()); + } + finally { + incrementalCache.close(); + } + } BindingTraceContext diagnosticHolder = new BindingTraceContext(); GenerationState generationState = new GenerationState( environment.getProject(), diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java index 27fac76c454..486944cd4b6 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java @@ -147,7 +147,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade { Predicate filesToAnalyzeCompletely, ModuleDescriptorImpl module, List moduleIds, - File incrementalCacheDir + IncrementalCache incrementalCache ) { GlobalContext globalContext = ContextPackage.GlobalContext(); TopDownAnalysisParameters topDownAnalysisParameters = TopDownAnalysisParameters.create( @@ -162,9 +162,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade { try { module.addFragmentProvider(DependencyKind.BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider()); - IncrementalCacheProvider incrementalCacheProvider = IncrementalCacheProvider.object$.getInstance(); - if (incrementalCacheDir != null && moduleIds != null && incrementalCacheProvider != null) { - IncrementalCache incrementalCache = incrementalCacheProvider.getIncrementalCache(incrementalCacheDir); + if (incrementalCache != null && moduleIds != null) { for (String moduleId : moduleIds) { module.addFragmentProvider( DependencyKind.SOURCES, diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCache.kt b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCache.kt index e3d559958f5..89c384ba6f9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCache.kt +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCache.kt @@ -26,6 +26,8 @@ public trait IncrementalCache { public fun getRemovedPackageParts(moduleId: String, compiledSourceFilesToFqName: Map): Collection public fun getPackageData(moduleId: String, fqName: String): ByteArray? + + public fun close() } public fun IncrementalCache.getPackagesWithRemovedFiles(moduleId: String, compiledSourceFiles: Collection): Collection { diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCacheProvider.kt b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCacheProvider.kt index 0886ae72eb4..d59793f4449 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCacheProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalCacheProvider.kt @@ -20,6 +20,7 @@ import java.io.File import java.util.ServiceLoader public trait IncrementalCacheProvider { + // IncrementalCache should be always closed after using public fun getIncrementalCache(baseDir: File): IncrementalCache public class object { diff --git a/jps-plugin/src/org/jetbrains/jet/jps/incremental/IncrementalCacheImpl.kt b/jps-plugin/src/org/jetbrains/jet/jps/incremental/IncrementalCacheImpl.kt index 60868dbe1f8..23310decd01 100644 --- a/jps-plugin/src/org/jetbrains/jet/jps/incremental/IncrementalCacheImpl.kt +++ b/jps-plugin/src/org/jetbrains/jet/jps/incremental/IncrementalCacheImpl.kt @@ -110,7 +110,7 @@ public class IncrementalCacheImpl(val baseDir: File): IncrementalCache { return protoMap[moduleId, JvmClassName.byFqNameWithoutInnerClasses(PackageClassUtils.getPackageClassFqName(FqName(fqName)))] } - public fun close() { + public override fun close() { protoMap.close() constantsMap.close() inlineFunctionsMap.close()