Introduce "-api-version" CLI option

The `@SinceKotlin("X.Y.Z")` annotation now hides a particular declaration from
resolution when the API version specified by the `-api-version` option is
_less_ than X.Y.Z. The comparison is performed as for versions in Maven:
MavenComparableVersion is in fact a copy of
org.apache.maven.artifact.versioning.ComparableVersion.

Also support "!API_VERSION" directive in diagnostic tests

 #KT-14298 Fixed
This commit is contained in:
Alexander Udalov
2016-09-26 19:56:22 +03:00
parent e3df8ed2fe
commit 167ab1f860
59 changed files with 1758 additions and 57 deletions
@@ -0,0 +1,34 @@
// !API_VERSION: 1.0
// MODULE: m1
// FILE: a.kt
package p1
@SinceKotlin("1.1")
fun foo(s: Int): String = s.toString()
// MODULE: m2
// FILE: b.kt
package p2
fun foo(s: Int): Int = s
// MODULE: m3(m1, m2)
// FILE: severalStarImports.kt
import p1.*
import p2.*
fun test1(): Int {
val r = foo(42)
return r
}
// FILE: explicitlyImportP1.kt
import p1.foo // TODO: consider reporting API_NOT_AVAILABLE here
import p2.*
fun test2(): Int {
val r = foo(42)
return r
}
@@ -0,0 +1,29 @@
// -- Module: <m1> --
package
package p1 {
@kotlin.SinceKotlin(version = "1.1") public fun foo(/*0*/ s: kotlin.Int): kotlin.String
}
// -- Module: <m2> --
package
package p2 {
public fun foo(/*0*/ s: kotlin.Int): kotlin.Int
}
// -- Module: <m3> --
package
public fun test1(): kotlin.Int
public fun test2(): kotlin.Int
package p1 {
@kotlin.SinceKotlin(version = "1.1") public fun foo(/*0*/ s: kotlin.Int): kotlin.String
}
package p2 {
public fun foo(/*0*/ s: kotlin.Int): kotlin.Int
}
@@ -0,0 +1,38 @@
// !API_VERSION: 1.0
// MODULE: m1
// FILE: a.kt
package p1
@SinceKotlin("1.1")
class A {
fun m1() {}
}
// MODULE: m2
// FILE: b.kt
package p2
class A {
fun m2() {}
}
// MODULE: m3(m1, m2)
// FILE: severalStarImports.kt
import p1.*
import p2.*
fun test(a: A) {
a.<!UNRESOLVED_REFERENCE!>m1<!>()
a.m2()
}
// FILE: explicitlyImportP1.kt
import p1.<!API_NOT_AVAILABLE!>A<!>
import p2.*
fun test(a: <!API_NOT_AVAILABLE!>A<!>) {
a.m1()
a.<!UNRESOLVED_REFERENCE!>m2<!>()
}
@@ -0,0 +1,49 @@
// -- Module: <m1> --
package
package p1 {
@kotlin.SinceKotlin(version = "1.1") public final class A {
public constructor A()
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 fun m1(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
// -- Module: <m2> --
package
package p2 {
public final class A {
public constructor A()
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 fun m2(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
// -- Module: <m3> --
package
public fun test(/*0*/ a: p1.A): kotlin.Unit
public fun test(/*0*/ a: p2.A): kotlin.Unit
package p1 {
@kotlin.SinceKotlin(version = "1.1") public final class A {
// -- Module: <m1> --
}
}
package p2 {
public final class A {
// -- Module: <m2> --
}
}
@@ -0,0 +1,47 @@
// !API_VERSION: 1.0
// MODULE: m1
// FILE: a.kt
package p1
@SinceKotlin("1.1")
class A(val v1: Unit)
// MODULE: m2
// FILE: b.kt
package p2
@SinceKotlin("1.1")
class A(val v2: Unit)
// MODULE: m3
// FILE: c.kt
package p3
@SinceKotlin("1.1")
class A(val v3: Unit)
// MODULE: m4(m1, m2, m3)
// FILE: oneExplicitImportOtherStars.kt
import p1.*
import p2.<!API_NOT_AVAILABLE!>A<!>
import p3.*
fun test(a: <!API_NOT_AVAILABLE!>A<!>) {
a.<!UNRESOLVED_REFERENCE!>v1<!>
a.v2
a.<!UNRESOLVED_REFERENCE!>v3<!>
}
// FILE: severalStarImports.kt
import p1.*
import p2.*
import p3.*
fun test(a: <!UNRESOLVED_REFERENCE!>A<!>) {
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>v1<!>
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>v2<!>
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>a<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE!>v3<!>
}
@@ -0,0 +1,71 @@
// -- Module: <m1> --
package
package p1 {
@kotlin.SinceKotlin(version = "1.1") public final class A {
public constructor A(/*0*/ v1: kotlin.Unit)
public final val v1: kotlin.Unit
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: <m2> --
package
package p2 {
@kotlin.SinceKotlin(version = "1.1") public final class A {
public constructor A(/*0*/ v2: kotlin.Unit)
public final val v2: kotlin.Unit
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: <m3> --
package
package p3 {
@kotlin.SinceKotlin(version = "1.1") public final class A {
public constructor A(/*0*/ v3: kotlin.Unit)
public final val v3: kotlin.Unit
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: <m4> --
package
public fun test(/*0*/ a: [ERROR : A]): kotlin.Unit
public fun test(/*0*/ a: p2.A): kotlin.Unit
package p1 {
@kotlin.SinceKotlin(version = "1.1") public final class A {
// -- Module: <m1> --
}
}
package p2 {
@kotlin.SinceKotlin(version = "1.1") public final class A {
// -- Module: <m2> --
}
}
package p3 {
@kotlin.SinceKotlin(version = "1.1") public final class A {
// -- Module: <m3> --
}
}