[MPP] Allow smart casts for properties from dependsOn modules
Smartcasts for public properties from different module are not stable because module declaring a property in general can be compiled separately from the module using it. However, if client module has dependsOn relation with declaring module their simultaneous compilation is guaranteed which makes this smart cast safe. Cache all transitive 'expected by' modules in module dependencies. Extend test to check smart casts are allowed for properties from transitive 'expected by' dependencies and prohibited otherwise. ^KT-42754 Fixed
This commit is contained in:
@@ -52,6 +52,8 @@ interface ModuleDescriptor : DeclarationDescriptor {
|
||||
|
||||
val expectedByModules: List<ModuleDescriptor>
|
||||
|
||||
val allExpectedByModules: Set<ModuleDescriptor>
|
||||
|
||||
fun <T> getCapability(capability: ModuleCapability<T>): T?
|
||||
|
||||
class Capability<T>(val name: String) {
|
||||
|
||||
@@ -75,7 +75,10 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
|
||||
get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allDependencies.filter { it != this }
|
||||
|
||||
override val expectedByModules: List<ModuleDescriptor>
|
||||
get() = this.dependencies.sure { "Dependencies of module $id were not set" }.expectedByDependencies
|
||||
get() = this.dependencies.sure { "Dependencies of module $id were not set" }.directExpectedByDependencies
|
||||
|
||||
override val allExpectedByModules: Set<ModuleDescriptor>
|
||||
get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allExpectedByDependencies
|
||||
|
||||
override fun getPackage(fqName: FqName): PackageViewDescriptor {
|
||||
assertValid()
|
||||
@@ -118,7 +121,7 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
|
||||
}
|
||||
|
||||
fun setDependencies(descriptors: List<ModuleDescriptorImpl>, friends: Set<ModuleDescriptorImpl>) {
|
||||
setDependencies(ModuleDependenciesImpl(descriptors, friends, emptyList()))
|
||||
setDependencies(ModuleDependenciesImpl(descriptors, friends, emptyList(), emptySet()))
|
||||
}
|
||||
|
||||
override fun shouldSeeInternalsOf(targetModule: ModuleDescriptor): Boolean {
|
||||
@@ -154,11 +157,13 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
|
||||
interface ModuleDependencies {
|
||||
val allDependencies: List<ModuleDescriptorImpl>
|
||||
val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl>
|
||||
val expectedByDependencies: List<ModuleDescriptorImpl>
|
||||
val directExpectedByDependencies: List<ModuleDescriptorImpl>
|
||||
val allExpectedByDependencies: Set<ModuleDescriptorImpl>
|
||||
}
|
||||
|
||||
class ModuleDependenciesImpl(
|
||||
override val allDependencies: List<ModuleDescriptorImpl>,
|
||||
override val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl>,
|
||||
override val expectedByDependencies: List<ModuleDescriptorImpl>
|
||||
override val directExpectedByDependencies: List<ModuleDescriptorImpl>,
|
||||
override val allExpectedByDependencies: Set<ModuleDescriptorImpl>,
|
||||
) : ModuleDependencies
|
||||
|
||||
@@ -107,6 +107,12 @@ public class ErrorUtils {
|
||||
return emptyList();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Set<ModuleDescriptor> getAllExpectedByModules() {
|
||||
return emptySet();
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R, D> R accept(@NotNull DeclarationDescriptorVisitor<R, D> visitor, D data) {
|
||||
return null;
|
||||
|
||||
Reference in New Issue
Block a user