From 5f0e7c3c3fc00fa6a3530b72fa00ee6dfe9cce83 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 8 Sep 2020 14:24:00 +0300 Subject: [PATCH] Check return type of `internal @PublishedApi` functions in Explicit API mode #KT-38981 Fixed --- .../resolve/checkers/ExplicitApiDeclarationChecker.kt | 7 +++++-- .../diagnostics/testsWithExplicitApi/publishedApi.kt | 7 +++++++ .../checkers/DiagnosticsWithExplicitApiGenerated.java | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithExplicitApi/publishedApi.kt 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");