Support common calls on suspend function typed values

Also support multiple value parameters in suspend function type

 #KT-15379 Fixed
 #KT-15380 Fixed
This commit is contained in:
Denis Zharkov
2016-12-21 14:15:46 +03:00
parent d0ba048342
commit 8475869fb3
29 changed files with 299 additions and 77 deletions
@@ -25,8 +25,9 @@ class FunctionClassScope(
containingClass: FunctionClassDescriptor
) : GivenFunctionsMemberScope(storageManager, containingClass) {
override fun computeDeclaredFunctions(): List<FunctionDescriptor> =
if ((containingClass as FunctionClassDescriptor).functionKind == FunctionClassDescriptor.Kind.Function) {
listOf(FunctionInvokeDescriptor.create(containingClass))
when ((containingClass as FunctionClassDescriptor).functionKind) {
FunctionClassDescriptor.Kind.Function -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = false))
FunctionClassDescriptor.Kind.SuspendFunction -> listOf(FunctionInvokeDescriptor.create(containingClass, isSuspend = true))
else -> emptyList()
}
else emptyList()
}
@@ -30,7 +30,8 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
class FunctionInvokeDescriptor private constructor(
container: DeclarationDescriptor,
original: FunctionInvokeDescriptor?,
callableKind: CallableMemberDescriptor.Kind
callableKind: CallableMemberDescriptor.Kind,
isSuspend: Boolean
) : SimpleFunctionDescriptorImpl(
container,
original,
@@ -41,6 +42,7 @@ class FunctionInvokeDescriptor private constructor(
) {
init {
this.isOperator = true
this.isSuspend = isSuspend
this.setHasStableParameterNames(false)
}
@@ -59,7 +61,7 @@ class FunctionInvokeDescriptor private constructor(
annotations: Annotations,
source: SourceElement
): FunctionDescriptorImpl {
return FunctionInvokeDescriptor(newOwner, original as FunctionInvokeDescriptor?, kind)
return FunctionInvokeDescriptor(newOwner, original as FunctionInvokeDescriptor?, kind, isSuspend)
}
override fun isExternal(): Boolean = false
@@ -94,10 +96,10 @@ class FunctionInvokeDescriptor private constructor(
}
companion object Factory {
fun create(functionClass: FunctionClassDescriptor): FunctionInvokeDescriptor {
fun create(functionClass: FunctionClassDescriptor, isSuspend: Boolean): FunctionInvokeDescriptor {
val typeParameters = functionClass.declaredTypeParameters
val result = FunctionInvokeDescriptor(functionClass, null, CallableMemberDescriptor.Kind.DECLARATION)
val result = FunctionInvokeDescriptor(functionClass, null, CallableMemberDescriptor.Kind.DECLARATION, isSuspend)
result.initialize(
null,
functionClass.thisAsReceiverParameter,