Show expect / actual gutter even for incomplete compatibility

So #KT-18445 Fixed
So #KT-21115 Fixed
This commit is contained in:
Mikhail Glukhikh
2018-01-31 19:27:45 +03:00
parent a2a3043607
commit 3ba6b70f73
6 changed files with 19 additions and 6 deletions
@@ -35,7 +35,7 @@ import java.awt.event.MouseEvent
fun ModuleDescriptor.hasActualsFor(descriptor: MemberDescriptor) = fun ModuleDescriptor.hasActualsFor(descriptor: MemberDescriptor) =
actualsFor(descriptor).isNotEmpty() actualsFor(descriptor).isNotEmpty()
fun ModuleDescriptor.actualsFor(descriptor: MemberDescriptor, checkCompatible: Boolean = true): List<DeclarationDescriptor> = fun ModuleDescriptor.actualsFor(descriptor: MemberDescriptor, checkCompatible: Boolean = false): List<DeclarationDescriptor> =
with(ExpectedActualResolver) { with(ExpectedActualResolver) {
if (checkCompatible) { if (checkCompatible) {
descriptor.findCompatibleActualForExpected(this@actualsFor) descriptor.findCompatibleActualForExpected(this@actualsFor)
@@ -29,14 +29,16 @@ import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.module import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver
import org.jetbrains.kotlin.resolve.multiplatform.ExpectedActualResolver.Compatibility.*
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.utils.addToStdlib.safeAs
fun ModuleDescriptor.hasDeclarationOf(descriptor: MemberDescriptor) = declarationOf(descriptor) != null fun ModuleDescriptor.hasDeclarationOf(descriptor: MemberDescriptor) = declarationOf(descriptor) != null
private fun ModuleDescriptor.declarationOf(descriptor: MemberDescriptor): DeclarationDescriptor? = private fun ModuleDescriptor.declarationOf(descriptor: MemberDescriptor): DeclarationDescriptor? =
with(ExpectedActualResolver) { with(ExpectedActualResolver) {
descriptor.findCompatibleExpectedForActual(this@declarationOf).firstOrNull() val expectedCompatibilityMap = findExpectedForActual(descriptor, this@declarationOf)
} expectedCompatibilityMap?.get(Compatible)?.firstOrNull() ?: expectedCompatibilityMap?.values?.flatten()?.firstOrNull()
}
fun getExpectedDeclarationTooltip(declaration: KtDeclaration?): String? { fun getExpectedDeclarationTooltip(declaration: KtDeclaration?): String? {
val descriptor = declaration?.toDescriptor() as? MemberDescriptor ?: return null val descriptor = declaration?.toDescriptor() as? MemberDescriptor ?: return null
@@ -67,8 +69,7 @@ internal fun KtDeclaration.isExpectedOrExpectedClassMember(): Boolean {
} }
internal fun KtClassOrObject.isExpected(): Boolean { internal fun KtClassOrObject.isExpected(): Boolean {
return this.hasExpectModifier() || return this.hasExpectModifier() || this.descriptor.safeAs<ClassDescriptor>()?.isExpect == true
this.descriptor.safeAs<ClassDescriptor>()?.isExpect == true
} }
internal fun DeclarationDescriptor.liftToExpected(): DeclarationDescriptor? { internal fun DeclarationDescriptor.liftToExpected(): DeclarationDescriptor? {
@@ -2,6 +2,10 @@ expect class <lineMarker>Header</lineMarker> {
fun <lineMarker>foo</lineMarker>(): Int fun <lineMarker>foo</lineMarker>(): Int
} }
expect class <lineMarker>Incomplete</lineMarker> {
fun foo(): Int
}
expect fun <lineMarker>foo</lineMarker>(arg: Int): String expect fun <lineMarker>foo</lineMarker>(arg: Int): String
expect val <lineMarker>flag</lineMarker>: Boolean expect val <lineMarker>flag</lineMarker>: Boolean
@@ -4,6 +4,8 @@ actual class Header {
actual fun foo() = 42 actual fun foo() = 42
} }
actual class Incomplete
actual fun foo(arg: Int) = arg.toString() actual fun foo(arg: Int) = arg.toString()
actual val flag = true actual val flag = true
@@ -4,6 +4,10 @@ expect class Header {
fun foo(): Int fun foo(): Int
} }
expect class Incomplete {
fun foo(): Int
}
expect fun foo(arg: Int): String expect fun foo(arg: Int): String
expect val flag: Boolean expect val flag: Boolean
@@ -2,6 +2,8 @@ actual class <lineMarker>Header</lineMarker> {
actual fun <lineMarker>foo</lineMarker>() = 42 actual fun <lineMarker>foo</lineMarker>() = 42
} }
actual class <lineMarker>Incomplete</lineMarker>
actual fun <lineMarker>foo</lineMarker>(arg: Int) = arg.toString() actual fun <lineMarker>foo</lineMarker>(arg: Int) = arg.toString()
actual val <lineMarker>flag</lineMarker> = true actual val <lineMarker>flag</lineMarker> = true