Refactoring. Remove descriptor from resolution Candidate.
This commit is contained in:
+1
-4
@@ -321,10 +321,7 @@ class NewResolutionOldInference(
|
||||
internal data class MyCandidate<out D: CallableDescriptor>(
|
||||
val candidateStatus: ResolutionCandidateStatus,
|
||||
val resolvedCall: MutableResolvedCall<@UnsafeVariance D>
|
||||
) : Candidate<D> {
|
||||
override val descriptor: D
|
||||
get() = resolvedCall.candidateDescriptor
|
||||
|
||||
) : Candidate {
|
||||
override val isSuccessful: Boolean
|
||||
get() = candidateStatus.resultingApplicability.isSuccess
|
||||
override val status: ResolutionCandidateStatus
|
||||
|
||||
+5
-5
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastI
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
import java.util.*
|
||||
|
||||
abstract class AbstractInvokeTowerProcessor<F : Candidate<FunctionDescriptor>, V : Candidate<VariableDescriptor>>(
|
||||
abstract class AbstractInvokeTowerProcessor<F : Candidate, V : Candidate>(
|
||||
protected val factoryProviderForInvoke: CandidateFactoryProviderForInvoke<F, V>,
|
||||
private val variableProcessor: ScopeTowerProcessor<V>
|
||||
) : ScopeTowerProcessor<F> {
|
||||
@@ -86,7 +86,7 @@ abstract class AbstractInvokeTowerProcessor<F : Candidate<FunctionDescriptor>, V
|
||||
}
|
||||
|
||||
// todo KT-9522 Allow invoke convention for synthetic property
|
||||
class InvokeTowerProcessor<F : Candidate<FunctionDescriptor>, V : Candidate<VariableDescriptor>>(
|
||||
class InvokeTowerProcessor<F : Candidate, V : Candidate>(
|
||||
val scopeTower: ImplicitScopeTower,
|
||||
val name: Name,
|
||||
factoryProviderForInvoke: CandidateFactoryProviderForInvoke<F, V>,
|
||||
@@ -104,7 +104,7 @@ class InvokeTowerProcessor<F : Candidate<FunctionDescriptor>, V : Candidate<Vari
|
||||
}
|
||||
}
|
||||
|
||||
class InvokeExtensionTowerProcessor<F : Candidate<FunctionDescriptor>, V : Candidate<VariableDescriptor>>(
|
||||
class InvokeExtensionTowerProcessor<F : Candidate, V : Candidate>(
|
||||
val scopeTower: ImplicitScopeTower,
|
||||
val name: Name,
|
||||
factoryProviderForInvoke: CandidateFactoryProviderForInvoke<F, V>,
|
||||
@@ -123,7 +123,7 @@ class InvokeExtensionTowerProcessor<F : Candidate<FunctionDescriptor>, V : Candi
|
||||
}
|
||||
}
|
||||
|
||||
private class InvokeExtensionScopeTowerProcessor<C : Candidate<FunctionDescriptor>>(
|
||||
private class InvokeExtensionScopeTowerProcessor<C : Candidate>(
|
||||
context: CandidateFactory<FunctionDescriptor, C>,
|
||||
private val invokeCandidateDescriptor: CandidateWithBoundDispatchReceiver<FunctionDescriptor>,
|
||||
private val explicitReceiver: ReceiverValueWithSmartCastInfo?
|
||||
@@ -159,7 +159,7 @@ private fun ImplicitScopeTower.getExtensionInvokeCandidateDescriptor(
|
||||
}
|
||||
|
||||
// case 1.(foo())() or (foo())()
|
||||
fun <F : Candidate<FunctionDescriptor>> createCallTowerProcessorForExplicitInvoke(
|
||||
fun <F : Candidate> createCallTowerProcessorForExplicitInvoke(
|
||||
scopeTower: ImplicitScopeTower,
|
||||
functionContext: CandidateFactory<FunctionDescriptor, F>,
|
||||
expressionForInvoke: ReceiverValueWithSmartCastInfo,
|
||||
|
||||
+15
-14
@@ -39,7 +39,7 @@ class CompositeScopeTowerProcessor<out C>(
|
||||
override fun process(data: TowerData): List<Collection<C>> = processors.flatMap { it.process(data) }
|
||||
}
|
||||
|
||||
internal abstract class AbstractSimpleScopeTowerProcessor<D : CallableDescriptor, C: Candidate<D>>(
|
||||
internal abstract class AbstractSimpleScopeTowerProcessor<D : CallableDescriptor, C: Candidate>(
|
||||
val candidateFactory: CandidateFactory<D, C>
|
||||
) : ScopeTowerProcessor<C> {
|
||||
|
||||
@@ -51,7 +51,7 @@ internal abstract class AbstractSimpleScopeTowerProcessor<D : CallableDescriptor
|
||||
private typealias CandidatesCollector<D> =
|
||||
ScopeTowerLevel.(extensionReceiver: ReceiverValueWithSmartCastInfo?) -> Collection<CandidateWithBoundDispatchReceiver<D>>
|
||||
|
||||
internal class ExplicitReceiverScopeTowerProcessor<D : CallableDescriptor, C: Candidate<D>>(
|
||||
internal class ExplicitReceiverScopeTowerProcessor<D : CallableDescriptor, C: Candidate>(
|
||||
val scopeTower: ImplicitScopeTower,
|
||||
context: CandidateFactory<D, C>,
|
||||
val explicitReceiver: ReceiverValueWithSmartCastInfo,
|
||||
@@ -78,7 +78,7 @@ internal class ExplicitReceiverScopeTowerProcessor<D : CallableDescriptor, C: Ca
|
||||
}
|
||||
}
|
||||
|
||||
private class QualifierScopeTowerProcessor<D : CallableDescriptor, C: Candidate<D>>(
|
||||
private class QualifierScopeTowerProcessor<D : CallableDescriptor, C: Candidate>(
|
||||
val scopeTower: ImplicitScopeTower,
|
||||
context: CandidateFactory<D, C>,
|
||||
val qualifier: QualifierReceiver,
|
||||
@@ -94,7 +94,7 @@ private class QualifierScopeTowerProcessor<D : CallableDescriptor, C: Candidate<
|
||||
}
|
||||
}
|
||||
|
||||
private class NoExplicitReceiverScopeTowerProcessor<D : CallableDescriptor, C: Candidate<D>>(
|
||||
private class NoExplicitReceiverScopeTowerProcessor<D : CallableDescriptor, C: Candidate>(
|
||||
context: CandidateFactory<D, C>,
|
||||
val collectCandidates: CandidatesCollector<D>
|
||||
) : AbstractSimpleScopeTowerProcessor<D, C>(context) {
|
||||
@@ -120,7 +120,8 @@ private class NoExplicitReceiverScopeTowerProcessor<D : CallableDescriptor, C: C
|
||||
}
|
||||
|
||||
}
|
||||
private fun <D : CallableDescriptor, C : Candidate<D>> processCommonAndSyntheticMembers(
|
||||
|
||||
private fun <D : CallableDescriptor, C : Candidate> processCommonAndSyntheticMembers(
|
||||
receiverForMember: ReceiverValueWithSmartCastInfo,
|
||||
scopeTowerLevel: ScopeTowerLevel,
|
||||
collectCandidates: CandidatesCollector<D>,
|
||||
@@ -149,7 +150,7 @@ private fun <D : CallableDescriptor, C : Candidate<D>> processCommonAndSynthetic
|
||||
}
|
||||
}
|
||||
|
||||
private fun <D : CallableDescriptor, C: Candidate<D>> createSimpleProcessor(
|
||||
private fun <D : CallableDescriptor, C: Candidate> createSimpleProcessor(
|
||||
scopeTower: ImplicitScopeTower,
|
||||
context: CandidateFactory<D, C>,
|
||||
explicitReceiver: DetailedReceiver?,
|
||||
@@ -178,23 +179,23 @@ private fun <D : CallableDescriptor, C: Candidate<D>> createSimpleProcessor(
|
||||
}
|
||||
}
|
||||
|
||||
fun <C : Candidate<VariableDescriptor>> createVariableProcessor(scopeTower: ImplicitScopeTower, name: Name,
|
||||
context: CandidateFactory<VariableDescriptor, C>, explicitReceiver: DetailedReceiver?, classValueReceiver: Boolean = true
|
||||
fun <C : Candidate> createVariableProcessor(scopeTower: ImplicitScopeTower, name: Name,
|
||||
context: CandidateFactory<VariableDescriptor, C>, explicitReceiver: DetailedReceiver?, classValueReceiver: Boolean = true
|
||||
) = createSimpleProcessor(scopeTower, context, explicitReceiver, classValueReceiver) { getVariables(name, it) }
|
||||
|
||||
fun <C : Candidate<VariableDescriptor>> createVariableAndObjectProcessor(scopeTower: ImplicitScopeTower, name: Name,
|
||||
context: CandidateFactory<VariableDescriptor, C>, explicitReceiver: DetailedReceiver?, classValueReceiver: Boolean = true
|
||||
fun <C : Candidate> createVariableAndObjectProcessor(scopeTower: ImplicitScopeTower, name: Name,
|
||||
context: CandidateFactory<VariableDescriptor, C>, explicitReceiver: DetailedReceiver?, classValueReceiver: Boolean = true
|
||||
) = CompositeScopeTowerProcessor(
|
||||
createVariableProcessor(scopeTower, name, context, explicitReceiver),
|
||||
createSimpleProcessor(scopeTower, context, explicitReceiver, classValueReceiver) { getObjects(name, it) }
|
||||
)
|
||||
|
||||
fun <C : Candidate<FunctionDescriptor>> createSimpleFunctionProcessor(scopeTower: ImplicitScopeTower, name: Name,
|
||||
context: CandidateFactory<FunctionDescriptor, C>, explicitReceiver: DetailedReceiver?, classValueReceiver: Boolean = true
|
||||
fun <C : Candidate> createSimpleFunctionProcessor(scopeTower: ImplicitScopeTower, name: Name,
|
||||
context: CandidateFactory<FunctionDescriptor, C>, explicitReceiver: DetailedReceiver?, classValueReceiver: Boolean = true
|
||||
) = createSimpleProcessor(scopeTower, context, explicitReceiver, classValueReceiver) { getFunctions(name, it) }
|
||||
|
||||
|
||||
fun <F: Candidate<FunctionDescriptor>, V: Candidate<VariableDescriptor>> createFunctionProcessor(
|
||||
fun <F: Candidate, V: Candidate> createFunctionProcessor(
|
||||
scopeTower: ImplicitScopeTower,
|
||||
name: Name,
|
||||
simpleContext: CandidateFactory<FunctionDescriptor, F>,
|
||||
@@ -217,7 +218,7 @@ fun <F: Candidate<FunctionDescriptor>, V: Candidate<VariableDescriptor>> createF
|
||||
}
|
||||
|
||||
|
||||
fun <D : CallableDescriptor, C: Candidate<D>> createProcessorWithReceiverValueOrEmpty(
|
||||
fun <C: Candidate> createProcessorWithReceiverValueOrEmpty(
|
||||
explicitReceiver: DetailedReceiver?,
|
||||
create: (ReceiverValueWithSmartCastInfo?) -> ScopeTowerProcessor<C>
|
||||
): ScopeTowerProcessor<C> {
|
||||
|
||||
@@ -27,16 +27,14 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastI
|
||||
import org.jetbrains.kotlin.resolve.scopes.utils.parentsWithSelf
|
||||
import java.util.*
|
||||
|
||||
interface Candidate<out D : CallableDescriptor> {
|
||||
val descriptor: D
|
||||
|
||||
interface Candidate {
|
||||
// this operation should be very fast
|
||||
val isSuccessful: Boolean
|
||||
|
||||
val status: ResolutionCandidateStatus
|
||||
}
|
||||
|
||||
interface CandidateFactory<D : CallableDescriptor, out C: Candidate<D>> {
|
||||
interface CandidateFactory<in D : CallableDescriptor, out C: Candidate> {
|
||||
fun createCandidate(
|
||||
towerCandidate: CandidateWithBoundDispatchReceiver<D>,
|
||||
explicitReceiverKind: ExplicitReceiverKind,
|
||||
@@ -44,7 +42,7 @@ interface CandidateFactory<D : CallableDescriptor, out C: Candidate<D>> {
|
||||
): C
|
||||
}
|
||||
|
||||
interface CandidateFactoryProviderForInvoke<F : Candidate<FunctionDescriptor>, V : Candidate<VariableDescriptor>> {
|
||||
interface CandidateFactoryProviderForInvoke<F : Candidate, V : Candidate> {
|
||||
|
||||
fun transformCandidate(variable: V, invoke: F): F
|
||||
|
||||
@@ -69,13 +67,13 @@ interface ScopeTowerProcessor<out C> {
|
||||
}
|
||||
|
||||
class TowerResolver {
|
||||
fun <C: Candidate<*>> runResolve(
|
||||
fun <C: Candidate> runResolve(
|
||||
scopeTower: ImplicitScopeTower,
|
||||
processor: ScopeTowerProcessor<C>,
|
||||
useOrder: Boolean
|
||||
): Collection<C> = scopeTower.run(processor, SuccessfulResultCollector { it.status }, useOrder)
|
||||
|
||||
fun <C: Candidate<*>> collectAllCandidates(
|
||||
fun <C: Candidate> collectAllCandidates(
|
||||
scopeTower: ImplicitScopeTower,
|
||||
processor: ScopeTowerProcessor<C>
|
||||
): Collection<C>
|
||||
|
||||
Reference in New Issue
Block a user