Fix @PublishedApi checking

This commit is contained in:
Mikhael Bogdanov
2017-01-11 10:43:38 +01:00
parent 2931c316a3
commit ec42b58877
3 changed files with 151 additions and 7 deletions
+137 -4
View File
@@ -1,9 +1,40 @@
// !DIAGNOSTICS: -EXPOSED_PARAMETER_TYPE -NOTHING_TO_INLINE
inline fun call(a: A) {
a.test()
testTopLevel()
publishedTopLevel()
a.publishedVar
a.publishedVar = 1
publishedVarTopLevel
publishedVarTopLevel = 1
}
inline var inlineVar: Int
get() {
val a = A()
a.test()
publishedTopLevel()
a.publishedVar
a.publishedVar = 1
publishedVarTopLevel
publishedVarTopLevel = 1
return 1
}
set(value) {
val a = A()
a.test()
publishedTopLevel()
a.publishedVar
a.publishedVar = 1
publishedVarTopLevel
publishedVarTopLevel = 1
}
@PublishedApi
internal class A {
@PublishedApi
@@ -11,6 +42,16 @@ internal class A {
publicFun()
internalFun()
privateFun()
publicVarTopLevel
publicVarTopLevel = 1
internalVarTopLevel
internalVarTopLevel = 1
privateVarTopLevel
privateVarTopLevel = 1
publishedVar
publishedVar = 1
}
@PublishedApi
@@ -18,25 +59,117 @@ internal class A {
publicFun()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalFun<!>()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateFun<!>()
publicVarTopLevel
publicVarTopLevel = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!> = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!> = 1
publishedVar
publishedVar = 1
}
@PublishedApi
internal inline var publishedVar: Int
get() {
publicFun()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalFun<!>()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateFun<!>()
publicVarTopLevel
publicVarTopLevel = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!> = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!> = 1
return 1
}
set(value) {
publicFun()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalFun<!>()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateFun<!>()
publicVarTopLevel
publicVarTopLevel = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!> = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!> = 1
}
}
@PublishedApi
internal fun testTopLevel() {
internal fun publishedTopLevel() {
publicFun()
internalFun()
privateFun()
publicVarTopLevel
publicVarTopLevel = 1
internalVarTopLevel
internalVarTopLevel = 1
privateVarTopLevel
privateVarTopLevel = 1
}
@PublishedApi
inline internal fun testTopLevelInline() {
inline internal fun publishedTopLevelInline() {
publicFun()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalFun<!>()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateFun<!>()
publicVarTopLevel
publicVarTopLevel = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!> = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!> = 1
}
@PublishedApi
inline internal var publishedVarTopLevel: Int
get() {
publicFun()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalFun<!>()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateFun<!>()
publicVarTopLevel
publicVarTopLevel = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!> = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!> = 1
return 1
}
set(value) {
publicFun()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalFun<!>()
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateFun<!>()
publicVarTopLevel
publicVarTopLevel = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>internalVarTopLevel<!> = 1
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!>
<!NON_PUBLIC_CALL_FROM_PUBLIC_INLINE, NON_PUBLIC_CALL_FROM_PUBLIC_INLINE!>privateVarTopLevel<!> = 1
}
fun publicFun() {}
internal fun internalFun() {}
private fun privateFun() {}
var publicVarTopLevel = 1
internal var internalVarTopLevel = 1
private var privateVarTopLevel = 1
@@ -1,14 +1,20 @@
package
public var inlineVar: kotlin.Int
internal var internalVarTopLevel: kotlin.Int
private var privateVarTopLevel: kotlin.Int
public var publicVarTopLevel: kotlin.Int
@kotlin.PublishedApi internal var publishedVarTopLevel: kotlin.Int
public inline fun call(/*0*/ a: A): kotlin.Unit
internal fun internalFun(): kotlin.Unit
private fun privateFun(): kotlin.Unit
public fun publicFun(): kotlin.Unit
@kotlin.PublishedApi internal fun testTopLevel(): kotlin.Unit
@kotlin.PublishedApi internal inline fun testTopLevelInline(): kotlin.Unit
@kotlin.PublishedApi internal fun publishedTopLevel(): kotlin.Unit
@kotlin.PublishedApi internal inline fun publishedTopLevelInline(): kotlin.Unit
@kotlin.PublishedApi internal final class A {
public constructor A()
@kotlin.PublishedApi internal final var publishedVar: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@kotlin.PublishedApi internal final fun test(): kotlin.Unit
@@ -238,13 +238,18 @@ private fun Visibility.forVisibility(descriptor: DeclarationDescriptor, checkPub
Visibilities.PRIVATE, Visibilities.PRIVATE_TO_THIS, Visibilities.INVISIBLE_FAKE -> Private
Visibilities.PROTECTED -> Protected(descriptor.containingDeclaration as? ClassDescriptor)
Visibilities.INTERNAL -> if (!checkPublishedApi ||
!descriptor.annotations.hasAnnotation(KotlinBuiltIns.FQ_NAMES.publishedApi)) Internal else Public
!descriptor.isPublishedApi()) Internal else Public
Visibilities.PUBLIC -> Public
Visibilities.LOCAL -> Local
// NB: visibility must be already normalized here, so e.g. no JavaVisibilities are possible at this point
else -> throw AssertionError("Visibility $name is not allowed in forVisibility")
}
private fun DeclarationDescriptor.isPublishedApi(): Boolean {
val descriptor = if (this is CallableMemberDescriptor) DescriptorUtils.getDirectMember(this) else this
return descriptor.annotations.hasAnnotation(KotlinBuiltIns.FQ_NAMES.publishedApi)
}
fun effectiveVisibility(visibility: Visibility, descriptor: DeclarationDescriptor, checkPublishedApi: Boolean = false) =
visibility.forVisibility(descriptor, checkPublishedApi)