From 85c05b18f513826c09f2a4d4551636d9f4f5c05b Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 19 Oct 2015 16:40:31 +0300 Subject: [PATCH] More compact and meaningful error reporting in ResolverForProject No more enormous module lists --- .../builtins/BuiltInsSerializer.kt | 1 + .../kotlin/analyzer/AnalyzerFacade.kt | 29 +++++++++++++------ .../MultiModuleJavaAnalysisCustomTest.kt | 1 + .../resolve/lazy/lazyResolveTestUtils.kt | 1 + .../idea/caches/resolve/KotlinCacheService.kt | 9 +++++- .../caches/resolve/ModuleDependencyMapper.kt | 3 +- 6 files changed, 33 insertions(+), 11 deletions(-) diff --git a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt index c90c35e30c9..308830ba456 100644 --- a/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt +++ b/compiler/builtins-serializer/src/org/jetbrains/kotlin/serialization/builtins/BuiltInsSerializer.kt @@ -88,6 +88,7 @@ public class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) { val builtInModule = BuiltinsSourcesModule() val resolver = JvmAnalyzerFacade.setupResolverForProject( + "builtIns source", ProjectContext(environment.project), listOf(builtInModule), { ModuleContent(files, GlobalSearchScope.EMPTY_SCOPE) }, JvmPlatformParameters { throw IllegalStateException() }, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index 37d6f5ab4b5..f166d228efd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -40,33 +40,43 @@ public class ResolverForModule( public val componentProvider: ComponentProvider ) -public interface ResolverForProject { - public fun resolverForModule(moduleInfo: M): ResolverForModule = resolverForModuleDescriptor(descriptorForModule(moduleInfo)) - public fun descriptorForModule(moduleInfo: M): ModuleDescriptor - public fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule +abstract class ResolverForProject { + fun resolverForModule(moduleInfo: M): ResolverForModule = resolverForModuleDescriptor(descriptorForModule(moduleInfo)) + abstract fun descriptorForModule(moduleInfo: M): ModuleDescriptor + abstract fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule - val allModules: Collection + abstract val name: String + abstract val allModules: Collection + + override fun toString() = "$name" } -public class EmptyResolverForProject : ResolverForProject { +public class EmptyResolverForProject : ResolverForProject() { + override val name: String + get() = "Empty resolver" + override fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule = throw IllegalStateException("$descriptor is not contained in this resolver") override fun descriptorForModule(moduleInfo: M) = throw IllegalStateException("Should not be called for $moduleInfo") override val allModules: Collection = listOf() } public class ResolverForProjectImpl( + private val debugName: String, val descriptorByModule: Map, val delegateResolver: ResolverForProject = EmptyResolverForProject() -) : ResolverForProject { +) : ResolverForProject() { val resolverByModuleDescriptor: MutableMap ResolverForModule> = HashMap() override val allModules: Collection by lazy { (descriptorByModule.keySet() + delegateResolver.allModules).toSet() } + override val name: String + get() = "Resolver for '$debugName'" + private fun assertCorrectModuleInfo(moduleInfo: M) { if (moduleInfo !in allModules) { - throw AssertionError("Requested data for $moduleInfo not contained in this resolver.\nThis resolver was created for following infos:\n${allModules.joinToString("\n")}") + throw AssertionError("$name does not know how to resolve $moduleInfo") } } @@ -123,6 +133,7 @@ public interface ModuleInfo { public abstract class AnalyzerFacade { public fun setupResolverForProject( + debugName: String, projectContext: ProjectContext, modules: Collection, modulesContent: (M) -> ModuleContent, @@ -138,7 +149,7 @@ public abstract class AnalyzerFacade { module -> descriptorByModule[module] = targetPlatform.createModule(module.name, storageManager) } - return ResolverForProjectImpl(descriptorByModule, delegateResolver) + return ResolverForProjectImpl(debugName, descriptorByModule, delegateResolver) } val resolverForProject = createResolverForProject() diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/MultiModuleJavaAnalysisCustomTest.kt b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/MultiModuleJavaAnalysisCustomTest.kt index 8cbb75943a0..8e1bd39441a 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/MultiModuleJavaAnalysisCustomTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/MultiModuleJavaAnalysisCustomTest.kt @@ -59,6 +59,7 @@ public class MultiModuleJavaAnalysisCustomTest : UsefulTestCase() { val environment = createEnvironment(moduleDirs) val modules = setupModules(environment, moduleDirs) val resolverForProject = JvmAnalyzerFacade.setupResolverForProject( + "test", ProjectContext(environment.project), modules, { m -> ModuleContent(m.kotlinFiles, m.javaFilesScope) }, JvmPlatformParameters { diff --git a/compiler/tests/org/jetbrains/kotlin/resolve/lazy/lazyResolveTestUtils.kt b/compiler/tests/org/jetbrains/kotlin/resolve/lazy/lazyResolveTestUtils.kt index 21a4c7abdbe..5813874fa41 100644 --- a/compiler/tests/org/jetbrains/kotlin/resolve/lazy/lazyResolveTestUtils.kt +++ b/compiler/tests/org/jetbrains/kotlin/resolve/lazy/lazyResolveTestUtils.kt @@ -36,6 +36,7 @@ public fun createResolveSessionForFiles( val projectContext = ProjectContext(project) val testModule = TestModule(addBuiltIns) val resolverForProject = JvmAnalyzerFacade.setupResolverForProject( + "test", projectContext, listOf(testModule), { ModuleContent(syntheticFiles, GlobalSearchScope.allScope(project)) }, JvmPlatformParameters { testModule }, diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheService.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheService.kt index eee0a6d8851..e980bd40aee 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheService.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheService.kt @@ -55,6 +55,7 @@ public class KotlinCacheService(val project: Project) { private inner class GlobalFacade(platform: TargetPlatform) { val facadeForLibraries = ProjectResolutionFacade(project) { globalResolveSessionProvider( + "project libraries for platform $platform", project, platform, logProcessCanceled = true, @@ -68,6 +69,7 @@ public class KotlinCacheService(val project: Project) { val facadeForModules = ProjectResolutionFacade(project) { globalResolveSessionProvider( + "project source roots and libraries for platform $platform", project, platform, reuseDataFrom = facadeForLibraries, @@ -93,11 +95,13 @@ public class KotlinCacheService(val project: Project) { PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, KotlinOutOfBlockCompletionModificationTracker.getInstance(project) ) + val debugName = "completion/highlighting in $syntheticFileModule for files ${files.joinToString { it.name }} for platform $targetPlatform" return when { syntheticFileModule is ModuleSourceInfo -> { val dependentModules = syntheticFileModule.getDependentModules() ProjectResolutionFacade(project) { globalResolveSessionProvider( + debugName, project, targetPlatform, syntheticFiles = files, @@ -111,6 +115,7 @@ public class KotlinCacheService(val project: Project) { syntheticFileModule is LibrarySourceInfo || syntheticFileModule is NotUnderContentRootModuleInfo -> { ProjectResolutionFacade(project) { globalResolveSessionProvider( + debugName, project, targetPlatform, syntheticFiles = files, @@ -128,6 +133,7 @@ public class KotlinCacheService(val project: Project) { LOG.warn("Creating cache with synthetic files ($files) in classes of library $syntheticFileModule") ProjectResolutionFacade(project) { globalResolveSessionProvider( + debugName, project, targetPlatform, syntheticFiles = files, @@ -186,6 +192,7 @@ public class KotlinCacheService(val project: Project) { } private fun globalResolveSessionProvider( + debugName: String, project: Project, platform: TargetPlatform, dependencies: Collection, @@ -201,7 +208,7 @@ private fun globalResolveSessionProvider( ?: GlobalContext(logProcessCanceled) val moduleResolverProvider = createModuleResolverProvider( - project, globalContext, + debugName, project, globalContext, AnalyzerFacadeProvider.getAnalyzerFacade(platform), syntheticFiles, delegateResolverForProject, moduleFilter ) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt index 12f5ea1019c..f624b0de326 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters import org.jetbrains.kotlin.storage.ExceptionTracker fun createModuleResolverProvider( + debugName: String, project: Project, globalContext: GlobalContextImpl, analyzerFacade: AnalyzerFacade, @@ -62,7 +63,7 @@ fun createModuleResolverProvider( } val resolverForProject = analyzerFacade.setupResolverForProject( - globalContext.withProject(project), modulesToCreateResolversFor, modulesContent, + debugName, globalContext.withProject(project), modulesToCreateResolversFor, modulesContent, jvmPlatformParameters, IdeaEnvironment, delegateResolver, { m, c -> IDEPackagePartProvider(c.moduleContentScope) } )