Choose Java field during overload resolution with a pure Kotlin property

^KT-31244 Fixed
This commit is contained in:
Denis Zharkov
2019-12-17 17:58:49 +03:00
parent aa8578b675
commit e8131d6e30
20 changed files with 326 additions and 3 deletions
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstituto
import org.jetbrains.kotlin.resolve.calls.model.*
import org.jetbrains.kotlin.resolve.calls.results.FlatSignature
import org.jetbrains.kotlin.resolve.calls.results.OverloadingConflictResolver
import org.jetbrains.kotlin.resolve.calls.results.PlatformOverloadsSpecificityComparator
import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower
import org.jetbrains.kotlin.resolve.calls.tower.TowerResolver
@@ -36,12 +37,14 @@ class CallableReferenceOverloadConflictResolver(
builtIns: KotlinBuiltIns,
module: ModuleDescriptor,
specificityComparator: TypeSpecificityComparator,
platformOverloadsSpecificityComparator: PlatformOverloadsSpecificityComparator,
statelessCallbacks: KotlinResolutionStatelessCallbacks,
constraintInjector: ConstraintInjector
) : OverloadingConflictResolver<CallableReferenceCandidate>(
builtIns,
module,
specificityComparator,
platformOverloadsSpecificityComparator,
{ it.candidate },
{ statelessCallbacks.createConstraintSystemForOverloadResolution(constraintInjector, builtIns) },
Companion::createFlatSignature,
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.resolve.calls.model.KotlinResolutionCandidate
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCallArgument
import org.jetbrains.kotlin.resolve.calls.results.FlatSignature
import org.jetbrains.kotlin.resolve.calls.results.OverloadingConflictResolver
import org.jetbrains.kotlin.resolve.calls.results.PlatformOverloadsSpecificityComparator
import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
import org.jetbrains.kotlin.types.KotlinType
import java.util.*
@@ -32,12 +33,14 @@ class NewOverloadingConflictResolver(
builtIns: KotlinBuiltIns,
module: ModuleDescriptor,
specificityComparator: TypeSpecificityComparator,
platformOverloadsSpecificityComparator: PlatformOverloadsSpecificityComparator,
statelessCallbacks: KotlinResolutionStatelessCallbacks,
constraintInjector: ConstraintInjector
) : OverloadingConflictResolver<KotlinResolutionCandidate>(
builtIns,
module,
specificityComparator,
platformOverloadsSpecificityComparator,
{
// todo investigate
it.resolvedCall.candidateDescriptor
@@ -37,6 +37,7 @@ open class OverloadingConflictResolver<C : Any>(
private val builtIns: KotlinBuiltIns,
private val module: ModuleDescriptor,
private val specificityComparator: TypeSpecificityComparator,
private val platformOverloadsSpecificityComparator: PlatformOverloadsSpecificityComparator,
private val getResultingDescriptor: (C) -> CallableDescriptor,
private val createEmptyConstraintSystem: () -> SimpleConstraintSystem,
private val createFlatSignature: (C) -> FlatSignature<C>,
@@ -364,6 +365,10 @@ open class OverloadingConflictResolver<C : Any>(
return false
}
if (platformOverloadsSpecificityComparator.isMoreSpecificShape(call2.candidateDescriptor(), call1.candidateDescriptor())) {
return false
}
return true
}
@@ -411,6 +416,10 @@ open class OverloadingConflictResolver<C : Any>(
if (f.isExpect && !g.isExpect) return false
}
if (platformOverloadsSpecificityComparator.isMoreSpecificShape(g, f)) {
return false
}
return true
}
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.resolve.calls.results
import org.jetbrains.kotlin.container.DefaultImplementation
import org.jetbrains.kotlin.descriptors.CallableDescriptor
@DefaultImplementation(impl = PlatformOverloadsSpecificityComparator.None::class)
interface PlatformOverloadsSpecificityComparator {
fun isMoreSpecificShape(specific: CallableDescriptor, general: CallableDescriptor): Boolean
object None : PlatformOverloadsSpecificityComparator {
override fun isMoreSpecificShape(specific: CallableDescriptor, general: CallableDescriptor) = false
}
}