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 d6cf5807e18..09b6b6e2881 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 @@ -1177,6 +1177,8 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val DECLARATION_CANT_BE_INLINED by error(PositioningStrategy.DECLARATION_SIGNATURE) val OVERRIDE_BY_INLINE by warning(PositioningStrategy.DECLARATION_SIGNATURE) + + val NON_INTERNAL_PUBLISHED_API by error() val REIFIED_TYPE_PARAMETER_IN_OVERRIDE by error(PositioningStrategy.REIFIED_MODIFIER) 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 5aa47710461..bfafed29757 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 @@ -610,6 +610,7 @@ object FirErrors { val SUPER_CALL_FROM_PUBLIC_INLINE by warning1>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) val DECLARATION_CANT_BE_INLINED by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val OVERRIDE_BY_INLINE by warning0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) + val NON_INTERNAL_PUBLISHED_API by error0() val REIFIED_TYPE_PARAMETER_IN_OVERRIDE by error0(SourceElementPositioningStrategies.REIFIED_MODIFIER) val INLINE_PROPERTY_WITH_BACKING_FIELD by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) 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 d22a36625ac..0bef2b5492b 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 @@ -130,6 +130,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { override val annotatedDeclarationCheckers: Set get() = setOf( FirAnnotationChecker, + FirPublishedApiChecker, ) override val typeAliasCheckers: Set diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPublishedApiChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPublishedApiChecker.kt new file mode 100644 index 00000000000..e22c7404546 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirPublishedApiChecker.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2021 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.builtins.StandardNames +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.analysis.diagnostics.reportOn +import org.jetbrains.kotlin.fir.declarations.FirAnnotatedDeclaration +import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.declarations.getAnnotationsByFqName +import org.jetbrains.kotlin.fir.declarations.utils.visibility + +object FirPublishedApiChecker : FirAnnotatedDeclarationChecker() { + override fun check(declaration: FirAnnotatedDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { + if (declaration !is FirMemberDeclaration) return + if (declaration.visibility == Visibilities.Internal) return + val annotation = declaration.getAnnotationsByFqName(StandardNames.FqNames.publishedApi).firstOrNull() ?: return + reporter.reportOn(annotation.source, FirErrors.NON_INTERNAL_PUBLISHED_API, context) + } +} \ No newline at end of file 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 b6ebc3473a4..504e232980f 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 @@ -264,6 +264,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_ABSTRACT_FUNC import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_EXHAUSTIVE_WHEN_STATEMENT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_FINAL_MEMBER_IN_FINAL_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_FINAL_MEMBER_IN_OBJECT +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_INTERNAL_PUBLISHED_API import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_LOCAL_RETURN_NOT_ALLOWED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_LOCAL_SUSPENSION_POINT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_MEMBER_FUNCTION_NO_BODY @@ -936,6 +937,7 @@ class FirDefaultErrorMessages { map.put(OVERRIDE_BY_INLINE, "Override by an inline function") map.put(REIFIED_TYPE_PARAMETER_IN_OVERRIDE, "Override by a function with reified type parameter") map.put(INLINE_PROPERTY_WITH_BACKING_FIELD, "Inline property cannot have backing field") + map.put(NON_INTERNAL_PUBLISHED_API, "@PublishedApi annotation is only applicable for internal declaration") map.put(RESERVED_MEMBER_INSIDE_INLINE_CLASS, "Member with the name ''{0}'' is reserved for future releases", TO_STRING) map.put( SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS, diff --git a/compiler/testData/diagnostics/tests/publishedApi.fir.kt b/compiler/testData/diagnostics/tests/publishedApi.fir.kt deleted file mode 100644 index a1d00b75dcc..00000000000 --- a/compiler/testData/diagnostics/tests/publishedApi.fir.kt +++ /dev/null @@ -1,71 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_PARAMETER -@kotlin.PublishedApi -class A - -@kotlin.PublishedApi -internal class B - -@kotlin.PublishedApi -private class C - - -@kotlin.PublishedApi -fun a() {} - -@kotlin.PublishedApi -internal fun b() {} - -@kotlin.PublishedApi -internal fun c() {} - - -@kotlin.PublishedApi -var ap = 1 - -@kotlin.PublishedApi -internal var bp = 1 - -@kotlin.PublishedApi -internal var c = 1 - - - -class E { - @kotlin.PublishedApi - fun a() {} - - @kotlin.PublishedApi - internal fun b() {} - - @kotlin.PublishedApi - private fun c() {} - - @kotlin.PublishedApi - protected fun d() {} - - - @kotlin.PublishedApi - val ap = 1 - - @kotlin.PublishedApi - internal val bp = 1 - - @kotlin.PublishedApi - protected val c = 1 - - @kotlin.PublishedApi - private val d = 1 -} - - -class D @kotlin.PublishedApi constructor() { - - @kotlin.PublishedApi - constructor(a: String) : this() - - @kotlin.PublishedApi - private constructor(a: String, b: String): this() - - @kotlin.PublishedApi - internal constructor(a: String, b: String, c: String): this() -} diff --git a/compiler/testData/diagnostics/tests/publishedApi.kt b/compiler/testData/diagnostics/tests/publishedApi.kt index b51dff2487e..ecbde6372ac 100644 --- a/compiler/testData/diagnostics/tests/publishedApi.kt +++ b/compiler/testData/diagnostics/tests/publishedApi.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_PARAMETER @kotlin.PublishedApi class A 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 3f516d61bdf..c913fb1c068 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 @@ -3179,6 +3179,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.NON_INTERNAL_PUBLISHED_API) { firDiagnostic -> + NonInternalPublishedApiImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } add(FirErrors.REIFIED_TYPE_PARAMETER_IN_OVERRIDE) { firDiagnostic -> ReifiedTypeParameterInOverrideImpl( firDiagnostic as FirPsiDiagnostic, 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 2cc3f64deed..3da7c7a190d 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 @@ -2218,6 +2218,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = OverrideByInline::class } + abstract class NonInternalPublishedApi : KtFirDiagnostic() { + override val diagnosticClass get() = NonInternalPublishedApi::class + } + abstract class ReifiedTypeParameterInOverride : KtFirDiagnostic() { override val diagnosticClass get() = ReifiedTypeParameterInOverride::class } 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 adf08360b88..315b021d3ef 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 @@ -3581,6 +3581,13 @@ internal class OverrideByInlineImpl( override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class NonInternalPublishedApiImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.NonInternalPublishedApi(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class ReifiedTypeParameterInOverrideImpl( firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken,