Refactoring. Move creation of functionProcessor into resolution module.

This commit is contained in:
Stanislav Erokhin
2016-08-24 12:51:34 +03:00
parent 5dc31d2614
commit ca6c6ae0f3
2 changed files with 37 additions and 36 deletions
@@ -165,6 +165,39 @@ fun <C : Candidate<VariableDescriptor>> createVariableAndObjectProcessor(
createSimpleProcessor(context, explicitReceiver, classValueReceiver, ScopeTowerLevel::getObjects)
)
fun <C : Candidate<FunctionDescriptor>> createFunctionProcessor(
fun <C : Candidate<FunctionDescriptor>> createSimpleFunctionProcessor(
context: TowerContext<FunctionDescriptor, C>, explicitReceiver: Receiver?, classValueReceiver: Boolean = true
) = createSimpleProcessor(context, explicitReceiver, classValueReceiver, ScopeTowerLevel::getFunctions)
fun <F: Candidate<FunctionDescriptor>, V: Candidate<VariableDescriptor>> createFunctionProcessor(
simpleContext: TowerContext<FunctionDescriptor, F>,
invokeContext: InvokeTowerContext<F, V>,
explicitReceiver: Receiver?
): CompositeScopeTowerProcessor<F> {
// a.foo() -- simple function call
val simpleFunction = createSimpleFunctionProcessor(simpleContext, explicitReceiver)
// a.foo() -- property a.foo + foo.invoke()
val invokeProcessor = InvokeTowerProcessor(invokeContext, explicitReceiver)
// a.foo() -- property foo is extension function with receiver a -- a.invoke()
val invokeExtensionProcessor = createProcessorWithReceiverValueOrEmpty(explicitReceiver) { InvokeExtensionTowerProcessor(invokeContext, it) }
return CompositeScopeTowerProcessor(simpleFunction, invokeProcessor, invokeExtensionProcessor)
}
fun <D : CallableDescriptor, C: Candidate<D>> createProcessorWithReceiverValueOrEmpty(
explicitReceiver: Receiver?,
create: (ReceiverValue?) -> ScopeTowerProcessor<C>
): ScopeTowerProcessor<C> {
return if (explicitReceiver is QualifierReceiver) {
explicitReceiver.classValueReceiver?.let(create)
?: KnownResultProcessor<C>(listOf())
}
else {
create(explicitReceiver as ReceiverValue?)
}
}