K2: don't report RETURN_TYPE_MISMATCH on last statement returns

#KT-53198 Fixed
This commit is contained in:
Mikhail Glukhikh
2022-07-19 10:45:16 +02:00
committed by Space
parent 0982872959
commit bc396b9765
17 changed files with 69 additions and 9 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.analysis.checkers.expression
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
@@ -36,6 +37,13 @@ object FirFunctionReturnTypeMismatchChecker : FirReturnExpressionChecker() {
context.session.builtinTypes.unitType.coneType
else
targetElement.returnTypeRef.coneType
if (targetElement is FirAnonymousFunction &&
expression.source?.kind is KtFakeSourceElementKind.ImplicitReturn.FromLastStatement &&
functionReturnType.isUnit
) {
return
}
val typeContext = context.session.typeContext
val returnExpressionType = resultExpression.typeRef.coneType
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
object FirReturnSyntaxAndLabelChecker : FirReturnExpressionChecker() {
override fun check(expression: FirReturnExpression, context: CheckerContext, reporter: DiagnosticReporter) {
val source = expression.source
if (source?.kind == KtFakeSourceElementKind.ImplicitReturn) return
if (source?.kind is KtFakeSourceElementKind.ImplicitReturn) return
val labeledElement = expression.target.labeledElement
val targetSymbol = labeledElement.symbol
@@ -40,7 +40,8 @@ object UnreachableCodeChecker : FirControlFlowChecker() {
}
private val sourceKindsToSkip = setOf(
KtFakeSourceElementKind.ImplicitReturn,
KtFakeSourceElementKind.ImplicitReturn.FromExpressionBody,
KtFakeSourceElementKind.ImplicitReturn.FromLastStatement,
KtFakeSourceElementKind.DesugaredForLoop
)