Move IC-related initialization logic to GenerationState
To further reduce number of parameters of GenerationState's constructor
This commit is contained in:
@@ -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 }
|
||||||
|
|||||||
+6
-32
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user