Support @SinceKotlin annotation for type aliases.

This commit is contained in:
Dmitry Petrov
2016-10-12 12:32:23 +03:00
parent 8d634f6003
commit e7ca00d91b
15 changed files with 208 additions and 14 deletions
@@ -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")
@@ -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()
}
+2 -2
View File
@@ -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
@@ -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
+2 -2
View File
@@ -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
@@ -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
+2 -2
View File
@@ -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
@@ -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
+2 -2
View File
@@ -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
@@ -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
@@ -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!>)<!>
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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<!>
@@ -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 {
}
@@ -19573,6 +19573,30 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
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")
+1 -1
View File
@@ -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)