[TEST] Change semantics of CHECK_TYPE directive and update testdata

Previously helpers from checkType.kt was in special package, and
  if directive was enabled then test runner (`AbstractDiagnosticTest`)
  injected additional imports to test files and removed them after test
  was completed.
It's very hard to support such behavior in new test infrastructure so
  there was a decision about changing `CHECK_TYPE`:
1. All helpers from `checkType.kt` now stays in default package
2. `CHECK_TYPE` only adds `checkType.kt` to set of analyzed files
      and don't modify their content

For test which are written in default package (most of tests actually)
  there are no changes. On the other hand if there is a test where dev
  want to use checkType functions in testfile with some package then he
  should explicitly import functions which he needed (`checkSubtype`,
  `checkType`, `_`)
This commit is contained in:
Dmitriy Novozhilov
2020-11-12 17:45:40 +03:00
parent 653b26174b
commit 419f54259c
91 changed files with 269 additions and 111 deletions
@@ -6,14 +6,14 @@ FILE: main.kt
^ Int(1)
}
public final fun bar(a: R|A|): R|kotlin/Unit| {
R|<local>/a|.R|/foo|.R|tests/_checkType/checkType|<R|kotlin/Int|>(checkType@fun R|tests/_checkType/Inv<kotlin/Int>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/Int|>()
R|<local>/a|.R|/foo|.R|/checkType|<R|kotlin/Int|>(checkType@fun R|CheckTypeInv<kotlin/Int>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/Int|>()
}
)
}
public final fun R|JavaClass|.bar(a: R|A|): R|kotlin/Unit| {
R|<local>/a|.R|/foo|.R|tests/_checkType/checkType|<R|kotlin/Int|>(checkType@fun R|tests/_checkType/Inv<kotlin/Int>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/Int|>()
R|<local>/a|.R|/foo|.R|/checkType|<R|kotlin/Int|>(checkType@fun R|CheckTypeInv<kotlin/Int>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/Int|>()
}
)
}
@@ -21,13 +21,13 @@ FILE: CHECK_TYPE.kt
public final fun <T> checkSubtype(t: R|T|): R|T| {
^checkSubtype R|<local>/t|
}
public final class Inv<T> : R|kotlin/Any| {
public constructor<T>(): R|tests/_checkType/Inv<T>| {
public final class CheckTypeInv<T> : R|kotlin/Any| {
public constructor<T>(): R|CheckTypeInv<T>| {
super<R|kotlin/Any|>()
}
}
public final fun <E> R|tests/_checkType/Inv<E>|._(): R|kotlin/Unit| {
public final fun <E> R|CheckTypeInv<E>|._(): R|kotlin/Unit| {
}
public final infix fun <T> R|T|.checkType(f: R|tests/_checkType/Inv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
public final infix fun <T> R|T|.checkType(f: R|CheckTypeInv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
}
@@ -17,8 +17,8 @@ FILE: lambdaArgInScopeFunction.kt
^ R|<local>/it|
}
) }
R|<local>/value|.R|tests/_checkType/checkType|<R|KotlinClass?|>(<L> = checkType@fun R|tests/_checkType/Inv<KotlinClass?>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|KotlinClass?|>()
R|<local>/value|.R|/checkType|<R|KotlinClass?|>(<L> = checkType@fun R|CheckTypeInv<KotlinClass?>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|KotlinClass?|>()
}
)
lval lambda: R|() -> KotlinClass| = R|<local>/kotlinClass|?.{ $subj$.R|kotlin/let|<R|KotlinClass|, R|() -> KotlinClass|>(<L> = let@fun <anonymous>(it: R|KotlinClass|): R|() -> KotlinClass| <kind=EXACTLY_ONCE> {
@@ -28,8 +28,8 @@ FILE: lambdaArgInScopeFunction.kt
}
) }
R|<local>/lambda|.R|tests/_checkType/checkType|<R|() -> KotlinClass|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/Function0<KotlinClass>?>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): tests/_checkType/_>#<R|(kotlin/Unit) -> KotlinClass?|>()
R|<local>/lambda|.R|/checkType|<R|() -> KotlinClass|>(<L> = checkType@fun R|CheckTypeInv<kotlin/Function0<KotlinClass>?>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): /_>#<R|(kotlin/Unit) -> KotlinClass?|>()
}
)
}
@@ -38,8 +38,8 @@ FILE: lambdaArgInScopeFunction.kt
^ R|<local>/it|
}
)
R|<local>/value|.R|tests/_checkType/checkType|<R|KotlinClass|>(<L> = checkType@fun R|tests/_checkType/Inv<KotlinClass>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|KotlinClass|>()
R|<local>/value|.R|/checkType|<R|KotlinClass|>(<L> = checkType@fun R|CheckTypeInv<KotlinClass>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|KotlinClass|>()
}
)
lval lambda: R|() -> KotlinClass| = R|<local>/kotlinClass|.R|kotlin/let|<R|KotlinClass|, R|() -> KotlinClass|>(<L> = let@fun <anonymous>(it: R|KotlinClass|): R|() -> KotlinClass| <kind=EXACTLY_ONCE> {
@@ -49,8 +49,8 @@ FILE: lambdaArgInScopeFunction.kt
}
)
R|<local>/lambda|.R|tests/_checkType/checkType|<R|() -> KotlinClass|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/Function0<KotlinClass>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): tests/_checkType/_>#<R|(kotlin/Unit) -> KotlinClass?|>()
R|<local>/lambda|.R|/checkType|<R|() -> KotlinClass|>(<L> = checkType@fun R|CheckTypeInv<kotlin/Function0<KotlinClass>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): /_>#<R|(kotlin/Unit) -> KotlinClass?|>()
}
)
}
@@ -58,13 +58,13 @@ FILE: CHECK_TYPE.kt
public final fun <T> checkSubtype(t: R|T|): R|T| {
^checkSubtype R|<local>/t|
}
public final class Inv<T> : R|kotlin/Any| {
public constructor<T>(): R|tests/_checkType/Inv<T>| {
public final class CheckTypeInv<T> : R|kotlin/Any| {
public constructor<T>(): R|CheckTypeInv<T>| {
super<R|kotlin/Any|>()
}
}
public final fun <E> R|tests/_checkType/Inv<E>|._(): R|kotlin/Unit| {
public final fun <E> R|CheckTypeInv<E>|._(): R|kotlin/Unit| {
}
public final infix fun <T> R|T|.checkType(f: R|tests/_checkType/Inv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
public final infix fun <T> R|T|.checkType(f: R|CheckTypeInv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
}
@@ -24,16 +24,16 @@ FILE: KotlinClass.kt
}
}
R|<local>/validType|.R|tests/_checkType/checkType|<R|(JavaClass) -> kotlin/Boolean|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/Function1<JavaClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|(JavaClass) -> kotlin/Boolean|>()
R|<local>/validType|.R|/checkType|<R|(JavaClass) -> kotlin/Boolean|>(<L> = checkType@fun R|CheckTypeInv<kotlin/Function1<JavaClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|(JavaClass) -> kotlin/Boolean|>()
}
)
R|<local>/invalidType|.R|tests/_checkType/checkType|<R|(JavaClass) -> kotlin/Boolean|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/Function1<JavaClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): tests/_checkType/_>#<R|(kotlin/Nothing) -> kotlin/Boolean|>()
R|<local>/invalidType|.R|/checkType|<R|(JavaClass) -> kotlin/Boolean|>(<L> = checkType@fun R|CheckTypeInv<kotlin/Function1<JavaClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): /_>#<R|(kotlin/Nothing) -> kotlin/Boolean|>()
}
)
R|/Case1.Case1|(R|<local>/javaClass|).R|/Case1.x|.R|tests/_checkType/checkType|<R|(KotlinClass) -> kotlin/Boolean|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/Function1<KotlinClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): tests/_checkType/_>#<R|(kotlin/Nothing) -> kotlin/Boolean|>()
R|/Case1.Case1|(R|<local>/javaClass|).R|/Case1.x|.R|/checkType|<R|(KotlinClass) -> kotlin/Boolean|>(<L> = checkType@fun R|CheckTypeInv<kotlin/Function1<KotlinClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): /_>#<R|(kotlin/Nothing) -> kotlin/Boolean|>()
}
)
}
@@ -117,16 +117,16 @@ FILE: KotlinClass.kt
}
}
R|<local>/validType|.R|tests/_checkType/checkType|<R|(KotlinClass) -> kotlin/Boolean|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/Function1<KotlinClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|(KotlinClass) -> kotlin/Boolean|>()
R|<local>/validType|.R|/checkType|<R|(KotlinClass) -> kotlin/Boolean|>(<L> = checkType@fun R|CheckTypeInv<kotlin/Function1<KotlinClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|(KotlinClass) -> kotlin/Boolean|>()
}
)
R|<local>/invalidType|.R|tests/_checkType/checkType|<R|(KotlinClass) -> kotlin/Boolean|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/Function1<KotlinClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): tests/_checkType/_>#<R|(kotlin/Nothing) -> kotlin/Boolean|>()
R|<local>/invalidType|.R|/checkType|<R|(KotlinClass) -> kotlin/Boolean|>(<L> = checkType@fun R|CheckTypeInv<kotlin/Function1<KotlinClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): /_>#<R|(kotlin/Nothing) -> kotlin/Boolean|>()
}
)
R|/Case2.Case2|(R|<local>/kotlinClass|).R|/Case2.x|.R|tests/_checkType/checkType|<R|(KotlinClass) -> kotlin/Boolean|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/Function1<KotlinClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): tests/_checkType/_>#<R|(kotlin/Nothing) -> kotlin/Boolean|>()
R|/Case2.Case2|(R|<local>/kotlinClass|).R|/Case2.x|.R|/checkType|<R|(KotlinClass) -> kotlin/Boolean|>(<L> = checkType@fun R|CheckTypeInv<kotlin/Function1<KotlinClass, kotlin/Boolean>>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.<Inapplicable(INAPPLICABLE_WRONG_RECEIVER): /_>#<R|(kotlin/Nothing) -> kotlin/Boolean|>()
}
)
}
@@ -176,13 +176,13 @@ FILE: CHECK_TYPE.kt
public final fun <T> checkSubtype(t: R|T|): R|T| {
^checkSubtype R|<local>/t|
}
public final class Inv<T> : R|kotlin/Any| {
public constructor<T>(): R|tests/_checkType/Inv<T>| {
public final class CheckTypeInv<T> : R|kotlin/Any| {
public constructor<T>(): R|CheckTypeInv<T>| {
super<R|kotlin/Any|>()
}
}
public final fun <E> R|tests/_checkType/Inv<E>|._(): R|kotlin/Unit| {
public final fun <E> R|CheckTypeInv<E>|._(): R|kotlin/Unit| {
}
public final infix fun <T> R|T|.checkType(f: R|tests/_checkType/Inv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
public final infix fun <T> R|T|.checkType(f: R|CheckTypeInv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
}
@@ -201,13 +201,13 @@ FILE: CHECK_TYPE.kt
public final fun <T> checkSubtype(t: R|T|): R|T| {
^checkSubtype R|<local>/t|
}
public final class Inv<T> : R|kotlin/Any| {
public constructor<T>(): R|tests/_checkType/Inv<T>| {
public final class CheckTypeInv<T> : R|kotlin/Any| {
public constructor<T>(): R|CheckTypeInv<T>| {
super<R|kotlin/Any|>()
}
}
public final fun <E> R|tests/_checkType/Inv<E>|._(): R|kotlin/Unit| {
public final fun <E> R|CheckTypeInv<E>|._(): R|kotlin/Unit| {
}
public final infix fun <T> R|T|.checkType(f: R|tests/_checkType/Inv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
public final infix fun <T> R|T|.checkType(f: R|CheckTypeInv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
}
@@ -30,43 +30,43 @@ FILE: simpleMostSpecific.kt
public abstract interface D3 : R|A|, R|C| {
}
public final fun main(d1: R|D1|, d2: R|D2|, d3: R|D3|): R|kotlin/Unit| {
R|<local>/d1|.R|/B.x|.R|tests/_checkType/checkType|<R|kotlin/String|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/String|>()
R|<local>/d1|.R|/B.x|.R|/checkType|<R|kotlin/String|>(<L> = checkType@fun R|CheckTypeInv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/String|>()
}
)
R|<local>/d1|.R|/B.x| = String()
R|<local>/d1|.R|/B.foo|().R|tests/_checkType/checkType|<R|kotlin/String|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/String|>()
R|<local>/d1|.R|/B.foo|().R|/checkType|<R|kotlin/String|>(<L> = checkType@fun R|CheckTypeInv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/String|>()
}
)
R|<local>/d1|.R|/B.bar|<R|kotlin/Int|, R|kotlin/String|>(Int(1), String()).R|tests/_checkType/checkType|<R|kotlin/String|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/String|>()
R|<local>/d1|.R|/B.bar|<R|kotlin/Int|, R|kotlin/String|>(Int(1), String()).R|/checkType|<R|kotlin/String|>(<L> = checkType@fun R|CheckTypeInv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/String|>()
}
)
R|<local>/d2|.R|/B.x|.R|tests/_checkType/checkType|<R|kotlin/String|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/String|>()
R|<local>/d2|.R|/B.x|.R|/checkType|<R|kotlin/String|>(<L> = checkType@fun R|CheckTypeInv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/String|>()
}
)
R|<local>/d2|.R|/B.x| = String()
R|<local>/d2|.R|/B.foo|().R|tests/_checkType/checkType|<R|kotlin/String|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/String|>()
R|<local>/d2|.R|/B.foo|().R|/checkType|<R|kotlin/String|>(<L> = checkType@fun R|CheckTypeInv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/String|>()
}
)
R|<local>/d2|.R|/B.bar|<R|kotlin/Int|, R|kotlin/String|>(Int(1), String()).R|tests/_checkType/checkType|<R|kotlin/String|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/String|>()
R|<local>/d2|.R|/B.bar|<R|kotlin/Int|, R|kotlin/String|>(Int(1), String()).R|/checkType|<R|kotlin/String|>(<L> = checkType@fun R|CheckTypeInv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/String|>()
}
)
R|<local>/d3|.R|/C.x|.R|tests/_checkType/checkType|<R|kotlin/String|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/String|>()
R|<local>/d3|.R|/C.x|.R|/checkType|<R|kotlin/String|>(<L> = checkType@fun R|CheckTypeInv<kotlin/String>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/String|>()
}
)
R|<local>/d3|.R|/C.x| = String()
R|<local>/d3|.R|/A.foo|().R|tests/_checkType/checkType|<R|kotlin/String?|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/String?>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/String?|>()
R|<local>/d3|.R|/A.foo|().R|/checkType|<R|kotlin/String?|>(<L> = checkType@fun R|CheckTypeInv<kotlin/String?>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/String?|>()
}
)
R|<local>/d3|.R|/A.bar|<R|kotlin/Int|, R|kotlin/String|>(Int(1), String()).R|tests/_checkType/checkType|<R|kotlin/String?|>(<L> = checkType@fun R|tests/_checkType/Inv<kotlin/String?>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|tests/_checkType/_|<R|kotlin/String?|>()
R|<local>/d3|.R|/A.bar|<R|kotlin/Int|, R|kotlin/String|>(Int(1), String()).R|/checkType|<R|kotlin/String?|>(<L> = checkType@fun R|CheckTypeInv<kotlin/String?>|.<anonymous>(): R|kotlin/Unit| {
this@R|special/anonymous|.R|/_|<R|kotlin/String?|>()
}
)
}
@@ -74,13 +74,13 @@ FILE: CHECK_TYPE.kt
public final fun <T> checkSubtype(t: R|T|): R|T| {
^checkSubtype R|<local>/t|
}
public final class Inv<T> : R|kotlin/Any| {
public constructor<T>(): R|tests/_checkType/Inv<T>| {
public final class CheckTypeInv<T> : R|kotlin/Any| {
public constructor<T>(): R|CheckTypeInv<T>| {
super<R|kotlin/Any|>()
}
}
public final fun <E> R|tests/_checkType/Inv<E>|._(): R|kotlin/Unit| {
public final fun <E> R|CheckTypeInv<E>|._(): R|kotlin/Unit| {
}
public final infix fun <T> R|T|.checkType(f: R|tests/_checkType/Inv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
public final infix fun <T> R|T|.checkType(f: R|CheckTypeInv<T>.() -> kotlin/Unit|): R|kotlin/Unit| {
}
+3 -5
View File
@@ -1,7 +1,5 @@
package tests._checkType
fun <T> checkSubtype(t: T) = t
class Inv<T>
fun <E> Inv<E>._() {}
class CheckTypeInv<T>
fun <E> CheckTypeInv<E>._() {}
infix fun <T> T.checkType(f: Inv<T>.() -> Unit) {}
infix fun <T> T.checkType(f: CheckTypeInv<T>.() -> Unit) {}
@@ -3,6 +3,9 @@
package foo
import checkType
import checkSubtype
fun Any.foo() : () -> Unit {
return {}
}
@@ -3,6 +3,9 @@
package foo
import checkType
import checkSubtype
fun Any.foo() : () -> Unit {
return {}
}
@@ -3,6 +3,8 @@
package test
import checkSubtype
class C {
companion object {
fun foo(): String = "companion"
@@ -3,6 +3,8 @@
package test
import checkSubtype
class C {
companion object {
fun foo(): String = "companion"
@@ -3,6 +3,8 @@
package first
import checkSubtype
class A {
fun foo() {}
fun bar(x: Int) {}
@@ -14,7 +16,7 @@ class A {
package other
import kotlin.reflect.*
import checkSubtype
import first.A
fun main() {
@@ -3,6 +3,8 @@
package first
import checkSubtype
class A {
fun foo() {}
fun bar(<!UNUSED_PARAMETER!>x<!>: Int) {}
@@ -14,7 +16,7 @@ class A {
package other
import kotlin.reflect.*
import checkSubtype
import first.A
fun main() {
@@ -4,6 +4,8 @@
package first
import checkSubtype
class A
fun A.foo() {}
@@ -18,6 +20,7 @@ import kotlin.reflect.KFunction1
import first.A
import first.foo
import checkSubtype
fun main() {
val x = first.A::foo
@@ -4,6 +4,8 @@
package first
import checkSubtype
class A
fun A.foo() {}
@@ -18,6 +20,7 @@ import kotlin.reflect.KFunction1
import first.A
import first.foo
import checkSubtype
fun main() {
val x = first.A::foo
@@ -3,6 +3,8 @@
package first
import checkSubtype
fun foo() {}
fun bar(x: Int) {}
fun baz() = "OK"
@@ -16,6 +18,7 @@ import kotlin.reflect.*
import first.foo
import first.bar
import first.baz
import checkSubtype
fun main() {
val x = ::foo
@@ -3,6 +3,8 @@
package first
import checkSubtype
fun foo() {}
fun bar(<!UNUSED_PARAMETER!>x<!>: Int) {}
fun baz() = "OK"
@@ -16,6 +18,7 @@ import kotlin.reflect.*
import first.foo
import first.bar
import first.baz
import checkSubtype
fun main() {
val x = ::foo
@@ -3,6 +3,8 @@
//KT-2631 Check multiple assignment
package a
import checkSubtype
class MyClass {
operator fun component1() = 1
operator fun component2() = "a"
@@ -24,4 +26,4 @@ fun test(mc1: MyClass, mc2: MyClass2) {
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Boolean>(a)
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Boolean>(b)
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Boolean>(c)
}
}
@@ -3,6 +3,8 @@
//KT-2631 Check multiple assignment
package a
import checkSubtype
class MyClass {
operator fun component1() = 1
operator fun component2() = "a"
@@ -24,4 +26,4 @@ fun test(mc1: MyClass, mc2: MyClass2) {
checkSubtype<Boolean>(<!TYPE_MISMATCH!>a<!>)
checkSubtype<Boolean>(<!TYPE_MISMATCH!>b<!>)
checkSubtype<Boolean>(<!TYPE_MISMATCH!>c<!>)
}
}
@@ -3,6 +3,8 @@
package m
import checkSubtype
fun test(i: Int?) {
if (i != null) {
foo(l1@ i)
@@ -3,6 +3,8 @@
package m
import checkSubtype
fun test(i: Int?) {
if (i != null) {
foo(<!REDUNDANT_LABEL_WARNING!>l1@<!> <!DEBUG_INFO_SMARTCAST!>i<!>)
@@ -3,6 +3,8 @@
package d
import checkSubtype
fun <T: Any> joinT(x: Int, vararg a: T): T? {
return null
}
@@ -3,6 +3,8 @@
package d
import checkSubtype
fun <T: Any> joinT(<!UNUSED_PARAMETER!>x<!>: Int, vararg <!UNUSED_PARAMETER!>a<!>: T): T? {
return null
}
@@ -14,4 +16,4 @@ fun <T: Any> joinT(<!UNUSED_PARAMETER!>x<!>: Comparable<*>, <!UNUSED_PARAMETER!>
fun test() {
val x2 = <!OI;TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR!>joinT<!>(<!TYPE_MISMATCH!>Unit<!>, "2")
checkSubtype<String?>(x2)
}
}
@@ -3,6 +3,7 @@
package h
//+JDK
import java.util.*
import checkSubtype
fun <T> id(t: T) : T = t
@@ -3,6 +3,7 @@
package h
//+JDK
import java.util.*
import checkSubtype
fun <T> id(t: T) : T = t
@@ -3,6 +3,8 @@
package a
import checkSubtype
fun <T> emptyList(): List<T> = throw Exception()
fun <T> foo(f: T.() -> Unit, l: List<T>): T = throw Exception("$f$l")
@@ -12,4 +14,4 @@ fun test() {
checkSubtype<Int>(q)
foo({}, emptyList())
}
}
@@ -3,6 +3,8 @@
package a
import checkSubtype
fun <T> emptyList(): List<T> = throw Exception()
fun <T> foo(f: T.() -> Unit, l: List<T>): T = throw Exception("$f$l")
@@ -12,4 +14,4 @@ fun test() {
checkSubtype<Int>(q)
<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>foo<!>({}, <!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>emptyList<!>())
}
}
@@ -3,6 +3,7 @@
package a
//+JDK
import java.util.*
import checkSubtype
fun <A> cons(x: A, xs: List<A>): List<A> = xs
@@ -3,6 +3,7 @@
package a
//+JDK
import java.util.*
import checkSubtype
fun <A> cons(<!UNUSED_PARAMETER!>x<!>: A, xs: List<A>): List<A> = xs
@@ -4,6 +4,7 @@ package a
//+JDK
import java.util.*
import checkSubtype
fun foo() {
val v = array(1, 2, 3)
@@ -32,4 +33,4 @@ fun <T> array(vararg t : T) : Array<T> = t as Array<T>
infix fun <T, R> Array<T>.map(transform : (T) -> R) : List<R> {}
infix fun <T, R> Iterable<T>.map(transform : (T) -> R) : List<R> {}
infix fun <T, R> Iterable<T>.map(transform : (T) -> R) : List<R> {}
@@ -4,6 +4,7 @@ package a
//+JDK
import java.util.*
import checkSubtype
fun foo() {
val v = array(1, 2, 3)
@@ -32,4 +33,4 @@ fun <T> array(vararg t : T) : Array<T> = t as Array<T>
infix fun <T, R> Array<T>.map(<!UNUSED_PARAMETER!>transform<!> : (T) -> R) : List<R> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
infix fun <T, R> Iterable<T>.map(<!UNUSED_PARAMETER!>transform<!> : (T) -> R) : List<R> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
infix fun <T, R> Iterable<T>.map(<!UNUSED_PARAMETER!>transform<!> : (T) -> R) : List<R> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -4,6 +4,7 @@ package i
//+JDK
import java.util.*
import checkSubtype
fun <T, R> Collection<T>.map1(f : (T) -> R) : List<R> {}
fun <T, R> java.lang.Iterable<T>.map1(f : (T) -> R) : List<R> {}
@@ -21,4 +22,4 @@ fun test1(list: List<Int>) {
val res = list.foo()
//check res is not of error type
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><String>(res)
}
}
@@ -4,6 +4,7 @@ package i
//+JDK
import java.util.*
import checkSubtype
fun <T, R> Collection<T>.map1(<!UNUSED_PARAMETER!>f<!> : (T) -> R) : List<R> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
fun <T, R> <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Iterable<T><!>.map1(<!UNUSED_PARAMETER!>f<!> : (T) -> R) : List<R> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -21,4 +22,4 @@ fun test1(list: List<Int>) {
val res = list.foo()
//check res is not of error type
checkSubtype<String>(<!TYPE_MISMATCH!>res<!>)
}
}
@@ -3,6 +3,8 @@
package aaa
import checkSubtype
infix fun <T> T.foo(t: T) = t
fun <T> id(t: T) = t
@@ -3,6 +3,8 @@
//KT-1029 Wrong type inference
package i
import checkSubtype
public fun<T> from(yielder: ()->Iterable<T>) : Iterable<T> {
}
@@ -3,6 +3,8 @@
//KT-1029 Wrong type inference
package i
import checkSubtype
public fun<T> from(<!UNUSED_PARAMETER!>yielder<!>: ()->Iterable<T>) : Iterable<T> {
<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -4,6 +4,7 @@
package i
import java.util.ArrayList
import checkSubtype
public infix fun<TItem> Iterable<TItem>.where(predicate : (TItem)->Boolean) : ()->Iterable<TItem> {
}
@@ -4,6 +4,7 @@
package i
import java.util.ArrayList
import checkSubtype
public infix fun<TItem> Iterable<TItem>.where(<!UNUSED_PARAMETER!>predicate<!> : (TItem)->Boolean) : ()->Iterable<TItem> {
<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -4,6 +4,8 @@
package d
import checkSubtype
fun test(numbers: Iterable<Int>) {
val s = numbers.map{it.toString()}.fold(""){it, it2 -> it + it2}
<!INAPPLICABLE_CANDIDATE!>checkSubtype<!><Int>(s)
@@ -12,4 +14,4 @@ fun test(numbers: Iterable<Int>) {
//from library
fun <T, R> Iterable<T>.map(transform : (T) -> R) : List<R> {}
fun <T> Iterable<T>.fold(initial: T, operation: (T, T) -> T): T {}
fun <T> Iterable<T>.fold(initial: T, operation: (T, T) -> T): T {}
@@ -4,6 +4,8 @@
package d
import checkSubtype
fun test(numbers: Iterable<Int>) {
val s = numbers.map{it.toString()}.fold(""){it, it2 -> it + it2}
checkSubtype<Int>(<!TYPE_MISMATCH!>s<!>)
@@ -12,4 +14,4 @@ fun test(numbers: Iterable<Int>) {
//from library
fun <T, R> Iterable<T>.map(<!UNUSED_PARAMETER!>transform<!> : (T) -> R) : List<R> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
fun <T> Iterable<T>.fold(<!UNUSED_PARAMETER!>initial<!>: T, <!UNUSED_PARAMETER!>operation<!>: (T, T) -> T): T {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
fun <T> Iterable<T>.fold(<!UNUSED_PARAMETER!>initial<!>: T, <!UNUSED_PARAMETER!>operation<!>: (T, T) -> T): T {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -4,6 +4,8 @@
//+JDK
package d
import checkSubtype
public fun <T> MutableCollection<out T>.filterToMy(result : MutableList<in T>, filter : (T) -> Boolean) : MutableCollection<out T> {
for (t in this){
if (filter(t)){
@@ -23,4 +25,4 @@ fun test(result: MutableList<in Any>, collection: MutableCollection<String>, pre
}
//from library
fun String.startsWith(prefix: String) : Boolean {}
fun String.startsWith(prefix: String) : Boolean {}
@@ -4,6 +4,8 @@
//+JDK
package d
import checkSubtype
public fun <T> MutableCollection<out T>.filterToMy(result : MutableList<in T>, filter : (T) -> Boolean) : MutableCollection<out T> {
for (t in this){
if (filter(t)){
@@ -23,4 +25,4 @@ fun test(result: MutableList<in Any>, collection: MutableCollection<String>, pre
}
//from library
fun String.startsWith(<!UNUSED_PARAMETER!>prefix<!>: String) : Boolean {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
fun String.startsWith(<!UNUSED_PARAMETER!>prefix<!>: String) : Boolean {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -4,6 +4,7 @@
package n
import java.util.ArrayList
import checkSubtype
fun test() {
val list = arrayList("foo", "bar") + arrayList("cheese", "wine")
@@ -14,4 +15,4 @@ fun test() {
//from library
fun <T> arrayList(vararg values: T) : ArrayList<T> {}
operator fun <T> Iterable<T>.plus(elements: Iterable<T>): List<T> {}
operator fun <T> Iterable<T>.plus(elements: Iterable<T>): List<T> {}
@@ -4,6 +4,7 @@
package n
import java.util.ArrayList
import checkSubtype
fun test() {
val list = arrayList("foo", "bar") + arrayList("cheese", "wine")
@@ -14,4 +15,4 @@ fun test() {
//from library
fun <T> arrayList(vararg <!UNUSED_PARAMETER!>values<!>: T) : ArrayList<T> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
operator fun <T> Iterable<T>.plus(<!UNUSED_PARAMETER!>elements<!>: Iterable<T>): List<T> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
operator fun <T> Iterable<T>.plus(<!UNUSED_PARAMETER!>elements<!>: Iterable<T>): List<T> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -4,6 +4,8 @@
//KT-1944 Inference fails on run()
package j
import checkSubtype
class P {
var x : Int = 0
private set
@@ -5,6 +5,7 @@ package i
//+JDK
import java.util.*
import checkSubtype
fun test() {
val sample1: List<List<Int?>> = arrayList(arrayList<Int?>(1, 7, null, 8))
@@ -5,6 +5,7 @@ package i
//+JDK
import java.util.*
import checkSubtype
fun test() {
val sample1: List<List<Int?>> = arrayList(arrayList<Int?>(1, 7, null, 8))
@@ -3,6 +3,7 @@
//KT-2200 array(array()) breaks compiler
package n
import checkSubtype
fun main() {
val a = array(array())
@@ -15,4 +16,4 @@ fun main() {
//from library
@Suppress("UNCHECKED_CAST")
fun <T> array(vararg t : T) : Array<T> = t as Array<T>
fun <T> array(vararg t : T) : Array<T> = t as Array<T>
@@ -3,6 +3,7 @@
//KT-2200 array(array()) breaks compiler
package n
import checkSubtype
fun main() {
val <!UNUSED_VARIABLE!>a<!> = <!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>array<!>(<!NI;NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, OI;TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>array<!>())
@@ -15,4 +16,4 @@ fun main() {
//from library
@Suppress("UNCHECKED_CAST")
fun <T> array(vararg t : T) : Array<T> = t as Array<T>
fun <T> array(vararg t : T) : Array<T> = t as Array<T>
@@ -3,6 +3,7 @@
//KT-2294 Type inference infers DONT_CARE instead of correct type
package a
import checkSubtype
public fun <E> foo(array: Array<E>): Array<E> = array
@@ -5,6 +5,7 @@ package i
//+JDK
import java.util.*
import checkSubtype
fun <T, K> someFunction(list: List<T>, transform: (T) -> K): List<K> {
val result = arrayList<K>()
@@ -5,6 +5,7 @@ package i
//+JDK
import java.util.*
import checkSubtype
fun <T, K> someFunction(list: List<T>, transform: (T) -> K): List<K> {
val result = arrayList<K>()
@@ -3,6 +3,7 @@
package n
import java.util.*
import checkSubtype
fun test() {
val foo = arrayList("").map { it -> it.length }.fold(0, { x, y -> Math.max(x, y) })
@@ -15,4 +16,4 @@ fun <T> arrayList(vararg values: T) : ArrayList<T> {}
fun <T, R> Collection<T>.map(transform : (T) -> R) : List<R> {}
fun <T> Iterable<T>.fold(initial: T, operation: (T, T) -> T): T {}
fun <T> Iterable<T>.fold(initial: T, operation: (T, T) -> T): T {}
@@ -3,6 +3,7 @@
package n
import java.util.*
import checkSubtype
fun test() {
val foo = arrayList("").map { it -> it.length }.fold(0, { x, y -> Math.max(x, y) })
@@ -15,4 +16,4 @@ fun <T> arrayList(vararg <!UNUSED_PARAMETER!>values<!>: T) : ArrayList<T> {<!NO_
fun <T, R> Collection<T>.map(<!UNUSED_PARAMETER!>transform<!> : (T) -> R) : List<R> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
fun <T> Iterable<T>.fold(<!UNUSED_PARAMETER!>initial<!>: T, <!UNUSED_PARAMETER!>operation<!>: (T, T) -> T): T {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
fun <T> Iterable<T>.fold(<!UNUSED_PARAMETER!>initial<!>: T, <!UNUSED_PARAMETER!>operation<!>: (T, T) -> T): T {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -5,6 +5,8 @@
package a
import checkSubtype
interface MyType {}
class MyClass<T> : MyType {}
@@ -4,6 +4,8 @@
//KT-731 Missing error from type inference
package a
import checkSubtype
class A<T>(x: T) {
val p = x
}
@@ -16,4 +18,4 @@ fun main() {
val a = A(1)
val t: String = a.foo({p -> p})
checkSubtype<String>(t)
}
}
@@ -4,6 +4,8 @@
//KT-731 Missing error from type inference
package a
import checkSubtype
class A<T>(x: T) {
val p = x
}
@@ -16,4 +18,4 @@ fun main() {
val a = A(1)
val t: String = <!NI;TYPE_MISMATCH!>a.<!OI;TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>foo({p -> <!TYPE_MISMATCH!>p<!>})<!><!>
checkSubtype<String>(t)
}
}
@@ -6,6 +6,7 @@ package maze
//+JDK
import java.util.Collections.*
import java.util.*
import checkSubtype
fun foo(lines: List<String>) {
val w = max(lines, comparator {o1, o2 ->
@@ -19,4 +20,4 @@ fun foo(lines: List<String>) {
//standard library
fun <T : Any> T?.sure() : T = this!!
public inline fun <T> comparator(fn: (T,T) -> Int): Comparator<T> {}
public inline fun <T> comparator(fn: (T,T) -> Int): Comparator<T> {}
@@ -6,6 +6,7 @@ package maze
//+JDK
import java.util.Collections.*
import java.util.*
import checkSubtype
fun foo(lines: List<String>) {
val w = max(lines, comparator {o1, o2 ->
@@ -19,4 +20,4 @@ fun foo(lines: List<String>) {
//standard library
fun <T : Any> T?.sure() : T = this!!
public inline fun <T> comparator(<!UNUSED_PARAMETER!>fn<!>: (T,T) -> Int): Comparator<T> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
public inline fun <T> comparator(<!UNUSED_PARAMETER!>fn<!>: (T,T) -> Int): Comparator<T> {<!NO_RETURN_IN_FUNCTION_WITH_BLOCK_BODY!>}<!>
@@ -6,6 +6,7 @@
package a
import java.util.*
import checkSubtype
fun <T> emptyList() : List<T>? = ArrayList<T>()
@@ -20,4 +21,4 @@ fun foo() {
doWithList(emptyList()!!)
}
fun doWithList(list: List<Int>) = list
fun doWithList(list: List<Int>) = list
@@ -6,6 +6,7 @@
package a
import java.util.*
import checkSubtype
fun <T> emptyList() : List<T>? = ArrayList<T>()
@@ -20,4 +21,4 @@ fun foo() {
doWithList(emptyList()!!)
}
fun doWithList(list: List<Int>) = list
fun doWithList(list: List<Int>) = list
@@ -4,6 +4,9 @@
package g
import java.util.HashSet
import checkType
import _
fun <T, C: Collection<T>> convert(src: Collection<T>, dest: C): C = throw Exception("$src $dest")
fun test(l: List<Int>) {
@@ -3,6 +3,8 @@
package s
import checkSubtype
interface In<in T>
interface A
@@ -30,4 +32,4 @@ fun test(inA: In<A>) {
checkSubtype<C>(r)
}
fun use(vararg a: Any?) = a
fun use(vararg a: Any?) = a
@@ -3,6 +3,8 @@
package s
import checkSubtype
interface In<in T>
interface A
@@ -30,4 +32,4 @@ fun test(inA: In<A>) {
checkSubtype<C>(r)
}
fun use(vararg a: Any?) = a
fun use(vararg a: Any?) = a
+2
View File
@@ -4,6 +4,8 @@
//KT-2394 java.lang.Iterable<T> should be visible as kotlin.Iterable<out T>
package d
import checkSubtype
fun foo(iterable: Iterable<Int>, iterator: Iterator<Int>, comparable: Comparable<Any>) {
checkSubtype<Iterable<Any>>(iterable)
checkSubtype<Iterator<Any>>(iterator)
+3 -1
View File
@@ -5,6 +5,8 @@ package a
import java.util.Iterator
import java.lang.Comparable as Comp
import checkSubtype
fun bar(any: Any): java.lang.Iterable<Int>? {
val a: java.lang.Comparable<String>? = null
val b: Iterable<Integer>
@@ -15,4 +17,4 @@ fun bar(any: Any): java.lang.Iterable<Int>? {
}
any as Iterator<*>
return null
}
}
+3 -1
View File
@@ -5,6 +5,8 @@ package a
import <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.util.Iterator<!>
import <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Comparable<!> as Comp
import checkSubtype
fun bar(any: Any): <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Iterable<Int><!>? {
val <!UNUSED_VARIABLE!>a<!>: <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Comparable<String><!>? = null
val <!UNUSED_VARIABLE!>b<!>: Iterable<<!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Integer<!>>
@@ -15,4 +17,4 @@ fun bar(any: Any): <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.Iterable<Int><!>
}
any as <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>Iterator<*><!>
return null
}
}
@@ -2,6 +2,8 @@
//KT-1778 Automatically cast error
package kt1778
import checkSubtype
fun main(args : Array<String>) {
val x = checkSubtype<Any>(args[0])
if(x is java.lang.CharSequence) {
@@ -9,4 +11,4 @@ fun main(args : Array<String>) {
if ("a" == x || "b" == x) x.<!UNRESOLVED_REFERENCE!>length<!> else x.length() // < THEN ERROR
if ("a" == x && "a" == x) x.<!UNRESOLVED_REFERENCE!>length<!> else x.length() // < ELSE ERROR
}
}
}
@@ -2,6 +2,8 @@
//KT-1778 Automatically cast error
package kt1778
import checkSubtype
fun main(args : Array<String>) {
val x = checkSubtype<Any>(args[0])
if(x is <!PLATFORM_CLASS_MAPPED_TO_KOTLIN!>java.lang.CharSequence<!>) {
@@ -9,4 +11,4 @@ fun main(args : Array<String>) {
if ("a" == x || "b" == x) <!DEBUG_INFO_SMARTCAST!>x<!>.length else <!DEBUG_INFO_SMARTCAST!>x<!>.length() // < THEN ERROR
if ("a" == x && "a" == x) <!DEBUG_INFO_SMARTCAST!>x<!>.length else <!DEBUG_INFO_SMARTCAST!>x<!>.length() // < ELSE ERROR
}
}
}
@@ -3,6 +3,8 @@
//KT-2176 non-nullability is not inferred after !! or "as"
package kt2176
import checkSubtype
fun f1(a: String?) {
a!!
checkSubtype<String>(a)
@@ -3,6 +3,8 @@
//KT-2176 non-nullability is not inferred after !! or "as"
package kt2176
import checkSubtype
fun f1(a: String?) {
a!!
checkSubtype<String>(<!DEBUG_INFO_SMARTCAST!>a<!>)
@@ -2,6 +2,8 @@
package a
import checkSubtype
//KT-2234 'period!!' has type Int?
class Pair<A, B>(val a: A, val b: B)
@@ -2,6 +2,8 @@
package a
import checkSubtype
//KT-2234 'period!!' has type Int?
class Pair<A, B>(val a: A, val b: B)
@@ -3,6 +3,8 @@
package a
import checkSubtype
fun <T> id(t: T): T = t
fun <T> either(t1: T, t2: T): T = t1
@@ -20,4 +22,4 @@ fun test() {
checkSubtype<Any>(d)
val e: Float = id(1)
}
}
@@ -3,6 +3,8 @@
package a
import checkSubtype
fun <T> id(t: T): T = t
fun <T> either(t1: T, <!UNUSED_PARAMETER!>t2<!>: T): T = t1
@@ -20,4 +22,4 @@ fun test() {
checkSubtype<Any>(d)
val <!UNUSED_VARIABLE!>e<!>: Float = <!NI;TYPE_MISMATCH, NI;TYPE_MISMATCH, OI;TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>id(1)<!>
}
}
@@ -2,6 +2,10 @@
// !CHECK_TYPE
package a
import checkType
import _
import checkSubtype
fun <T> id(t: T): T = t
fun <T> either(t1: T, t2: T): T = t1
@@ -2,6 +2,10 @@
// !CHECK_TYPE
package a
import checkType
import _
import checkSubtype
fun <T> id(t: T): T = t
fun <T> either(t1: T, <!UNUSED_PARAMETER!>t2<!>: T): T = t1
@@ -3,7 +3,10 @@
// !CHECK_TYPE
package ppp
import checkType
import _
fun foo(f: ft<Int, Int?>) {
f.checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Int>() }
f.checkType { <!INAPPLICABLE_CANDIDATE!>_<!><Int?>() }
}
}
@@ -3,7 +3,10 @@
// !CHECK_TYPE
package ppp
import checkType
import _
fun foo(f: ft<Int, Int?>) {
f.checkType { _<Int>() }
f.checkType { _<Int?>() }
}
}
@@ -11,6 +11,8 @@ public abstract class AbstractModule<S> {
package module2
import module1.*
import checkType
import _
fun <T> javaClass(): Class<T> = null!!
@@ -11,6 +11,8 @@ public abstract class AbstractModule<S> {
package module2
import module1.*
import checkType
import _
fun <T> javaClass(): Class<T> = null!!
@@ -3,6 +3,8 @@
package a
import checkSubtype
fun <T> id(t: T): T = t
fun <T> two(u: T, v: T): T = u
@@ -58,4 +60,4 @@ fun rr(s: String?) {
//from library
fun <T> arrayListOf(vararg values: T): MutableList<T> = throw Exception()
fun use(vararg a: Any) = a
fun use(vararg a: Any) = a
@@ -3,6 +3,8 @@
package a
import checkSubtype
fun <T> id(t: T): T = t
fun <T> two(u: T, <!UNUSED_PARAMETER!>v<!>: T): T = u
@@ -58,4 +60,4 @@ fun rr(s: String?) {
//from library
fun <T> arrayListOf(vararg <!UNUSED_PARAMETER!>values<!>: T): MutableList<T> = throw Exception()
fun use(vararg a: Any) = a
fun use(vararg a: Any) = a
@@ -3,6 +3,9 @@
// FILE: a.kt
package a
import checkType
import _
class B(x: String)
typealias A1 = B
private typealias A2 = B
@@ -18,6 +21,8 @@ fun bar() {
package usage
import a.B
import checkType
import _
fun baz() {
a.A1("") // resolved to B constructor, OK
@@ -3,6 +3,9 @@
// FILE: a.kt
package a
import checkType
import _
class B(x: String)
typealias A1 = B
private typealias A2 = B
@@ -18,6 +21,8 @@ fun bar() {
package usage
import a.B
import checkType
import _
fun baz() {
a.A1("") // resolved to B constructor, OK
@@ -3,6 +3,8 @@
package b
import checkSubtype
fun bar() {
val a1 = Array(1, {i: Int -> i})
val a2 = Array(1, {i: Int -> "$i"})
@@ -3,6 +3,8 @@
//KT-1558 Exception while analyzing
package j
import checkSubtype
fun <T : Any> T?.sure() : T = this!!
fun <E> List<*>.toArray(ar: Array<E>): Array<E> = ar
@@ -3,6 +3,8 @@
//KT-1558 Exception while analyzing
package j
import checkSubtype
fun <T : Any> T?.sure() : T = this!!
fun <E> List<*>.toArray(ar: Array<E>): Array<E> = ar
@@ -20,6 +20,8 @@ fun A.forEach(s: String) {}
package a
import b.*
import checkType
import _
class A {
fun forEach() = this
@@ -20,6 +20,8 @@ fun A.forEach(s: String) {}
package a
import b.*
import checkType
import _
class A {
fun forEach() = this
@@ -625,6 +625,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
getTopLevelPackagesFromFileList(getKtFiles(testFiles, false))
).toSet()
val checkTypeEnabled = testFiles.any { it.declareCheckType }
val stepIntoFilter = Predicate<DeclarationDescriptor> { descriptor ->
val module = DescriptorUtils.getContainingModuleOrNull(descriptor)
if (module !in modules) return@Predicate false
@@ -634,6 +635,8 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
return@Predicate fqName.isRoot || fqName.pathSegments().first() in packagesNames
}
if (checkTypeEnabled && descriptor.name in NAMES_OF_CHECK_TYPE_HELPER) return@Predicate false
true
}
@@ -768,5 +771,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
private val HASH_SANITIZER = fun(s: String): String = s.replace("@(\\d)+".toRegex(), "")
private val MODULE_FILES = ModuleCapability<List<KtFile>>("")
private val NAMES_OF_CHECK_TYPE_HELPER = listOf("checkSubtype", "CheckTypeInv", "_", "checkType").map { Name.identifier(it) }
}
}
@@ -190,9 +190,6 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, Tes
private val imports: String
get() = buildString {
// Line separator is "\n" intentionally here (see DocumentImpl.assertValidSeparators)
if (declareCheckType) {
append(CHECK_TYPE_IMPORT + "\n")
}
if (declareFlexibleType) {
append(EXPLICIT_FLEXIBLE_TYPES_IMPORT + "\n")
}
@@ -403,8 +400,6 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, Tes
)
val CHECK_TYPE_DIRECTIVE = "CHECK_TYPE"
val CHECK_TYPE_PACKAGE = "tests._checkType"
val CHECK_TYPE_IMPORT = "import $CHECK_TYPE_PACKAGE.*"
val EXPLICIT_FLEXIBLE_TYPES_DIRECTIVE = "EXPLICIT_FLEXIBLE_TYPES"
val EXPLICIT_FLEXIBLE_PACKAGE = InternalFlexibleTypeTransformer.FLEXIBLE_TYPE_CLASSIFIER.packageFqName.asString()