From 3415853cacffc2725bb7dde437c2e7456e2dba28 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 4 Aug 2017 18:45:58 +0200 Subject: [PATCH] Add ModuleDescriptor.assertValid() for ensuring consistency --- .../org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt | 10 +++++++--- .../kotlin/resolve/lazy/LazyDeclarationResolver.java | 1 + .../jetbrains/kotlin/resolve/lazy/LazyImportScope.kt | 1 + .../jetbrains/kotlin/resolve/lazy/ResolveSession.java | 6 ++++++ .../kotlin/resolve/lazy/TopLevelDescriptorProvider.kt | 6 ++++++ .../jetbrains/kotlin/descriptors/ModuleDescriptor.kt | 2 ++ .../kotlin/descriptors/impl/ModuleDescriptorImpl.kt | 5 ++++- .../src/org/jetbrains/kotlin/types/ErrorUtils.java | 5 +++++ 8 files changed, 32 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index b43db4d44ce..f82f3bb8d22 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -96,7 +96,12 @@ class ResolverForProjectImpl( val moduleDescriptor: ModuleDescriptorImpl, val modificationTracker: ModificationTracker?, val modificationCount: Long? - ) + ) { + fun isOutOfDate(): Boolean { + val currentModCount = modificationTracker?.modificationCount + return currentModCount != null && currentModCount > modificationCount!! + } + } private val descriptorByModule = mutableMapOf() private val moduleInfoByDescriptor = mutableMapOf() @@ -171,8 +176,7 @@ class ResolverForProjectImpl( var moduleData = descriptorByModule.getOrPut(module) { createModuleDescriptor(module) } - val currentModCount = moduleData.modificationTracker?.modificationCount - if (currentModCount != null && currentModCount > moduleData.modificationCount!!) { + if (moduleData.isOutOfDate()) { moduleData = recreateModuleDescriptor(module) } moduleData.moduleDescriptor diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java index 7a2b69ba13d..e8a0951552a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyDeclarationResolver.java @@ -280,6 +280,7 @@ public class LazyDeclarationResolver { if (isTopLevel) { // for top level declarations we search directly in package because of possible conflicts with imports KtFile ktFile = (KtFile) declaration.getContainingFile(); FqName fqName = ktFile.getPackageFqName(); + topLevelDescriptorProvider.assertValid(); LazyPackageDescriptor packageDescriptor = topLevelDescriptorProvider.getPackageFragment(fqName); if (packageDescriptor == null) { if (topLevelDescriptorProvider instanceof LazyClassContext) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt index 09e3a994da6..bcbda4a18a5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -188,6 +188,7 @@ class LazyImportResolver( } fun getImportScope(directive: KtImportDirective): ImportingScope { + moduleDescriptor.assertValid() return importedScopesProvider(directive) ?: ImportingScope.Empty } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java index 90b1526c9e1..52eb9f56d07 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/ResolveSession.java @@ -308,6 +308,7 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { @Override @NotNull public DeclarationDescriptor resolveToDescriptor(@NotNull KtDeclaration declaration) { + assertValid(); if (!areDescriptorsCreatedForDeclaration(declaration)) { throw new IllegalStateException( "No descriptors are created for declarations of type " + declaration.getClass().getSimpleName() @@ -449,4 +450,9 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext { public WrappedTypeFactory getWrappedTypeFactory() { return wrappedTypeFactory; } + + @Override + public void assertValid() { + module.assertValid(); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/TopLevelDescriptorProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/TopLevelDescriptorProvider.kt index 284b7ca0a31..61c95d5e865 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/TopLevelDescriptorProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/TopLevelDescriptorProvider.kt @@ -25,6 +25,8 @@ interface TopLevelDescriptorProvider { fun getPackageFragment(fqName: FqName): LazyPackageDescriptor? fun getTopLevelClassifierDescriptors(fqName: FqName, location: LookupLocation): Collection + + fun assertValid() } object NoTopLevelDescriptorProvider : TopLevelDescriptorProvider { @@ -37,4 +39,8 @@ object NoTopLevelDescriptorProvider : TopLevelDescriptorProvider { override fun getTopLevelClassifierDescriptors(fqName: FqName, location: LookupLocation): Collection { shouldNotBeCalled() } + + override fun assertValid() { + shouldNotBeCalled() + } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt index b69ae2b1173..a9262fe6349 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/ModuleDescriptor.kt @@ -50,4 +50,6 @@ interface ModuleDescriptor : DeclarationDescriptor { } val isValid: Boolean + + fun assertValid() } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt index 96dbf20cb66..1564e153448 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt @@ -48,8 +48,11 @@ class ModuleDescriptorImpl @JvmOverloads constructor( private var packageFragmentProviderForModuleContent: PackageFragmentProvider? = null override var isValid: Boolean = true + set(value) { + field = value + } - private fun assertValid() { + override fun assertValid() { if (!isValid) { throw IllegalStateException("Accessing invalid module descriptor $this") } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java index 381751cf9e9..2aa6a04bf6b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/ErrorUtils.java @@ -127,6 +127,11 @@ public class ErrorUtils { public boolean isValid() { return false; } + + @Override + public void assertValid() { + throw new IllegalStateException("ERROR_MODULE is not a valid module"); + } }; }