From c46a393a19b477d2f6ea609d77b9f754963845eb Mon Sep 17 00:00:00 2001 From: Andrey Zinovyev Date: Thu, 22 Jul 2021 15:33:00 +0300 Subject: [PATCH] [FIR] Add REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE diagnostic --- .../diagnostics/FirDiagnosticsList.kt | 2 + .../fir/analysis/diagnostics/FirErrors.kt | 1 + .../FirInlineDeclarationChecker.kt | 8 +++- .../diagnostics/FirDefaultErrorMessages.kt | 6 +++ .../inlineSuspendOfSuspend.fir.kt | 2 +- .../suspendFunctionType/inline.fir.kt | 45 ------------------- .../coroutines/suspendFunctionType/inline.kt | 1 + .../diagnostics/KtFirDataClassConverters.kt | 6 +++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 4 ++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 7 +++ 10 files changed, 34 insertions(+), 48 deletions(-) delete mode 100644 compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt 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 a87193ab2a1..73a6786070a 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 @@ -1192,6 +1192,8 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val ILLEGAL_INLINE_PARAMETER_MODIFIER by error(PositioningStrategy.INLINE_PARAMETER_MODIFIER) val INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED by error() + + val REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE by warning(PositioningStrategy.SUSPEND_MODIFIER) } val IMPORTS by object : DiagnosticGroup("Imports") { 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 cf6d95728fa..8c1fef3c52b 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 @@ -616,6 +616,7 @@ 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) // Imports val CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON by error1(SourceElementPositioningStrategies.IMPORT_LAST_NAME) 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 567b42a4a0b..704cbf1e8da 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 @@ -364,8 +364,12 @@ object FirInlineDeclarationChecker : FirFunctionChecker() { ) } - if (!function.isSuspend && isSuspendFunctionalType && !param.isCrossinline) { - reporter.reportOn(param.source, FirErrors.INLINE_SUSPEND_FUNCTION_TYPE_UNSUPPORTED, context) + if (isSuspendFunctionalType && !param.isCrossinline) { + if (function.isSuspend) { + 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 (coneType.isNullable && isFunctionalType) { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index 72b6edcb54d..4a414e47ca7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -333,6 +333,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDECLARATION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_ANNOTATION_TARGET import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_CALL_OF_CONVERSION_METHOD 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_MODALITY_MODIFIER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_MODIFIER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.REDUNDANT_OPEN_IN_INTERFACE @@ -1524,6 +1525,11 @@ class FirDefaultErrorMessages { "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." + ) + //imports map.put( CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON, diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt index e0357c42b23..f5341a4cae7 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/inlineCrossinline/inlineSuspendOfSuspend.fir.kt @@ -16,7 +16,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 deleted file mode 100644 index a371537ee52..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.fir.kt +++ /dev/null @@ -1,45 +0,0 @@ -// !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 d85fd39c177..7e51c39da69 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendFunctionType/inline.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER // SKIP_TXT inline fun foo1(x: suspend () -> Unit) {} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 87a01fdc784..6570fba07cf 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -3217,6 +3217,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE) { firDiagnostic -> + RedundantInlineSuspendFunctionTypeImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirErrors.CANNOT_ALL_UNDER_IMPORT_FROM_SINGLETON) { firDiagnostic -> CannotAllUnderImportFromSingletonImpl( firDiagnostic.a, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index a9451ed052c..cf66e699d04 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2244,6 +2244,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = InlineSuspendFunctionTypeUnsupported::class } + abstract class RedundantInlineSuspendFunctionType : KtFirDiagnostic() { + override val diagnosticClass get() = RedundantInlineSuspendFunctionType::class + } + abstract class CannotAllUnderImportFromSingleton : KtFirDiagnostic() { override val diagnosticClass get() = CannotAllUnderImportFromSingleton::class abstract val objectName: Name diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 54568fdedca..0a541155204 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3625,6 +3625,13 @@ internal class InlineSuspendFunctionTypeUnsupportedImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class RedundantInlineSuspendFunctionTypeImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.RedundantInlineSuspendFunctionType(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class CannotAllUnderImportFromSingletonImpl( override val objectName: Name, firDiagnostic: FirPsiDiagnostic,