From f454b7d15ee4b69fced69970abe677771589e8e4 Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 15 Jun 2015 21:53:19 +0300 Subject: [PATCH] AnalyzerFacade: resolvers for modules are created lazily --- .../kotlin/analyzer/AnalyzerFacade.kt | 42 ++++++++++++++----- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index 4aa5508235b..5155ef5c305 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -23,12 +23,15 @@ import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.withModule import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleParameters +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.LazyModuleDependencies import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.resolve.lazy.ResolveSession +import org.jetbrains.kotlin.storage.StorageManager import java.util.ArrayList import java.util.HashMap import kotlin.properties.Delegates @@ -56,7 +59,7 @@ public class ResolverForProjectImpl( val descriptorByModule: Map, val delegateResolver: ResolverForProject = EmptyResolverForProject() ) : ResolverForProject { - val resolverByModuleDescriptor: MutableMap = HashMap() + val resolverByModuleDescriptor: MutableMap R> = HashMap() override val allModules: Collection by Delegates.lazy { (descriptorByModule.keySet() + delegateResolver.allModules).toSet() @@ -69,7 +72,8 @@ public class ResolverForProjectImpl( } override fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): R { - return resolverByModuleDescriptor[descriptor] ?: return delegateResolver.resolverForModuleDescriptor(descriptor) + val computation = resolverByModuleDescriptor[descriptor] ?: return delegateResolver.resolverForModuleDescriptor(descriptor) + return computation() } override fun descriptorForModule(moduleInfo: M): ModuleDescriptorImpl { @@ -127,11 +131,12 @@ public trait AnalyzerFacade = EmptyResolverForProject() ): ResolverForProject { + val storageManager = projectContext.storageManager fun createResolverForProject(): ResolverForProjectImpl { val descriptorByModule = HashMap() modules.forEach { module -> - descriptorByModule[module] = ModuleDescriptorImpl(module.name, projectContext.storageManager, moduleParameters) + descriptorByModule[module] = ModuleDescriptorImpl(module.name, storageManager, moduleParameters) } return ResolverForProjectImpl(descriptorByModule, delegateResolver) } @@ -153,7 +158,7 @@ public trait AnalyzerFacade resolverForProject.descriptorForModule(module).setDependencies( - LazyModuleDependencies(projectContext.storageManager) { computeDependencyDescriptors(module) } + LazyModuleDependencies(storageManager) { computeDependencyDescriptors(module) } ) } } @@ -176,12 +181,15 @@ public trait AnalyzerFacade val descriptor = resolverForProject.descriptorForModule(module) - val resolverForModule = createResolverForModule( - module, descriptor, projectContext.withModule(descriptor), - modulesContent(module), platformParameters, resolverForProject - ) - descriptor.initialize(resolverForModule.packageFragmentProvider) - resolverForProject.resolverByModuleDescriptor[descriptor] = resolverForModule + val computeResolverForModule = storageManager.createLazyValue { + createResolverForModule( + module, descriptor, projectContext.withModule(descriptor), + modulesContent(module), platformParameters, resolverForProject + ) + } + + descriptor.initialize(DelegatingPackageFragmentProvider { computeResolverForModule().packageFragmentProvider }) + resolverForProject.resolverByModuleDescriptor[descriptor] = computeResolverForModule } } @@ -199,3 +207,17 @@ public trait AnalyzerFacade PackageFragmentProvider +) : PackageFragmentProvider { + + override fun getPackageFragments(fqName: FqName): List { + return delegate().getPackageFragments(fqName) + } + + override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection { + return delegate().getSubPackagesOf(fqName, nameFilter) + } +} \ No newline at end of file