[FIR] Apply type arguments for callable references
This commit is contained in:
+11
-13
@@ -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 {
|
||||
|
||||
+3
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user