Check return type of internal @PublishedApi functions in Explicit API mode

#KT-38981 Fixed
This commit is contained in:
Leonid Startsev
2020-09-08 14:24:00 +03:00
parent a9972913a6
commit 5f0e7c3c3f
3 changed files with 17 additions and 2 deletions
@@ -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)
}
@@ -0,0 +1,7 @@
// SKIP_TXT
// WITH_RUNTIME
public class A {
@PublishedApi
internal fun <!NO_EXPLICIT_RETURN_TYPE_IN_API_MODE!>foo<!>() = 1
}
@@ -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");