MPP: Support multiple 'expectedBy' dependencies for single module

#KT-22865 Fixed
This commit is contained in:
Alexey Sedunov
2018-02-20 19:26:24 +03:00
parent e3a69d118f
commit d9aa1796cd
22 changed files with 197 additions and 108 deletions
@@ -123,11 +123,8 @@ val mavenLibraryIdToPlatform: Map<String, TargetPlatformKind<*>> by lazy {
.toMap()
}
internal fun Module.findImplementingModules(modelsProvider: IdeModifiableModelsProvider): List<Module> {
return modelsProvider.modules.filter { module ->
module.findImplementedModuleName(modelsProvider) == name
}
}
internal fun Module.findImplementingModules(modelsProvider: IdeModifiableModelsProvider) =
modelsProvider.modules.filter { name in it.findImplementedModuleNames(modelsProvider) }
val Module.implementingModules: List<Module>
get() = cached(CachedValueProvider {
@@ -167,12 +164,11 @@ val ModuleDescriptor.implementingDescriptors: List<ModuleDescriptor>
})
}
val ModuleDescriptor.implementedDescriptor: ModuleDescriptor?
val ModuleDescriptor.implementedDescriptors: List<ModuleDescriptor>
get() {
val moduleSourceInfo = getCapability(ModuleInfo.Capability) as? ModuleSourceInfo ?: return null
val moduleSourceInfo = getCapability(ModuleInfo.Capability) as? ModuleSourceInfo ?: return emptyList()
val implementedModuleInfo = moduleSourceInfo.expectedBy
return implementedModuleInfo?.let {
return moduleSourceInfo.expectedBy.mapNotNull {
KotlinCacheService.getInstance(moduleSourceInfo.module.project)
.getResolutionFacadeByModuleInfo(it, it.platform)?.moduleDescriptor
}
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.idea.facet.implementedDescriptor
import org.jetbrains.kotlin.idea.facet.implementedDescriptors
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtDeclaration
@@ -44,8 +44,8 @@ fun getExpectedDeclarationTooltip(declaration: KtDeclaration?): String? {
val descriptor = declaration?.toDescriptor() as? MemberDescriptor ?: return null
val platformModuleDescriptor = declaration.containingKtFile.findModuleDescriptor()
val commonModuleDescriptor = platformModuleDescriptor.implementedDescriptor ?: return null
if (!commonModuleDescriptor.hasDeclarationOf(descriptor)) return null
val commonModuleDescriptors = platformModuleDescriptor.implementedDescriptors ?: return null
if (!commonModuleDescriptors.any { it.hasDeclarationOf(descriptor) }) return null
return "Has declaration in common module"
}
@@ -54,7 +54,10 @@ fun navigateToExpectedDeclaration(declaration: KtDeclaration?) {
declaration?.expectedDeclarationIfAny()?.navigate(false)
}
internal fun MemberDescriptor.expectedDescriptor() = module.implementedDescriptor?.declarationOf(this)
internal fun MemberDescriptor.expectedDescriptors() = module.implementedDescriptors.mapNotNull { it.declarationOf(this) }
// TODO: Sort out the cases with multiple expected descriptors
internal fun MemberDescriptor.expectedDescriptor() = expectedDescriptors().firstOrNull()
internal fun KtDeclaration.expectedDeclarationIfAny(): KtDeclaration? {
val expectedDescriptor = (toDescriptor() as? MemberDescriptor)?.expectedDescriptor() ?: return null
@@ -39,7 +39,7 @@ import org.jetbrains.kotlin.idea.caches.lightClasses.KtFakeLightMethod
import org.jetbrains.kotlin.idea.core.isInheritable
import org.jetbrains.kotlin.idea.core.isOverridable
import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.idea.facet.implementedDescriptor
import org.jetbrains.kotlin.idea.facet.implementedDescriptors
import org.jetbrains.kotlin.idea.facet.implementingDescriptors
import org.jetbrains.kotlin.idea.search.declarationsSearch.toPossiblyFakeLightMethods
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
@@ -379,8 +379,7 @@ private fun collectExpectedMarkers(declaration: KtNamedDeclaration,
val descriptor = declaration.toDescriptor() as? MemberDescriptor ?: return
val platformModuleDescriptor = declaration.containingKtFile.findModuleDescriptor()
val commonModuleDescriptor = platformModuleDescriptor.implementedDescriptor ?: return
if (!commonModuleDescriptor.hasDeclarationOf(descriptor)) return
if (!platformModuleDescriptor.implementedDescriptors.any { it.hasDeclarationOf(descriptor) }) return
val anchor = declaration.expectOrActualAnchor