From 0298d17987bbb44a0683758b4cf887a166a76dad Mon Sep 17 00:00:00 2001 From: Brian Norman Date: Thu, 1 Jun 2023 06:06:00 -0500 Subject: [PATCH] [FIR] Remove suspend lambda redundant warning for inline functions #KT-57971 Fixed --- .../diagnostics/KtFirDataClassConverters.kt | 6 --- .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 -- .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 5 --- .../diagnostics/FirDiagnosticsList.kt | 2 - .../fir/analysis/diagnostics/FirErrors.kt | 1 - .../FirInlineDeclarationChecker.kt | 13 +----- .../diagnostics/FirErrorsDefaultMessages.kt | 6 --- .../inlineSuspendOfSuspend.fir.kt | 2 +- .../suspendFunctionType/inline.fir.kt | 45 +++++++++++++++++++ .../coroutines/suspendFunctionType/inline.kt | 1 - 10 files changed, 48 insertions(+), 37 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index ecd7a80b0f3..8e7b19bee01 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4322,12 +4322,6 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } - add(FirErrors.REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE) { firDiagnostic -> - RedundantInlineSuspendFunctionTypeImpl( - firDiagnostic as KtPsiDiagnostic, - token, - ) - } add(FirErrors.INEFFICIENT_EQUALS_OVERRIDING_IN_VALUE_CLASS) { firDiagnostic -> InefficientEqualsOverridingInValueClassImpl( firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a), diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 5a7908083e0..98d616d2b25 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -3014,10 +3014,6 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = InlineSuspendFunctionTypeUnsupported::class } - interface RedundantInlineSuspendFunctionType : KtFirDiagnostic { - override val diagnosticClass get() = RedundantInlineSuspendFunctionType::class - } - interface InefficientEqualsOverridingInValueClass : KtFirDiagnostic { override val diagnosticClass get() = InefficientEqualsOverridingInValueClass::class val type: KtType diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index d9c2250abf1..6b564e05888 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3635,11 +3635,6 @@ internal class InlineSuspendFunctionTypeUnsupportedImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.InlineSuspendFunctionTypeUnsupported -internal class RedundantInlineSuspendFunctionTypeImpl( - firDiagnostic: KtPsiDiagnostic, - token: KtLifetimeToken, -) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.RedundantInlineSuspendFunctionType - internal class InefficientEqualsOverridingInValueClassImpl( override val type: KtType, firDiagnostic: KtPsiDiagnostic, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 520bc4f1b72..02181c02777 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -1519,8 +1519,6 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED by error() - val REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE by warning(PositioningStrategy.SUSPEND_MODIFIER) - val INEFFICIENT_EQUALS_OVERRIDING_IN_VALUE_CLASS by warning(PositioningStrategy.DECLARATION_NAME) { parameter("type") } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 7bcf1bee429..ee2dab46694 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -771,7 +771,6 @@ object FirErrors { val INLINE_PROPERTY_WITH_BACKING_FIELD by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val ILLEGAL_INLINE_PARAMETER_MODIFIER by error0(SourceElementPositioningStrategies.INLINE_PARAMETER_MODIFIER) val INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED by error0() - val REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE by warning0(SourceElementPositioningStrategies.SUSPEND_MODIFIER) val INEFFICIENT_EQUALS_OVERRIDING_IN_VALUE_CLASS by warning1(SourceElementPositioningStrategies.DECLARATION_NAME) // Imports diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt index c93bd81f367..48d9cad5b23 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContextForProvider -import org.jetbrains.kotlin.fir.analysis.checkers.getModifier import org.jetbrains.kotlin.fir.analysis.checkers.inlineCheckerExtension import org.jetbrains.kotlin.fir.analysis.checkers.isInlineOnly import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope @@ -36,7 +35,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visitors.FirDefaultVisitor import org.jetbrains.kotlin.fir.visitors.FirVisitor -import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled @@ -404,15 +402,8 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { context.session.inlineCheckerExtension?.checkSuspendFunctionalParameterWithDefaultValue(param, context, reporter) } - if (isSuspendFunctionType && !param.isCrossinline) { - if (function.isSuspend) { - val modifier = param.returnTypeRef.getModifier(KtTokens.SUSPEND_KEYWORD) - if (modifier != null) { - reporter.reportOn(param.returnTypeRef.source, FirErrors.REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE, context) - } - } else { - reporter.reportOn(param.source, FirErrors.INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED, context) - } + if (isSuspendFunctionType && !param.isCrossinline && !function.isSuspend) { + reporter.reportOn(param.source, FirErrors.INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED, context) } if (coneType.isNullable && isFunctionalType) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 37304367fe1..4998a8bbaef 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -469,7 +469,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_ANNOTAT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_CALL_OF_CONVERSION_METHOD import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_EXPLICIT_BACKING_FIELD import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_EXPLICIT_TYPE -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_LABEL_WARNING import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_MODALITY_MODIFIER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_MODIFIER @@ -2187,11 +2186,6 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { "Suspend inline lambda parameters of non-suspend function type are not supported. Add 'noinline' or 'crossinline' modifier." ) - map.put( - REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE, - "Redundant 'suspend' modifier: lambda parameters of suspend function type uses existing continuation." - ) - map.put( INEFFICIENT_EQUALS_OVERRIDING_IN_VALUE_CLASS, "Overriding ''equals'' from ''Any'' in value class without operator ''equals(other: {0}): Boolean'' leads to boxing on every equality comparison", diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt index 6065e065bdd..52875b08838 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt @@ -17,7 +17,7 @@ interface SuspendRunnable { // Block is NOT allowed to be called from nested classes/lambdas (as common crossinlines) // It is NOT possible to call startCoroutine on the parameter // suspend calls possible inside lambda matching to the parameter -suspend inline fun test(c: suspend () -> Unit) { +suspend inline fun test(c: suspend () -> Unit) { c() val o = object: SuspendRunnable { override suspend fun run() { diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt new file mode 100644 index 00000000000..a371537ee52 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt @@ -0,0 +1,45 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER +// SKIP_TXT +inline fun foo1(x: suspend () -> Unit) {} +inline fun foo2(crossinline x: suspend () -> Unit) {} +inline fun foo3(noinline x: suspend () -> Unit) {} +inline fun foo4(noinline crossinline x: suspend () -> Unit) {} + +suspend inline fun bar1(x: suspend () -> Unit) {} +suspend inline fun bar2(crossinline x: suspend () -> Unit) {} +suspend inline fun bar3(noinline x: suspend () -> Unit) {} +suspend inline fun bar4(noinline crossinline x: suspend () -> Unit) {} + +suspend fun baz() { + foo1 { + return@baz + } + + foo2 { + return@baz + } + + foo3 { + return@baz + } + + foo4 { + return@baz + } + + bar1 { + return@baz + } + + bar2 { + return@baz + } + + bar3 { + return@baz + } + + bar4 { + return@baz + } +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.kt index 7e51c39da69..d85fd39c177 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER // SKIP_TXT inline fun foo1(x: suspend () -> Unit) {}