[FIR] Apply type arguments for callable references

This commit is contained in:
Mikhail Glukhikh
2020-03-30 11:49:04 +03:00
parent 8fbc6e37e5
commit d4ae992417
9 changed files with 23 additions and 16 deletions
@@ -52,26 +52,19 @@ internal class CallAndReferenceGenerator(
when (symbol) {
is IrPropertySymbol -> {
IrPropertyReferenceImpl(
startOffset, endOffset, type, symbol, 0,
startOffset, endOffset, type, symbol,
typeArgumentsCount = symbol.owner.getter?.typeParameters?.size ?: 0,
symbol.owner.backingField?.symbol,
symbol.owner.getter?.symbol,
symbol.owner.setter?.symbol
).apply {
if (callableReferenceAccess.explicitReceiver !is FirResolvedQualifier) {
applyReceivers(callableReferenceAccess)
}
}
)
}
is IrFunctionSymbol -> {
IrFunctionReferenceImpl(
startOffset, endOffset, type, symbol,
typeArgumentsCount = 0,
typeArgumentsCount = symbol.owner.typeParameters.size,
reflectionTarget = symbol
).apply {
if (callableReferenceAccess.explicitReceiver !is FirResolvedQualifier) {
applyReceivers(callableReferenceAccess)
}
}
)
}
else -> {
IrErrorCallExpressionImpl(
@@ -79,6 +72,11 @@ internal class CallAndReferenceGenerator(
)
}
}
}.apply {
applyTypeArguments(callableReferenceAccess)
if (callableReferenceAccess.explicitReceiver !is FirResolvedQualifier) {
applyReceivers(callableReferenceAccess)
}
}
}
@@ -300,7 +298,7 @@ internal class CallAndReferenceGenerator(
private fun IrExpression.applyTypeArguments(access: FirQualifiedAccess): IrExpression {
return when (this) {
is IrCallWithIndexedArgumentsBase -> {
is IrMemberAccessExpressionBase -> {
val argumentsCount = access.typeArguments.size
if (argumentsCount <= typeArgumentsCount) {
apply {
@@ -106,6 +106,8 @@ class FirCallCompletionResultsWriterTransformer(
): CompositeTransformResult<FirStatement> {
val calleeReference =
callableReferenceAccess.calleeReference as? FirNamedReferenceWithCandidate ?: return callableReferenceAccess.compose()
val subCandidate = calleeReference.candidate
val typeArguments = computeTypeArguments(callableReferenceAccess, subCandidate)
val typeRef = callableReferenceAccess.typeRef as FirResolvedTypeRef
@@ -114,6 +116,7 @@ class FirCallCompletionResultsWriterTransformer(
val resultType = typeRef.withReplacedConeType(finalType)
callableReferenceAccess.replaceTypeRef(resultType)
callableReferenceAccess.replaceTypeArguments(typeArguments)
return callableReferenceAccess.transformCalleeReference(
StoreCalleeReference,