Consider only source-compatible modules in allImplementingModules use-sites

So #KT-17400 Fixed
So #KT-15680 Fixed
So #KT-15660 Fixed
Likely also #KT-16838 Fixed
This commit is contained in:
Mikhail Glukhikh
2017-04-18 12:34:11 +03:00
committed by Mikhail Glukhikh
parent 956ace3463
commit 0798e43524
24 changed files with 86 additions and 32 deletions
@@ -19,11 +19,14 @@ package org.jetbrains.kotlin.idea.highlighter
import com.intellij.lang.annotation.AnnotationHolder
import com.intellij.lang.annotation.Annotator
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.DiagnosticSink
import org.jetbrains.kotlin.idea.caches.resolve.ModuleProductionSourceInfo
import org.jetbrains.kotlin.idea.caches.resolve.ModuleTestSourceInfo
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
@@ -34,6 +37,22 @@ import org.jetbrains.kotlin.resolve.checkers.HeaderImplDeclarationChecker
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
import org.jetbrains.kotlin.resolve.diagnostics.SimpleDiagnostics
val ModuleDescriptor.sourceKind: SourceKind
get() = when (getCapability(ModuleInfo.Capability)) {
is ModuleProductionSourceInfo -> SourceKind.PRODUCTION
is ModuleTestSourceInfo -> SourceKind.TEST
else -> SourceKind.OTHER
}
enum class SourceKind { OTHER, PRODUCTION, TEST }
val ModuleDescriptor.allImplementingCompatibleModules
get() = allImplementingModules.filter {
sourceKind == SourceKind.OTHER ||
it.sourceKind == SourceKind.OTHER ||
it.sourceKind == sourceKind
}
class PlatformHeaderAnnotator : Annotator {
override fun annotate(element: PsiElement, holder: AnnotationHolder) {
@@ -43,7 +62,7 @@ class PlatformHeaderAnnotator : Annotator {
if (TargetPlatformDetector.getPlatform(declaration.containingKtFile) !is TargetPlatform.Default) return
val defaultModuleDescriptor = declaration.findModuleDescriptor()
val dependentDescriptors = defaultModuleDescriptor.allImplementingModules
val dependentDescriptors = defaultModuleDescriptor.allImplementingCompatibleModules
if (dependentDescriptors.isEmpty()) return
val diagnostics = validate(declaration, dependentDescriptors)