[FIR] Fix 1.(fun Int.() = 1)() call fir conversion

This commit is contained in:
Ivan Kochurkin
2021-11-23 22:47:36 +03:00
committed by Space
parent 2fd8119a10
commit 9f8387c76a
11 changed files with 45 additions and 31 deletions
@@ -551,6 +551,7 @@ class ExpressionsConverter(
}
}
var result = firSelector
(firSelector as? FirQualifiedAccess)?.let {
if (isSafe) {
@OptIn(FirImplementationDetail::class)
@@ -561,13 +562,10 @@ class ExpressionsConverter(
)
}
it.replaceExplicitReceiver(firReceiver)
@OptIn(FirImplementationDetail::class)
it.replaceSource(dotQualifiedExpression.toFirSourceElement())
result = convertFirSelector(it, dotQualifiedExpression.toFirSourceElement(), firReceiver!!) as? FirExpression
}
return firSelector ?: buildErrorExpression(
return result ?: buildErrorExpression(
null,
ConeSimpleDiagnostic("Qualified expression without selector", DiagnosticKind.Syntax)
)
@@ -2374,10 +2374,7 @@ open class RawFirBuilder(
)
}
firSelector.replaceExplicitReceiver(receiver)
@OptIn(FirImplementationDetail::class)
firSelector.replaceSource(expression.toFirSourceElement())
return convertFirSelector(firSelector, expression.toFirSourceElement(), receiver)
}
return firSelector
}
@@ -1266,6 +1266,31 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
}
}
protected fun convertFirSelector(
firSelector: FirQualifiedAccess,
source: KtSourceElement?,
receiver: FirExpression
): FirQualifiedAccess {
return if (firSelector is FirImplicitInvokeCall) {
buildImplicitInvokeCall {
this.source = source
annotations.addAll(firSelector.annotations)
typeArguments.addAll(firSelector.typeArguments)
explicitReceiver = firSelector.explicitReceiver
argumentList = buildArgumentList {
arguments.add(receiver)
arguments.addAll(firSelector.arguments)
}
calleeReference = firSelector.calleeReference
}
} else {
firSelector.replaceExplicitReceiver(receiver)
@OptIn(FirImplementationDetail::class)
firSelector.replaceSource(source)
firSelector
}
}
protected fun convertValueParameterName(
safeName: Name,
rawName: String?,