PlatformConfigurator: create container for each platform (it contains static services, mostly checkers) ahead of time

This commit is contained in:
Pavel V. Talanov
2016-09-22 16:37:30 +03:00
parent be00a6ec49
commit 32daf048c2
10 changed files with 62 additions and 53 deletions
@@ -41,7 +41,7 @@ fun StorageComponentContainer.configureModule(
useInstance(platform)
platform.platformConfigurator.configure(this)
platform.platformConfigurator.configureModuleComponents(this)
for (extension in StorageComponentContainerContributor.getInstances(moduleContext.project)) {
extension.addDeclarations(this, platform)
@@ -67,7 +67,7 @@ fun createContainerForBodyResolve(
platform: TargetPlatform,
statementFilter: StatementFilter,
languageVersionSettings: LanguageVersionSettings
): StorageComponentContainer = createContainer("BodyResolve") {
): StorageComponentContainer = createContainer("BodyResolve", platform) {
configureModule(moduleContext, platform, bindingTrace)
useInstance(statementFilter)
@@ -86,7 +86,7 @@ fun createContainerForLazyBodyResolve(
platform: TargetPlatform,
bodyResolveCache: BodyResolveCache,
languageVersionSettings: LanguageVersionSettings
): StorageComponentContainer = createContainer("LazyBodyResolve") {
): StorageComponentContainer = createContainer("LazyBodyResolve", platform) {
configureModule(moduleContext, platform, bindingTrace)
useInstance(LookupTracker.DO_NOTHING)
@@ -105,7 +105,7 @@ fun createContainerForLazyLocalClassifierAnalyzer(
lookupTracker: LookupTracker,
languageVersionSettings: LanguageVersionSettings,
localClassDescriptorHolder: LocalClassDescriptorHolder
): StorageComponentContainer = createContainer("LocalClassifierAnalyzer") {
): StorageComponentContainer = createContainer("LocalClassifierAnalyzer", platform) {
configureModule(moduleContext, platform, bindingTrace)
useInstance(localClassDescriptorHolder)
@@ -132,7 +132,7 @@ fun createContainerForLazyResolve(
platform: TargetPlatform,
targetEnvironment: TargetEnvironment,
languageVersionSettings: LanguageVersionSettings
): StorageComponentContainer = createContainer("LazyResolve") {
): StorageComponentContainer = createContainer("LazyResolve", platform) {
configureModule(moduleContext, platform, bindingTrace)
useInstance(declarationProviderFactory)
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.composeContainer
import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.ModuleParameters
@@ -45,8 +46,7 @@ abstract class TargetPlatform(
override val platformConfigurator =
object : PlatformConfigurator(DynamicTypesSettings(), listOf(), listOf(), listOf(), listOf(), listOf(),
IdentifierChecker.DEFAULT, OverloadFilter.DEFAULT) {
override fun configure(container: StorageComponentContainer) {
super.configure(container)
override fun configureModuleComponents(container: StorageComponentContainer) {
container.useInstance(SyntheticScopes.Empty)
container.useInstance(SyntheticConstructorsProvider.Empty)
container.useInstance(TypeSpecificityComparator.NONE)
@@ -89,17 +89,17 @@ abstract class PlatformConfigurator(
private val typeCheckers: List<AdditionalTypeChecker> = DEFAULT_TYPE_CHECKERS + additionalTypeCheckers
private val classifierUsageCheckers: List<ClassifierUsageChecker> = DEFAULT_CLASSIFIER_USAGE_CHECKERS + additionalClassifierUsageCheckers
open fun configure(container: StorageComponentContainer) {
with (container) {
useInstance(dynamicTypesSettings)
declarationCheckers.forEach { useInstance(it) }
callCheckers.forEach { useInstance(it) }
typeCheckers.forEach { useInstance(it) }
classifierUsageCheckers.forEach { useInstance(it) }
additionalAnnotationCheckers.forEach { useInstance(it) }
useInstance(identifierChecker)
useInstance(overloadFilter)
}
abstract fun configureModuleComponents(container: StorageComponentContainer)
val platformSpecificContainer = composeContainer(this.javaClass.simpleName) {
useInstance(dynamicTypesSettings)
declarationCheckers.forEach { useInstance(it) }
callCheckers.forEach { useInstance(it) }
typeCheckers.forEach { useInstance(it) }
classifierUsageCheckers.forEach { useInstance(it) }
additionalAnnotationCheckers.forEach { useInstance(it) }
useInstance(identifierChecker)
useInstance(overloadFilter)
}
}
@@ -110,3 +110,7 @@ fun TargetPlatform.createModule(
builtIns: KotlinBuiltIns,
capabilities: Map<ModuleDescriptor.Capability<*>, Any?> = emptyMap()
) = ModuleDescriptorImpl(name, storageManager, defaultModuleParameters, builtIns, capabilities)
fun createContainer(id: String, platform: TargetPlatform, init: StorageComponentContainer.() -> Unit)
= composeContainer(id, platform.platformConfigurator.platformSpecificContainer, init)