Skip to content

Commit

Permalink
Support @SinceKotlin annotation for type aliases.
Browse files Browse the repository at this point in the history
  • Loading branch information
dnpetrov committed Oct 13, 2016
1 parent 8d634f6 commit e7ca00d
Show file tree
Hide file tree
Showing 15 changed files with 208 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,11 @@ package org.jetbrains.kotlin.resolve

import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForTypeAliasObject

private val SINCE_KOTLIN_FQ_NAME = FqName("kotlin.SinceKotlin")

Expand Down Expand Up @@ -70,5 +69,17 @@ private fun DeclarationDescriptor.getOwnSinceKotlinVersion(): ApiVersion? {
val ctorClass = (this as? ConstructorDescriptor)?.containingDeclaration?.loadAnnotationValue()
val property = (this as? PropertyAccessorDescriptor)?.correspondingProperty?.loadAnnotationValue()

return listOfNotNull(ownVersion, ctorClass, property).max()
val typeAliasDescriptor = (this as? TypeAliasDescriptor) ?:
(this as? TypeAliasConstructorDescriptor)?.typeAliasDescriptor ?:
(this as? FakeCallableDescriptorForTypeAliasObject)?.typeAliasDescriptor

val typeAlias = typeAliasDescriptor?.loadAnnotationValue()

// We should check only the upper-most classifier ('A' in 'A<B<C>>') to guarantee binary compatibility.
val underlyingClass = typeAliasDescriptor?.classDescriptor?.loadAnnotationValue()

val underlyingConstructor = (this as? TypeAliasConstructorDescriptor)?.underlyingConstructorDescriptor?.loadAnnotationValue()
val underlyingObject = (this as? FakeCallableDescriptorForTypeAliasObject)?.getReferencedObject()?.loadAnnotationValue()

return listOfNotNull(ownVersion, ctorClass, property, typeAlias, underlyingClass, underlyingConstructor, underlyingObject).max()
}
4 changes: 2 additions & 2 deletions compiler/testData/builtin-classes/default/kotlin.txt
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ public interface Comparable</*0*/ in T> {
public abstract operator fun compareTo(/*0*/ other: T): kotlin.Int
}

@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented() public final annotation class Deprecated : kotlin.Annotation {
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented public final annotation class Deprecated : kotlin.Annotation {
/*primary*/ public constructor Deprecated(/*0*/ message: kotlin.String, /*1*/ replaceWith: kotlin.ReplaceWith = ..., /*2*/ level: kotlin.DeprecationLevel = ...)
public final val level: kotlin.DeprecationLevel
public final fun <get-level>(): kotlin.DeprecationLevel
Expand Down Expand Up @@ -653,7 +653,7 @@ public final class ShortArray : kotlin.Cloneable {
public final operator fun set(/*0*/ index: kotlin.Int, /*1*/ value: kotlin.Short): kotlin.Unit
}

@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation {
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation {
/*primary*/ public constructor SinceKotlin(/*0*/ version: kotlin.String)
public final val version: kotlin.String
public final fun <get-version>(): kotlin.String
Expand Down
4 changes: 2 additions & 2 deletions compiler/testData/builtin-classes/java6/kotlin.txt
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ public interface Comparable</*0*/ in T> {
public abstract operator fun compareTo(/*0*/ other: T): kotlin.Int
}

@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented() public final annotation class Deprecated : kotlin.Annotation {
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented public final annotation class Deprecated : kotlin.Annotation {
/*primary*/ public constructor Deprecated(/*0*/ message: kotlin.String, /*1*/ replaceWith: kotlin.ReplaceWith = ..., /*2*/ level: kotlin.DeprecationLevel = ...)
public final val level: kotlin.DeprecationLevel
public final fun <get-level>(): kotlin.DeprecationLevel
Expand Down Expand Up @@ -657,7 +657,7 @@ public final class ShortArray : kotlin.Cloneable, java.io.Serializable {
public final operator fun set(/*0*/ index: kotlin.Int, /*1*/ value: kotlin.Short): kotlin.Unit
}

@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation {
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation {
/*primary*/ public constructor SinceKotlin(/*0*/ version: kotlin.String)
public final val version: kotlin.String
public final fun <get-version>(): kotlin.String
Expand Down
4 changes: 2 additions & 2 deletions compiler/testData/builtin-classes/java8/kotlin.txt
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ public interface Comparable</*0*/ in T> {
public abstract operator fun compareTo(/*0*/ other: T): kotlin.Int
}

@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented() public final annotation class Deprecated : kotlin.Annotation {
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented public final annotation class Deprecated : kotlin.Annotation {
/*primary*/ public constructor Deprecated(/*0*/ message: kotlin.String, /*1*/ replaceWith: kotlin.ReplaceWith = ..., /*2*/ level: kotlin.DeprecationLevel = ...)
public final val level: kotlin.DeprecationLevel
public final fun <get-level>(): kotlin.DeprecationLevel
Expand Down Expand Up @@ -659,7 +659,7 @@ public final class ShortArray : kotlin.Cloneable, java.io.Serializable {
public final operator fun set(/*0*/ index: kotlin.Int, /*1*/ value: kotlin.Short): kotlin.Unit
}

@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation {
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation {
/*primary*/ public constructor SinceKotlin(/*0*/ version: kotlin.String)
public final val version: kotlin.String
public final fun <get-version>(): kotlin.String
Expand Down
4 changes: 2 additions & 2 deletions compiler/testData/builtin-classes/newMethods/kotlin.txt
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ public interface Comparable</*0*/ in T> {
public abstract operator fun compareTo(/*0*/ other: T): kotlin.Int
}

@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented() public final annotation class Deprecated : kotlin.Annotation {
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY, AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.MustBeDocumented public final annotation class Deprecated : kotlin.Annotation {
/*primary*/ public constructor Deprecated(/*0*/ message: kotlin.String, /*1*/ replaceWith: kotlin.ReplaceWith = ..., /*2*/ level: kotlin.DeprecationLevel = ...)
public final val level: kotlin.DeprecationLevel
public final fun <get-level>(): kotlin.DeprecationLevel
Expand Down Expand Up @@ -657,7 +657,7 @@ public final class ShortArray : kotlin.Cloneable, java.io.Serializable {
public final operator fun set(/*0*/ index: kotlin.Int, /*1*/ value: kotlin.Short): kotlin.Unit
}

@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation {
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.CLASS, AnnotationTarget.PROPERTY, AnnotationTarget.CONSTRUCTOR, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.TYPEALIAS}) @kotlin.annotation.Retention(value = AnnotationRetention.BINARY) @kotlin.annotation.MustBeDocumented public final annotation class SinceKotlin : kotlin.Annotation {
/*primary*/ public constructor SinceKotlin(/*0*/ version: kotlin.String)
public final val version: kotlin.String
public final fun <get-version>(): kotlin.String
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// !API_VERSION: 1.0

@SinceKotlin("1.1")
open class C1

typealias C1_Alias = <!API_NOT_AVAILABLE!>C1<!>

open class C2(val x: Int) {
@SinceKotlin("1.1")
constructor() : this(0)
}

typealias C2_Alias = C2

val test1 = <!UNRESOLVED_REFERENCE!>C1_Alias<!>()
val test2 = C2_Alias(<!NO_VALUE_FOR_PARAMETER!>)<!>

class Test3 : <!UNRESOLVED_REFERENCE, API_NOT_AVAILABLE, DEBUG_INFO_UNRESOLVED_WITH_TARGET!>C1_Alias<!>()

class Test4 : C2_Alias(<!NO_VALUE_FOR_PARAMETER!>)<!>
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package

public val test1: [ERROR : Type for C1_Alias()]
public val test2: C2

@kotlin.SinceKotlin(version = "1.1") public open class C1 {
public constructor C1()
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
}

public open class C2 {
@kotlin.SinceKotlin(version = "1.1") public constructor C2()
public constructor C2(/*0*/ x: kotlin.Int)
public final val x: 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
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}

public final class Test3 : C1_Alias /* = C1 */ {
public constructor Test3()
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
}

public final class Test4 : C2_Alias /* = C2 */ {
public constructor Test4()
public final override /*1*/ /*fake_override*/ val x: 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
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public typealias C1_Alias = C1
public typealias C2_Alias = C2
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
// !API_VERSION: 1.0

@SinceKotlin("1.1")
object Since_1_1 {
val x = 42
}

typealias Since_1_1_Alias = <!API_NOT_AVAILABLE!>Since_1_1<!>

val test1 = <!API_NOT_AVAILABLE!>Since_1_1_Alias<!>
val test2 = <!API_NOT_AVAILABLE!>Since_1_1_Alias<!>.x
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package

public val test1: [ERROR : Type for Since_1_1_Alias]
public val test2: kotlin.Int = 42

@kotlin.SinceKotlin(version = "1.1") public object Since_1_1 {
private constructor Since_1_1()
public final val x: kotlin.Int = 42
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
}
public typealias Since_1_1_Alias = Since_1_1
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
// !API_VERSION: 1.0

@SinceKotlin("1.1")
class Since_1_1

class C

typealias Since_1_1_Alias = <!API_NOT_AVAILABLE!>Since_1_1<!>

typealias L = List<<!API_NOT_AVAILABLE!>Since_1_1<!>>

@SinceKotlin("1.1")
typealias C_1_1_Alias = C

fun test1(x: <!API_NOT_AVAILABLE!>Since_1_1_Alias<!>) = x

fun test2(x: <!API_NOT_AVAILABLE!>C_1_1_Alias<!>) = x

fun test3(x: List<<!API_NOT_AVAILABLE!>C_1_1_Alias<!>>) = x

fun test4(x: L) = x
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package

public fun test1(/*0*/ x: Since_1_1_Alias /* = Since_1_1 */): Since_1_1_Alias /* = Since_1_1 */
public fun test2(/*0*/ x: C_1_1_Alias /* = C */): C_1_1_Alias /* = C */
public fun test3(/*0*/ x: kotlin.collections.List<C_1_1_Alias /* = C */>): kotlin.collections.List<C_1_1_Alias /* = C */>
public fun test4(/*0*/ x: L /* = kotlin.collections.List<Since_1_1> */): L /* = kotlin.collections.List<Since_1_1> */

public final class C {
public constructor C()
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.SinceKotlin(version = "1.1") public final class Since_1_1 {
public constructor Since_1_1()
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.SinceKotlin(version = "1.1") public typealias C_1_1_Alias = C
public typealias L = kotlin.collections.List<Since_1_1>
public typealias Since_1_1_Alias = Since_1_1
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// !API_VERSION: 1.0

// FILE: a.kt
package a

@SinceKotlin("1.1")
class Since_1_1

typealias Since_1_1_Alias = <!API_NOT_AVAILABLE!>Since_1_1<!>

@SinceKotlin("1.1")
typealias Alias_1_1 = String

// FILE: b.kt
package b

import a.<!API_NOT_AVAILABLE!>Since_1_1_Alias<!>
import a.<!API_NOT_AVAILABLE!>Alias_1_1<!>
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package

package a {

@kotlin.SinceKotlin(version = "1.1") public final class Since_1_1 {
public constructor Since_1_1()
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.SinceKotlin(version = "1.1") public typealias Alias_1_1 = kotlin.String
public typealias Since_1_1_Alias = a.Since_1_1
}

package b {
}
Original file line number Diff line number Diff line change
Expand Up @@ -19573,6 +19573,30 @@ public void testSinceOldVersionIsOK() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/sinceOldVersionIsOK.kt");
doTest(fileName);
}

@TestMetadata("typealiasesAsConstructors.kt")
public void testTypealiasesAsConstructors() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsConstructors.kt");
doTest(fileName);
}

@TestMetadata("typealiasesAsObjects.kt")
public void testTypealiasesAsObjects() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsObjects.kt");
doTest(fileName);
}

@TestMetadata("typealiasesAsTypes.kt")
public void testTypealiasesAsTypes() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesAsTypes.kt");
doTest(fileName);
}

@TestMetadata("typealiasesOnImport.kt")
public void testTypealiasesOnImport() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/apiVersion/typealiasesOnImport.kt");
doTest(fileName);
}
}

@TestMetadata("compiler/testData/diagnostics/tests/sourceCompatibility/noBoundCallableReferences")
Expand Down
2 changes: 1 addition & 1 deletion core/builtins/src/kotlin/Annotations.kt
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public annotation class UnsafeVariance
* @property version the version in the following formats: `<major>.<minor>` or `<major>.<minor>.<patch>`, where major, minor and patch
* are non-negative integer numbers without leading zeros.
*/
@Target(CLASS, PROPERTY, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER)
@Target(CLASS, PROPERTY, CONSTRUCTOR, FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER, TYPEALIAS)
@Retention(AnnotationRetention.BINARY)
@MustBeDocumented
public annotation class SinceKotlin(val version: String)

0 comments on commit e7ca00d

Please sign in to comment.