Recreate module descriptors for affected modules only on a change

This commit is contained in:
Dmitry Jemerov
2017-07-27 16:54:52 +02:00
parent 07794c8188
commit bdbe134b60
13 changed files with 262 additions and 40 deletions
@@ -48,4 +48,6 @@ interface ModuleDescriptor : DeclarationDescriptor {
class Capability<T>(val name: String) {
override fun toString() = name
}
val isValid: Boolean
}
@@ -47,6 +47,14 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
private var dependencies: ModuleDependencies? = null
private var packageFragmentProviderForModuleContent: PackageFragmentProvider? = null
override var isValid: Boolean = true
private fun assertValid() {
if (!isValid) {
throw IllegalStateException("Accessing invalid module descriptor $this")
}
}
private val packages = storageManager.createMemoizedFunction<FqName, PackageViewDescriptor> {
fqName: FqName -> LazyPackageViewDescriptorImpl(this, fqName, storageManager)
}
@@ -60,9 +68,13 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
override val allImplementingModules: Set<ModuleDescriptor>
get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allImplementingModules
override fun getPackage(fqName: FqName): PackageViewDescriptor = packages(fqName)
override fun getPackage(fqName: FqName): PackageViewDescriptor {
assertValid()
return packages(fqName)
}
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> {
assertValid()
return packageFragmentProvider.getSubPackagesOf(fqName, nameFilter)
}
@@ -117,7 +129,10 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
}
val packageFragmentProvider: PackageFragmentProvider
get() = packageFragmentProviderForWholeModuleWithDependencies
get() {
assertValid()
return packageFragmentProviderForWholeModuleWithDependencies
}
@Suppress("UNCHECKED_CAST")
override fun <T> getCapability(capability: ModuleDescriptor.Capability<T>) = capabilities[capability] as? T
@@ -122,6 +122,11 @@ public class ErrorUtils {
public KotlinBuiltIns getBuiltIns() {
return DefaultBuiltIns.getInstance();
}
@Override
public boolean isValid() {
return false;
}
};
}