FE: forbid extension calls on inline functional parameters

Extension receivers are currently implicitly noinline, and changing that
would require modifying the syntax to allow marking them noinline or
crossinline.

^KT-5837 Open
^KT-25787 Fixed
^KT-47965 Fixed
^KT-50107 Fixed
^KT-52403 Fixed
This commit is contained in:
pyos
2022-05-19 13:09:52 +02:00
committed by Space
parent efa267bf86
commit fad35b95d4
32 changed files with 59 additions and 356 deletions
@@ -187,7 +187,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
if (receiverSymbol in inalienableParameters) {
if (!isInvokeOrInlineExtension(targetSymbol)) {
reporter.reportOn(
qualifiedAccessExpression.source,
receiverExpression.source ?: qualifiedAccessExpression.source,
FirErrors.USAGE_IS_NOT_INLINABLE,
receiverSymbol,
context
@@ -198,7 +198,8 @@ object FirInlineDeclarationChecker : FirFunctionChecker() {
private fun isInvokeOrInlineExtension(targetSymbol: FirBasedSymbol<*>?): Boolean {
if (targetSymbol !is FirNamedFunctionSymbol) return false
if (targetSymbol.isInline) return true
// TODO: receivers are currently not inline (KT-5837)
// if (targetSymbol.isInline) return true
return targetSymbol.name == OperatorNameConventions.INVOKE &&
targetSymbol.dispatchReceiverType?.isBuiltinFunctionalType(session) == true
}