diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExplicitApiDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExplicitApiDeclarationChecker.kt index f3a256faac1..8e48b58c3f2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExplicitApiDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExplicitApiDeclarationChecker.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyPublicApi +import org.jetbrains.kotlin.resolve.descriptorUtil.isPublishedApi class ExplicitApiDeclarationChecker : DeclarationChecker { override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { @@ -22,7 +23,7 @@ class ExplicitApiDeclarationChecker : DeclarationChecker { if (descriptor !is DeclarationDescriptorWithVisibility) return if (descriptor is ClassDescriptor && descriptor.kind == ClassKind.ENUM_ENTRY) return // Enum entries does not have visibilities - if (!descriptor.isEffectivelyPublicApi) return + if (!descriptor.isEffectivelyPublicApi && !descriptor.isPublishedApi()) return checkVisibilityModifier(state, declaration, descriptor, context) checkExplicitReturnType(state, declaration, descriptor, context) @@ -105,7 +106,9 @@ class ExplicitApiDeclarationChecker : DeclarationChecker { val callableMemberDescriptor = descriptor as? CallableMemberDescriptor val visibility = callableMemberDescriptor?.effectiveVisibility()?.toVisibility() - return (checkForPublicApi && visibility?.isPublicAPI == true) || (checkForInternal && visibility == Visibilities.Internal) || + val isPublicApi = + visibility?.isPublicAPI == true || (visibility == Visibilities.Internal && callableMemberDescriptor.isPublishedApi()) + return (checkForPublicApi && isPublicApi) || (checkForInternal && visibility == Visibilities.Internal) || (checkForPrivate && visibility == Visibilities.Internal) } diff --git a/compiler/testData/diagnostics/testsWithExplicitApi/publishedApi.kt b/compiler/testData/diagnostics/testsWithExplicitApi/publishedApi.kt new file mode 100644 index 00000000000..fbfaf04ef18 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithExplicitApi/publishedApi.kt @@ -0,0 +1,7 @@ +// SKIP_TXT +// WITH_RUNTIME + +public class A { + @PublishedApi + internal fun foo() = 1 +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithExplicitApiGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithExplicitApiGenerated.java index d09f0f826f2..84418a4e773 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithExplicitApiGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithExplicitApiGenerated.java @@ -68,6 +68,11 @@ public class DiagnosticsWithExplicitApiGenerated extends AbstractDiagnosticsWith runTest("compiler/testData/diagnostics/testsWithExplicitApi/properties.kt"); } + @TestMetadata("publishedApi.kt") + public void testPublishedApi() throws Exception { + runTest("compiler/testData/diagnostics/testsWithExplicitApi/publishedApi.kt"); + } + @TestMetadata("toplevel.kt") public void testToplevel() throws Exception { runTest("compiler/testData/diagnostics/testsWithExplicitApi/toplevel.kt");