FIR: enforce the return type of function literals without body

Its return type should be Unit, so do not use the expected type from,
e.g., parameter type.
This commit is contained in:
Jinseong Jeon
2021-02-09 01:50:54 -08:00
committed by Mikhail Glukhikh
parent 9aaa952b39
commit 27c942a0ff
4 changed files with 15 additions and 8 deletions
@@ -6,10 +6,10 @@
package org.jetbrains.kotlin.fir.resolve.inference package org.jetbrains.kotlin.fir.resolve.inference
import org.jetbrains.kotlin.builtins.functions.FunctionClassKind import org.jetbrains.kotlin.builtins.functions.FunctionClassKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.originalForSubstitutionOverride import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.Candidate import org.jetbrains.kotlin.fir.resolve.calls.Candidate
import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator import org.jetbrains.kotlin.fir.scopes.FakeOverrideTypeCalculator
@@ -21,7 +21,6 @@ import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.typeContext
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -248,7 +247,15 @@ fun extractLambdaInfoFromFunctionalType(
if (!expectedType.isBuiltinFunctionalType(session)) return null if (!expectedType.isBuiltinFunctionalType(session)) return null
val receiverType = argument.receiverType ?: expectedType.receiverType(session) val receiverType = argument.receiverType ?: expectedType.receiverType(session)
val returnType = argument.returnType ?: expectedType.returnType(session) ?: return null val lastStatement = argument.body?.statements?.singleOrNull()
val returnType =
// Simply { }, i.e., function literals without body. Raw FIR added an implicit return with an implicit unit type ref.
if (lastStatement?.source?.kind is FirFakeSourceElementKind.ImplicitReturn &&
(lastStatement as? FirReturnExpression)?.result?.source?.kind is FirFakeSourceElementKind.ImplicitUnit
) {
session.builtinTypes.unitType.type
} else
argument.returnType ?: expectedType.returnType(session) ?: return null
val parameters = extractLambdaParameters(expectedType, argument, expectedType.isExtensionFunctionType(session), session) val parameters = extractLambdaParameters(expectedType, argument, expectedType.isExtensionFunctionType(session), session)
return ResolvedLambdaAtom( return ResolvedLambdaAtom(
+1 -1
View File
@@ -10,7 +10,7 @@ fun text() {
bar1 {1} bar1 {1}
bar1 {it + 1} bar1 {it + 1}
bar2 {} <!INAPPLICABLE_CANDIDATE!>bar2<!> {}
bar2 {1} bar2 {1}
bar2 {<!UNRESOLVED_REFERENCE!>it<!>} bar2 {<!UNRESOLVED_REFERENCE!>it<!>}
<!INAPPLICABLE_CANDIDATE!>bar2<!> {it -> it} <!INAPPLICABLE_CANDIDATE!>bar2<!> {it -> it}
@@ -14,6 +14,6 @@ fun <T : ILength> bar(a: (Int) -> T) {
} }
fun test() { fun test() {
foo<String> { } <!INAPPLICABLE_CANDIDATE!>foo<!><String> { }
bar<Impl> { } <!INAPPLICABLE_CANDIDATE!>bar<!><Impl> { }
} }
@@ -14,5 +14,5 @@ fun useJ(j: J) {
} }
fun jj() { fun jj() {
useJ({}) <!INAPPLICABLE_CANDIDATE!>useJ<!>({})
} }