[FIR] Report UNSUPPORTED_SUSPEND_TEST ^KT-60002 Fixed
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 eafffc7..9387e72 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
@@ -82,6 +82,12 @@ token, ) } + add(FirErrors.UNSUPPORTED_SUSPEND_TEST) { firDiagnostic -> + UnsupportedSuspendTestImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.NEW_INFERENCE_ERROR) { firDiagnostic -> NewInferenceErrorImpl( 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 73bd7a9..3798d67 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
@@ -102,6 +102,10 @@ val unsupportedFeature: Pair<LanguageFeature, LanguageVersionSettings> } + interface UnsupportedSuspendTest : KtFirDiagnostic<PsiElement> { + override val diagnosticClass get() = UnsupportedSuspendTest::class + } + interface NewInferenceError : KtFirDiagnostic<PsiElement> { override val diagnosticClass get() = NewInferenceError::class val error: String
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 642e1b9..84281ec 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
@@ -104,6 +104,11 @@ token: KtLifetimeToken, ) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.UnsupportedFeature +internal class UnsupportedSuspendTestImpl( + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.UnsupportedSuspendTest + internal class NewInferenceErrorImpl( override val error: String, 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 5383690..2a73120 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
@@ -53,6 +53,7 @@ val UNSUPPORTED_FEATURE by error<PsiElement> { parameter<Pair<LanguageFeature, LanguageVersionSettings>>("unsupportedFeature") } + val UNSUPPORTED_SUSPEND_TEST by error<PsiElement>() val NEW_INFERENCE_ERROR by error<PsiElement> { parameter<String>("error") }
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 4b5f843..a0970ef 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
@@ -118,6 +118,7 @@ // Meta-errors val UNSUPPORTED by error1<PsiElement, String>() val UNSUPPORTED_FEATURE by error1<PsiElement, Pair<LanguageFeature, LanguageVersionSettings>>() + val UNSUPPORTED_SUSPEND_TEST by error0<PsiElement>() val NEW_INFERENCE_ERROR by error1<PsiElement, String>() // Miscellaneous
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt index 856282a..b475c45 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt
@@ -48,6 +48,7 @@ FirFunctionParameterChecker, FirFunctionReturnChecker, FirInlineDeclarationChecker, + FirSuspendLimitationsChecker, ) override val simpleFunctionCheckers: Set<FirSimpleFunctionChecker>
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSuspendLimitationsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSuspendLimitationsChecker.kt new file mode 100644 index 0000000..f9b0871 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSuspendLimitationsChecker.kt
@@ -0,0 +1,43 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.checkers.declaration + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.getModifier +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.FirFunction +import org.jetbrains.kotlin.fir.declarations.toAnnotationClassId +import org.jetbrains.kotlin.fir.declarations.utils.isSuspend +import org.jetbrains.kotlin.fir.expressions.FirAnnotation +import org.jetbrains.kotlin.fir.types.ConeClassLikeType +import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.name.StandardClassIds + +object FirSuspendLimitationsChecker : FirFunctionChecker() { + override fun check(declaration: FirFunction, context: CheckerContext, reporter: DiagnosticReporter) { + if (!declaration.isSuspend) { + return + } + + if (declaration.annotations.any { it.isKotlinTestAnnotation(context.session) }) { + declaration.getModifier(KtTokens.SUSPEND_KEYWORD)?.let { + reporter.reportOn(it.source, FirErrors.UNSUPPORTED_SUSPEND_TEST, context) + } + } + } + + private fun FirAnnotation.isKotlinTestAnnotation(session: FirSession): Boolean { + val nonExpandedType = annotationTypeRef.coneType as? ConeClassLikeType + return nonExpandedType?.lookupTag?.classId == StandardClassIds.Annotations.Test + || toAnnotationClassId(session) == StandardClassIds.Annotations.Test + } +} + +
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 f92a545..3430e4b 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
@@ -603,6 +603,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_CLASS_LITERALS_WITH_EMPTY_LHS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_CONTEXTUAL_DECLARATION_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_FEATURE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNSUPPORTED_SUSPEND_TEST import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UNUSED_VARIABLE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UPPER_BOUND_IS_EXTENSION_FUNCTION_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.UPPER_BOUND_VIOLATED @@ -671,6 +672,7 @@ // Meta-errors map.put(UNSUPPORTED, "Unsupported [{0}]", TO_STRING) map.put(UNSUPPORTED_FEATURE, "{0}", LanguageFeatureMessageRenderer(LanguageFeatureMessageRenderer.Type.UNSUPPORTED)) + map.put(UNSUPPORTED_SUSPEND_TEST, "'suspend' functions annotated with @kotlin.test.Test are unsupported") map.put(NEW_INFERENCE_ERROR, "New inference error [{0}]", STRING) // Miscellaneous
diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendTest.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendTest.fir.kt deleted file mode 100644 index ccbbf46..0000000 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendTest.fir.kt +++ /dev/null
@@ -1,21 +0,0 @@ -// ALLOW_KOTLIN_PACKAGE -// SKIP_TXT -// FILE: test.kt - -package kotlin.test - -annotation class IrrelevantClass - -public typealias Test = IrrelevantClass - -// FILE: main.kt - -import kotlin.test.Test - -class A { - @Test - suspend fun test() {} -} - -@Test -suspend fun test() {}
diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendTest.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendTest.kt index 6d87662..6fe994b 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendTest.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/suspendTest.kt
@@ -1,3 +1,4 @@ +// FIR_IDENTICAL // ALLOW_KOTLIN_PACKAGE // SKIP_TXT // FILE: test.kt
diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt index 6c83c62..223517c 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt
@@ -21,6 +21,7 @@ val BASE_ENUMS_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("enums")) val BASE_CONTRACTS_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("contracts")) val BASE_CONCURRENT_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("concurrent")) + val BASE_TEST_PACKAGE = BASE_KOTLIN_PACKAGE.child(Name.identifier("test")) val builtInsPackages = setOf( BASE_KOTLIN_PACKAGE, @@ -175,6 +176,8 @@ val Volatile = "Volatile".concurrentId() + val Test = "Test".testId() + val RawTypeAnnotation = "RawType".internalIrId() val FlexibleNullability = "FlexibleNullability".internalIrId() val FlexibleMutability = "FlexibleMutability".internalIrId() @@ -268,6 +271,8 @@ private fun String.enumsId() = ClassId(StandardClassIds.BASE_ENUMS_PACKAGE, Name.identifier(this)) private fun String.concurrentId() = ClassId(StandardClassIds.BASE_CONCURRENT_PACKAGE, Name.identifier(this)) +private fun String.testId() = ClassId(StandardClassIds.BASE_TEST_PACKAGE, Name.identifier(this)) + private fun String.callableId(packageName: FqName) = CallableId(packageName, Name.identifier(this)) private fun String.callableId(classId: ClassId) = CallableId(classId, Name.identifier(this))