Do not require experimental propagation for body usages in same module

Unless it's a usage inside the body of an effectively public inline
function

 #KT-22759 In Progress
This commit is contained in:
Alexander Udalov
2018-01-02 18:49:34 +01:00
parent 6d4e8f3781
commit 29c35e6686
37 changed files with 511 additions and 50 deletions
@@ -1,5 +1,6 @@
// !API_VERSION: 1.3
// !DIAGNOSTICS: -UNUSED_PARAMETER
// MODULE: api
// FILE: api.kt
package api
@@ -14,6 +15,7 @@ annotation class ExperimentalAPI
AnnotationTarget.VALUE_PARAMETER)
annotation class EAnno
// MODULE: usage1(api)
// FILE: usage-propagate.kt
package usage1
@@ -59,6 +61,7 @@ val inProperty = @EAnno fun() {}
val inPropertyAccessor: () -> Unit
get() = @EAnno fun() {}
// MODULE: usage2(api)
// FILE: usage-use.kt
package usage2
@@ -102,6 +105,7 @@ val inPropertyAccessor: () -> Unit
@UseExperimental(ExperimentalAPI::class)
get() = @EAnno fun() {}
// MODULE: usage3(api)
// FILE: usage-none.kt
package usage3
@@ -1,3 +1,4 @@
// -- Module: <api> --
package
package api {
@@ -17,6 +18,13 @@ package api {
}
}
// -- Module: <usage1> --
package
package api {
}
package usage1 {
@api.ExperimentalAPI public val inProperty: () -> kotlin.Unit
@api.ExperimentalAPI public val inPropertyAccessor: () -> kotlin.Unit
@@ -45,6 +53,13 @@ package usage1 {
@api.ExperimentalAPI @api.EAnno public typealias Typealias = kotlin.Unit
}
// -- Module: <usage2> --
package
package api {
}
package usage2 {
@kotlin.UseExperimental(markerClass = {api.ExperimentalAPI::class}) public val inProperty: () -> kotlin.Unit
public val inPropertyAccessor: () -> kotlin.Unit
@@ -73,6 +88,13 @@ package usage2 {
@kotlin.UseExperimental(markerClass = {api.ExperimentalAPI::class}) @api.EAnno public typealias Typealias = kotlin.Unit
}
// -- Module: <usage3> --
package
package api {
}
package usage3 {
public val inProperty: () -> kotlin.Unit
public val inPropertyAccessor: () -> kotlin.Unit
@@ -0,0 +1,104 @@
// !DIAGNOSTICS: -NOTHING_TO_INLINE
// !API_VERSION: 1.3
// FILE: api.kt
package api
@Experimental(Experimental.Level.WARNING, [Experimental.Impact.COMPILATION])
annotation class ExperimentalCompilationAPI
@Experimental(Experimental.Level.WARNING, [Experimental.Impact.LINKAGE])
annotation class ExperimentalLinkageAPI
@ExperimentalCompilationAPI
fun compilation() {}
@ExperimentalLinkageAPI
fun linkage() {}
// FILE: usage.kt
package usage
import api.*
fun use1() {
compilation()
linkage()
}
val use2 = compilation()
val use3 = linkage()
// FILE: inline-usage.kt
package usage
import api.*
inline fun inlineUse1() {
<!EXPERIMENTAL_API_USAGE!>compilation<!>()
<!EXPERIMENTAL_API_USAGE!>linkage<!>()
}
inline var inlineUse2: Unit
get() {
<!EXPERIMENTAL_API_USAGE!>compilation<!>()
<!EXPERIMENTAL_API_USAGE!>linkage<!>()
}
set(value) {
<!EXPERIMENTAL_API_USAGE!>compilation<!>()
<!EXPERIMENTAL_API_USAGE!>linkage<!>()
}
var inlineUse3: Unit
inline get() {
<!EXPERIMENTAL_API_USAGE!>compilation<!>()
<!EXPERIMENTAL_API_USAGE!>linkage<!>()
}
@ExperimentalCompilationAPI
@ExperimentalLinkageAPI
inline set(value) {
compilation()
linkage()
}
@ExperimentalCompilationAPI
@ExperimentalLinkageAPI
inline fun inlineUse4() {
compilation()
linkage()
}
// FILE: private-inline-usage.kt
package usage
import api.*
private inline fun privateInline1() {
compilation()
linkage()
}
internal inline fun privateInline2() {
compilation()
linkage()
}
private inline var privateInline3: Unit
get() {
compilation()
linkage()
}
set(value) {
compilation()
linkage()
}
internal class InternalClass {
inline fun privateInline4() {
compilation()
linkage()
}
}
@@ -0,0 +1,41 @@
package
package api {
@api.ExperimentalCompilationAPI public fun compilation(): kotlin.Unit
@api.ExperimentalLinkageAPI public fun linkage(): kotlin.Unit
@kotlin.Experimental(changesMayBreak = {Impact.COMPILATION}, level = Level.WARNING) public final annotation class ExperimentalCompilationAPI : kotlin.Annotation {
public constructor ExperimentalCompilationAPI()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.Experimental(changesMayBreak = {Impact.LINKAGE}, level = Level.WARNING) public final annotation class ExperimentalLinkageAPI : kotlin.Annotation {
public constructor ExperimentalLinkageAPI()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
package usage {
public var inlineUse2: kotlin.Unit
public var inlineUse3: kotlin.Unit
private var privateInline3: kotlin.Unit
public val use2: kotlin.Unit
public val use3: kotlin.Unit
public inline fun inlineUse1(): kotlin.Unit
@api.ExperimentalCompilationAPI @api.ExperimentalLinkageAPI public inline fun inlineUse4(): kotlin.Unit
private inline fun privateInline1(): kotlin.Unit
internal inline fun privateInline2(): kotlin.Unit
public fun use1(): kotlin.Unit
internal final class InternalClass {
public constructor InternalClass()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final inline fun privateInline4(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -1,4 +1,5 @@
// !API_VERSION: 1.3
// MODULE: api
// FILE: api.kt
package api
@@ -11,6 +12,7 @@ interface I
@ExperimentalCompilationAPI
class Impl : I
// MODULE: usage(api)
// FILE: usage.kt
package usage
@@ -1,3 +1,4 @@
// -- Module: <api> --
package
package api {
@@ -23,6 +24,13 @@ package api {
}
}
// -- Module: <usage> --
package
package api {
}
package usage {
@kotlin.UseExperimental(markerClass = {api.ExperimentalCompilationAPI::class}) public val delegatedProperty: kotlin.Nothing?
public operator fun api.I.getValue(/*0*/ x: kotlin.Any?, /*1*/ y: kotlin.Any?): kotlin.Nothing?
@@ -1,4 +1,5 @@
// !API_VERSION: 1.3
// MODULE: api
// FILE: api.kt
package api
@@ -18,6 +19,7 @@ class C {
@ExperimentalAPI
fun C.extension() {}
// MODULE: usage1(api)
// FILE: usage-propagate.kt
package usage1
@@ -45,6 +47,7 @@ class Use {
}
}
// MODULE: usage2(api)
// FILE: usage-use.kt
package usage2
@@ -72,6 +75,7 @@ class Use {
}
}
// MODULE: usage3(api)
// FILE: usage-none.kt
package usage3
@@ -1,3 +1,4 @@
// -- Module: <api> --
package
package api {
@@ -34,6 +35,13 @@ package api {
}
}
// -- Module: <usage1> --
package
package api {
}
package usage1 {
@api.ExperimentalAPI public fun useAll(): kotlin.Unit
@@ -46,6 +54,13 @@ package usage1 {
}
}
// -- Module: <usage2> --
package
package api {
}
package usage2 {
@kotlin.UseExperimental(markerClass = {api.ExperimentalAPI::class}) public fun useAll(): kotlin.Unit
@@ -58,6 +73,13 @@ package usage2 {
}
}
// -- Module: <usage3> --
package
package api {
}
package usage3 {
public fun use(): kotlin.Unit
}
@@ -1,4 +1,5 @@
// !API_VERSION: 1.3
// MODULE: api
// FILE: api.kt
package api
@@ -22,6 +23,7 @@ class C {
}
}
// MODULE: usage(api)
// FILE: usage.kt
package usage
@@ -1,3 +1,4 @@
// -- Module: <api> --
package
package api {
@@ -27,6 +28,13 @@ package api {
}
}
// -- Module: <usage> --
package
package api {
}
package usage {
public fun use(): kotlin.Unit
}
@@ -1,4 +1,5 @@
// !API_VERSION: 1.3
// MODULE: api
// FILE: api.kt
package api
@@ -21,6 +22,7 @@ fun linkage() {}
@ExperimentalRuntimeAPI
fun runtime() {}
// MODULE: usage1(api)
// FILE: usage.kt
package usage1
@@ -52,6 +54,7 @@ fun recursiveUse() {
recursiveUse()
}
// MODULE: usage2(api,usage1)
// FILE: usage-no-annotation.txt
package usage2
@@ -1,3 +1,4 @@
// -- Module: <api> --
package
package api {
@@ -27,12 +28,29 @@ package api {
}
}
// -- Module: <usage1> --
package
package api {
}
package usage1 {
@api.ExperimentalCompilationAPI @api.ExperimentalLinkageAPI @api.ExperimentalRuntimeAPI public fun recursiveUse(): kotlin.Unit
@kotlin.UseExperimental(markerClass = {api.ExperimentalCompilationAPI::class}) @api.ExperimentalLinkageAPI @api.ExperimentalRuntimeAPI public fun use(): kotlin.Unit
@api.ExperimentalLinkageAPI @api.ExperimentalRuntimeAPI public fun useUse(): kotlin.Unit
}
// -- Module: <usage2> --
package
package api {
}
package usage1 {
}
package usage2 {
public fun use1(): kotlin.Unit
@api.ExperimentalLinkageAPI public fun use2(): kotlin.Unit
@@ -1,4 +1,5 @@
// !API_VERSION: 1.3
// MODULE: api
// FILE: api.kt
package api
@@ -10,6 +11,7 @@ annotation class BinaryExperimental
@BinaryExperimental
val x = ""
// MODULE: usage(api)
// FILE: usage.kt
import api.*
@@ -1,9 +1,6 @@
// -- Module: <api> --
package
@kotlin.UseExperimental(annotationClass = {}) public fun use1(): kotlin.String
@kotlin.UseExperimental(annotationClass = {api.BinaryExperimental::class}) public fun use2(): kotlin.String
@kotlin.UseExperimental(annotationClass = {kotlin.UseExperimental::class}) public fun use3(): kotlin.String
package api {
@api.BinaryExperimental public val x: kotlin.String = ""
@@ -14,3 +11,14 @@ package api {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
// -- Module: <usage> --
package
@kotlin.UseExperimental(markerClass = {}) public fun use1(): kotlin.String
@kotlin.UseExperimental(markerClass = {api.BinaryExperimental::class}) public fun use2(): kotlin.String
@kotlin.UseExperimental(markerClass = {kotlin.UseExperimental::class}) public fun use3(): kotlin.String
package api {
}
@@ -0,0 +1,52 @@
// !DIAGNOSTICS: -NOTHING_TO_INLINE
// !API_VERSION: 1.3
// MODULE: api
// FILE: api.kt
package api
@Experimental(Experimental.Level.WARNING, [Experimental.Impact.COMPILATION])
annotation class ExperimentalCompilationAPI
@Experimental(Experimental.Level.WARNING, [Experimental.Impact.LINKAGE])
annotation class ExperimentalLinkageAPI
@ExperimentalCompilationAPI
fun compilation() {}
@ExperimentalLinkageAPI
fun linkage() {}
// MODULE: usage(api)
// FILE: usage.kt
package usage
import api.*
@ExperimentalCompilationAPI
@ExperimentalLinkageAPI
fun use() {
compilation()
linkage()
}
fun indirectUseNoAnnotation() {
<!EXPERIMENTAL_API_USAGE, EXPERIMENTAL_API_USAGE!>use<!>()
}
@ExperimentalCompilationAPI
fun indirectUseOptInCompilation() {
<!EXPERIMENTAL_API_USAGE!>use<!>()
}
@ExperimentalLinkageAPI
fun indirectUseOptInLinkage() {
<!EXPERIMENTAL_API_USAGE!>use<!>()
}
@ExperimentalCompilationAPI
@ExperimentalLinkageAPI
fun indirectUseOptInBoth() {
use()
}
@@ -0,0 +1,36 @@
// -- Module: <api> --
package
package api {
@api.ExperimentalCompilationAPI public fun compilation(): kotlin.Unit
@api.ExperimentalLinkageAPI public fun linkage(): kotlin.Unit
@kotlin.Experimental(changesMayBreak = {Impact.COMPILATION}, level = Level.WARNING) public final annotation class ExperimentalCompilationAPI : kotlin.Annotation {
public constructor ExperimentalCompilationAPI()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@kotlin.Experimental(changesMayBreak = {Impact.LINKAGE}, level = Level.WARNING) public final annotation class ExperimentalLinkageAPI : kotlin.Annotation {
public constructor ExperimentalLinkageAPI()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
// -- Module: <usage> --
package
package api {
}
package usage {
public fun indirectUseNoAnnotation(): kotlin.Unit
@api.ExperimentalCompilationAPI @api.ExperimentalLinkageAPI public fun indirectUseOptInBoth(): kotlin.Unit
@api.ExperimentalCompilationAPI public fun indirectUseOptInCompilation(): kotlin.Unit
@api.ExperimentalLinkageAPI public fun indirectUseOptInLinkage(): kotlin.Unit
@api.ExperimentalCompilationAPI @api.ExperimentalLinkageAPI public fun use(): kotlin.Unit
}
@@ -1,5 +1,6 @@
// !API_VERSION: 1.3
// !DIAGNOSTICS: -UNUSED_VARIABLE
// MODULE: api
// FILE: api.kt
package api
@@ -18,6 +19,7 @@ val property: String = ""
@ExperimentalAPI
typealias Typealias = String
// MODULE: usage1(api)
// FILE: usage-propagate.kt
package usage1
@@ -40,6 +42,7 @@ class Use {
}
}
// MODULE: usage2(api)
// FILE: usage-use.kt
package usage2
@@ -64,6 +67,7 @@ class Use {
}
}
// MODULE: usage3(api)
// FILE: usage-none.kt
package usage3
@@ -1,3 +1,4 @@
// -- Module: <api> --
package
package api {
@@ -13,6 +14,13 @@ package api {
@api.ExperimentalAPI public typealias Typealias = kotlin.String
}
// -- Module: <usage1> --
package
package api {
}
package usage1 {
@api.ExperimentalAPI public fun useAll(): kotlin.Unit
@@ -25,6 +33,13 @@ package usage1 {
}
}
// -- Module: <usage2> --
package
package api {
}
package usage2 {
public fun useAll(): kotlin.Unit
@@ -37,6 +52,13 @@ package usage2 {
}
}
// -- Module: <usage3> --
package
package api {
}
package usage3 {
public fun use(): kotlin.Unit
}
@@ -1,4 +1,5 @@
// !API_VERSION: 1.3
// MODULE: api
// FILE: api.kt
package api
@@ -17,6 +18,7 @@ fun compilation() {}
@RuntimeExperimentalAPI
fun runtime() {}
// MODULE: usage(api)
// FILE: usage.kt
@file:UseExperimental(CompilationExperimentalAPI::class)
@@ -1,3 +1,4 @@
// -- Module: <api> --
package
package api {
@@ -19,6 +20,13 @@ package api {
}
}
// -- Module: <usage> --
package
package api {
}
package usage {
public fun use(): kotlin.Unit
@@ -1,5 +1,6 @@
// !API_VERSION: 1.3
// !DIAGNOSTICS: -UNUSED_PARAMETER
// MODULE: api
// FILE: api.kt
package api
@@ -11,6 +12,7 @@ annotation class E
@E
open class Foo(val s: String = "")
// MODULE: usage(api)
// FILE: usage.kt
import api.*
@@ -1,3 +1,26 @@
// -- Module: <api> --
package
package api {
@kotlin.Experimental(changesMayBreak = {Impact.COMPILATION}, level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) public final annotation class E : kotlin.Annotation {
public constructor E()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@api.E public open class Foo {
public constructor Foo(/*0*/ s: kotlin.String = ...)
public final val s: kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
// -- Module: <usage> --
package
@kotlin.UseExperimental(markerClass = {api.E::class}) public val property: kotlin.String
@@ -21,19 +44,4 @@ public final class Constructor {
}
package api {
@kotlin.Experimental(changesMayBreak = {Impact.COMPILATION}, level = Level.WARNING) @kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS}) public final annotation class E : kotlin.Annotation {
public constructor E()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@api.E public open class Foo {
public constructor Foo(/*0*/ s: kotlin.String = ...)
public final val s: kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
@@ -1,4 +1,5 @@
// !API_VERSION: 1.3
// MODULE: api
// FILE: api.kt
package api
@@ -24,6 +25,7 @@ fun e2() {}
@E3
fun e3() {}
// MODULE: usage(api)
// FILE: usage.kt
package usage
@@ -1,3 +1,4 @@
// -- Module: <api> --
package
package api {
@@ -27,6 +28,13 @@ package api {
}
}
// -- Module: <usage> --
package
package api {
}
package usage {
@kotlin.UseExperimental(markerClass = {api.E1::class, api.E2::class, api.E3::class}) public fun use1(): kotlin.Unit
@kotlin.UseExperimental(markerClass = {api.E1::class, api.E3::class}) public fun use2(): kotlin.Unit