Move IC-related initialization logic to GenerationState

To further reduce number of parameters of GenerationState's constructor
This commit is contained in:
Alexander Udalov
2016-05-20 17:41:51 +03:00
parent 29c5e655ab
commit cf19166eca
3 changed files with 33 additions and 43 deletions
@@ -33,7 +33,7 @@ fun List<PackageParts>.addCompiledPartsAndSort(state: GenerationState): List<Pac
addCompiledParts(state).sortedBy { it.packageFqName } addCompiledParts(state).sortedBy { it.packageFqName }
private fun List<PackageParts>.addCompiledParts(state: GenerationState): List<PackageParts> { private fun List<PackageParts>.addCompiledParts(state: GenerationState): List<PackageParts> {
val incrementalCache = state.getIncrementalCacheForThisTarget() ?: return this val incrementalCache = state.incrementalCacheForThisTarget ?: return this
val moduleMappingData = incrementalCache.getModuleMappingData() ?: return this val moduleMappingData = incrementalCache.getModuleMappingData() ?: return this
val mapping = ModuleMapping.create(moduleMappingData) val mapping = ModuleMapping.create(moduleMappingData)
@@ -45,6 +45,7 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import java.io.File import java.io.File
class GenerationState @JvmOverloads constructor( class GenerationState @JvmOverloads constructor(
@@ -55,9 +56,7 @@ class GenerationState @JvmOverloads constructor(
val files: List<KtFile>, val files: List<KtFile>,
val configuration: CompilerConfiguration, val configuration: CompilerConfiguration,
val generateDeclaredClassFilter: GenerateClassFilter = GenerationState.GenerateClassFilter.GENERATE_ALL, val generateDeclaredClassFilter: GenerateClassFilter = GenerationState.GenerateClassFilter.GENERATE_ALL,
val packagesWithObsoleteParts: Collection<FqName> = emptySet(), // For incremental compilation
val obsoleteMultifileClasses: Collection<FqName> = emptySet(),
// for PackageCodegen in incremental compilation mode
val targetId: TargetId? = null, val targetId: TargetId? = null,
moduleName: String? = configuration.get(JVMConfigurationKeys.MODULE_NAME), moduleName: String? = configuration.get(JVMConfigurationKeys.MODULE_NAME),
// 'outDirectory' is a hack to correctly determine if a compiled class is from the same module as the callee during // 'outDirectory' is a hack to correctly determine if a compiled class is from the same module as the callee during
@@ -88,10 +87,28 @@ class GenerationState @JvmOverloads constructor(
val fileClassesProvider: CodegenFileClassesProvider = CodegenFileClassesProvider() val fileClassesProvider: CodegenFileClassesProvider = CodegenFileClassesProvider()
val inlineCache: InlineCache = InlineCache() val inlineCache: InlineCache = InlineCache()
fun getIncrementalCacheForThisTarget(): IncrementalCache? = val incrementalCacheForThisTarget: IncrementalCache?
configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS)?.let { components -> val packagesWithObsoleteParts: Set<FqName>
targetId?.let { components.getIncrementalCache(it) } val obsoleteMultifileClasses: List<FqName>
init {
val icComponents = configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS)
if (icComponents != null) {
incrementalCacheForThisTarget =
icComponents.getIncrementalCache(targetId ?: error("Target ID should be specified for incremental compilation"))
packagesWithObsoleteParts = incrementalCacheForThisTarget.getObsoletePackageParts().map {
JvmClassName.byInternalName(it).packageFqName
}.toSet()
obsoleteMultifileClasses = incrementalCacheForThisTarget.getObsoleteMultifileClasses().map {
JvmClassName.byInternalName(it).fqNameForClassNameWithoutDollars
} }
}
else {
incrementalCacheForThisTarget = null
packagesWithObsoleteParts = emptySet()
obsoleteMultifileClasses = emptyList()
}
}
val extraJvmDiagnosticsTrace: BindingTrace = DelegatingBindingTrace(bindingContext, false, "For extra diagnostics in ${this.javaClass}") val extraJvmDiagnosticsTrace: BindingTrace = DelegatingBindingTrace(bindingContext, false, "For extra diagnostics in ${this.javaClass}")
private val interceptedBuilderFactory: ClassBuilderFactory private val interceptedBuilderFactory: ClassBuilderFactory
@@ -108,7 +125,7 @@ class GenerationState @JvmOverloads constructor(
val bindingTrace: BindingTrace = DelegatingBindingTrace(bindingContext, "trace in GenerationState") val bindingTrace: BindingTrace = DelegatingBindingTrace(bindingContext, "trace in GenerationState")
val bindingContext: BindingContext = bindingTrace.bindingContext val bindingContext: BindingContext = bindingTrace.bindingContext
val typeMapper: KotlinTypeMapper = KotlinTypeMapper( val typeMapper: KotlinTypeMapper = KotlinTypeMapper(
this.bindingContext, classBuilderMode, fileClassesProvider, getIncrementalCacheForThisTarget(), this.bindingContext, classBuilderMode, fileClassesProvider, incrementalCacheForThisTarget,
IncompatibleClassTrackerImpl(extraJvmDiagnosticsTrace), this.moduleName IncompatibleClassTrackerImpl(extraJvmDiagnosticsTrace), this.moduleName
) )
val intrinsics: IntrinsicMethods = IntrinsicMethods() val intrinsics: IntrinsicMethods = IntrinsicMethods()
@@ -143,9 +160,8 @@ class GenerationState @JvmOverloads constructor(
.wrapWith( .wrapWith(
{ OptimizationClassBuilderFactory(it, configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false)) }, { OptimizationClassBuilderFactory(it, configuration.get(JVMConfigurationKeys.DISABLE_OPTIMIZATION, false)) },
{ BuilderFactoryForDuplicateSignatureDiagnostics( { BuilderFactoryForDuplicateSignatureDiagnostics(
it, this.bindingContext, diagnostics, fileClassesProvider, it, this.bindingContext, diagnostics, fileClassesProvider, incrementalCacheForThisTarget, this.moduleName
getIncrementalCacheForThisTarget(), ).apply { duplicateSignatureFactory = this } },
this.moduleName).apply { duplicateSignatureFactory = this } },
{ BuilderFactoryForDuplicateClassNameDiagnostics(it, diagnostics) }, { BuilderFactoryForDuplicateClassNameDiagnostics(it, diagnostics) },
{ configuration.get(JVMConfigurationKeys.DECLARATIONS_JSON_PATH) { configuration.get(JVMConfigurationKeys.DECLARATIONS_JSON_PATH)
?.let { destination -> SignatureDumpingBuilderFactory(it, File(destination)) } ?: it } ?.let { destination -> SignatureDumpingBuilderFactory(it, File(destination)) } ?: it }
@@ -47,7 +47,6 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.name.isSubpackageOf import org.jetbrains.kotlin.name.isSubpackageOf
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.util.PerformanceCounter import org.jetbrains.kotlin.util.PerformanceCounter
import org.jetbrains.kotlin.utils.KotlinPaths import org.jetbrains.kotlin.utils.KotlinPaths
@@ -139,13 +138,11 @@ object KotlinToJVMBytecodeCompiler {
val ktFiles = CompileEnvironmentUtil.getKtFiles( val ktFiles = CompileEnvironmentUtil.getKtFiles(
environment.project, getAbsolutePaths(directory, module), configuration) { s -> throw IllegalStateException("Should have been checked before: " + s) } environment.project, getAbsolutePaths(directory, module), configuration) { s -> throw IllegalStateException("Should have been checked before: " + s) }
if (!checkKotlinPackageUsage(environment, ktFiles)) return false if (!checkKotlinPackageUsage(environment, ktFiles)) return false
val moduleOutputDirectory = File(module.getOutputDirectory())
val onIndependentPartCompilationEnd = val onIndependentPartCompilationEnd =
createOutputFilesFlushingCallbackIfPossible(configuration, File(module.getOutputDirectory()), jarPath) createOutputFilesFlushingCallbackIfPossible(configuration, File(module.getOutputDirectory()), jarPath)
val generationState = generate(environment, result, ktFiles, module, moduleOutputDirectory, val generationState = generate(environment, result, ktFiles, module, onIndependentPartCompilationEnd)
module.getModuleName(), onIndependentPartCompilationEnd)
outputFiles.put(module, generationState.factory) outputFiles.put(module, generationState.factory)
generationStates.add(generationState) generationStates.add(generationState)
@@ -311,7 +308,7 @@ object KotlinToJVMBytecodeCompiler {
result.throwIfError() result.throwIfError()
return generate(environment, result, environment.getSourceFiles(), null, null, null, onIndependentPartCompilationEnd) return generate(environment, result, environment.getSourceFiles(), null, onIndependentPartCompilationEnd)
} }
private fun analyze(environment: KotlinCoreEnvironment, targetDescription: String?): AnalysisResult? { private fun analyze(environment: KotlinCoreEnvironment, targetDescription: String?): AnalysisResult? {
@@ -368,42 +365,19 @@ object KotlinToJVMBytecodeCompiler {
result: AnalysisResult, result: AnalysisResult,
sourceFiles: List<KtFile>, sourceFiles: List<KtFile>,
module: Module?, module: Module?,
outputDirectory: File?,
moduleName: String?,
onIndependentPartCompilationEnd: GenerationStateEventCallback onIndependentPartCompilationEnd: GenerationStateEventCallback
): GenerationState { ): GenerationState {
val configuration = environment.configuration
val incrementalCompilationComponents = configuration.get(JVMConfigurationKeys.INCREMENTAL_COMPILATION_COMPONENTS)
val packagesWithObsoleteParts = hashSetOf<FqName>()
val obsoleteMultifileClasses = arrayListOf<FqName>()
var targetId: TargetId? = null
if (module != null && incrementalCompilationComponents != null) {
targetId = TargetId(module)
val incrementalCache = incrementalCompilationComponents.getIncrementalCache(targetId)
for (internalName in incrementalCache.getObsoletePackageParts()) {
packagesWithObsoleteParts.add(JvmClassName.byInternalName(internalName).packageFqName)
}
for (obsoleteFacadeInternalName in incrementalCache.getObsoleteMultifileClasses()) {
obsoleteMultifileClasses.add(JvmClassName.byInternalName(obsoleteFacadeInternalName).fqNameForClassNameWithoutDollars)
}
}
val generationState = GenerationState( val generationState = GenerationState(
environment.project, environment.project,
ClassBuilderFactories.BINARIES, ClassBuilderFactories.BINARIES,
result.moduleDescriptor, result.moduleDescriptor,
result.bindingContext, result.bindingContext,
sourceFiles, sourceFiles,
configuration, environment.configuration,
GenerationState.GenerateClassFilter.GENERATE_ALL, GenerationState.GenerateClassFilter.GENERATE_ALL,
packagesWithObsoleteParts, module?.let(::TargetId),
obsoleteMultifileClasses, module?.let { it.getModuleName() },
targetId, module?.let { File(it.getOutputDirectory()) },
moduleName,
outputDirectory,
onIndependentPartCompilationEnd onIndependentPartCompilationEnd
) )
ProgressIndicatorAndCompilationCanceledStatus.checkCanceled() ProgressIndicatorAndCompilationCanceledStatus.checkCanceled()