[FIR-TEST] Move analysis tests to separate module

This commit is contained in:
Dmitriy Novozhilov
2020-03-18 15:10:46 +03:00
parent 3a479d5d16
commit cc07ae96b3
1477 changed files with 1001 additions and 980 deletions
@@ -0,0 +1,17 @@
// FILE: JavaClass.java
public class JavaClass {
protected String field;
public String getField() {
return field;
}
}
// FILE: test.kt
package some
fun test(jc: JavaClass) {
jc.field
}
@@ -0,0 +1,4 @@
FILE: test.kt
public final fun test(jc: R|JavaClass|): R|kotlin/Unit| {
R|<local>/jc|.R|/JavaClass.field|
}
@@ -0,0 +1,13 @@
// FILE: JavaClass.java
public class JavaClass<T> {
protected final T myHost;
}
// FILE: Derived.kt
public class Derived : JavaClass<String>() {
fun test() {
myHost.length
}
}
@@ -0,0 +1,11 @@
FILE: Derived.kt
public final class Derived : R|JavaClass<kotlin/String>| {
public constructor(): R|Derived| {
super<R|JavaClass<kotlin/String>|>()
}
public final fun test(): R|kotlin/Unit| {
this@R|/Derived|.R|/Derived.myHost|.R|kotlin/String.length|
}
}
@@ -0,0 +1,22 @@
// WITH_RUNTIME
// FILE: JavaClass.java
public class JavaClass {
public static void foo1(kotlin.jvm.functions.Function0<Integer> x) {}
public static void foo2(kotlin.jvm.functions.Function1<Integer, String> x) {}
public static <T> void foo3(kotlin.jvm.functions.Function1<T, String> x, T y) {}
}
// FILE: main.kt
fun main() {
JavaClass.foo1 { 123 }
JavaClass.foo2 { (it + 2).toString() }
JavaClass.foo2({ (it + 3).toString() })
val y = { x: Int -> x.toString() }
JavaClass.foo2(y)
JavaClass.foo3({ (it + 4).toString() }, 5)
}
@@ -0,0 +1,24 @@
FILE: main.kt
public final fun main(): R|kotlin/Unit| {
Q|JavaClass|.R|/JavaClass.foo1|(<L> = foo1@fun <anonymous>(): R|ft<kotlin/Int, kotlin/Int?>!| {
^ Int(123)
}
)
Q|JavaClass|.R|/JavaClass.foo2|(<L> = foo2@fun <anonymous>(it: R|ft<kotlin/Int, kotlin/Int?>!|): R|ft<kotlin/String, kotlin/String?>!| {
^ R|<local>/it|.R|kotlin/Int.plus|(Int(2)).R|kotlin/Any.toString|()
}
)
Q|JavaClass|.R|/JavaClass.foo2|(foo2@fun <anonymous>(it: R|ft<kotlin/Int, kotlin/Int?>!|): R|ft<kotlin/String, kotlin/String?>!| {
^ R|<local>/it|.R|kotlin/Int.plus|(Int(3)).R|kotlin/Any.toString|()
}
)
lval y: R|(kotlin/Int) -> kotlin/String| = fun <anonymous>(x: R|kotlin/Int|): R|kotlin/String| {
^ R|<local>/x|.R|kotlin/Any.toString|()
}
Q|JavaClass|.R|/JavaClass.foo2|(R|<local>/y|)
Q|JavaClass|.R|/JavaClass.foo3|<R|kotlin/Int|>(foo3@fun <anonymous>(it: R|kotlin/Int|): R|ft<kotlin/String, kotlin/String?>!| {
^ R|<local>/it|.R|kotlin/Int.plus|(Int(4)).R|kotlin/Any.toString|()
}
, Int(5))
}
@@ -0,0 +1,62 @@
// FILE: j/JavaPackageLocal.java
package j;
public class JavaPackageLocal {
static void javaMPackage() {}
static int javaPPackage = 4;
}
// FILE: j/JavaProtected.java
package j;
public class JavaProtected {
protected static void javaMProtectedStatic() {}
protected static int javaPProtectedStatic = 4;
protected final int javaPProtectedPackage = 4;
}
// FILE: k.kt
package k
import j.JavaProtected
import j.JavaPackageLocal
class A {
val p1 = JavaPackageLocal.<!INAPPLICABLE_CANDIDATE!>javaPPackage<!>
val p2 = JavaProtected.<!INAPPLICABLE_CANDIDATE!>javaPProtectedStatic<!>
val p3 = JavaProtected().<!INAPPLICABLE_CANDIDATE!>javaPProtectedPackage<!>
fun test() {
JavaProtected.<!INAPPLICABLE_CANDIDATE!>javaMProtectedStatic<!>()
JavaPackageLocal.<!INAPPLICABLE_CANDIDATE!>javaMPackage<!>()
}
}
class B : JavaProtected() {
val p1 = JavaPackageLocal.<!INAPPLICABLE_CANDIDATE!>javaPPackage<!>
val p2 = JavaProtected.javaPProtectedStatic
val p3 = javaPProtectedPackage
fun test() {
JavaProtected.javaMProtectedStatic()
JavaPackageLocal.<!INAPPLICABLE_CANDIDATE!>javaMPackage<!>()
}
}
// FILE: j.kt
package j
import j.JavaProtected
import j.JavaPackageLocal
class C {
val p1 = JavaPackageLocal.javaPPackage
val p2 = JavaProtected.javaPProtectedStatic
val p3 = JavaProtected().javaPProtectedPackage
fun test() {
JavaProtected.javaMProtectedStatic()
JavaProtected.javaMProtectedStatic()
JavaPackageLocal.javaMPackage()
}
}
@@ -0,0 +1,63 @@
FILE: k.kt
public final class A : R|kotlin/Any| {
public constructor(): R|k/A| {
super<R|kotlin/Any|>()
}
public final val p1: <ERROR TYPE REF: Inapplicable(HIDDEN): [j/JavaPackageLocal.javaPPackage]> = Q|j/JavaPackageLocal|.<Inapplicable(HIDDEN): [j/JavaPackageLocal.javaPPackage]>#
public get(): <ERROR TYPE REF: Inapplicable(HIDDEN): [j/JavaPackageLocal.javaPPackage]>
public final val p2: <ERROR TYPE REF: Inapplicable(HIDDEN): [j/JavaProtected.javaPProtectedStatic]> = Q|j/JavaProtected|.<Inapplicable(HIDDEN): [j/JavaProtected.javaPProtectedStatic]>#
public get(): <ERROR TYPE REF: Inapplicable(HIDDEN): [j/JavaProtected.javaPProtectedStatic]>
public final val p3: <ERROR TYPE REF: Inapplicable(HIDDEN): [j/JavaProtected.javaPProtectedPackage]> = R|j/JavaProtected.JavaProtected|().<Inapplicable(HIDDEN): [j/JavaProtected.javaPProtectedPackage]>#
public get(): <ERROR TYPE REF: Inapplicable(HIDDEN): [j/JavaProtected.javaPProtectedPackage]>
public final fun test(): R|kotlin/Unit| {
Q|j/JavaProtected|.<Inapplicable(HIDDEN): [j/JavaProtected.javaMProtectedStatic]>#()
Q|j/JavaPackageLocal|.<Inapplicable(HIDDEN): [j/JavaPackageLocal.javaMPackage]>#()
}
}
public final class B : R|j/JavaProtected| {
public constructor(): R|k/B| {
super<R|j/JavaProtected|>()
}
public final val p1: <ERROR TYPE REF: Inapplicable(HIDDEN): [j/JavaPackageLocal.javaPPackage]> = Q|j/JavaPackageLocal|.<Inapplicable(HIDDEN): [j/JavaPackageLocal.javaPPackage]>#
public get(): <ERROR TYPE REF: Inapplicable(HIDDEN): [j/JavaPackageLocal.javaPPackage]>
public final val p2: R|kotlin/Int| = Q|j/JavaProtected|.R|j/JavaProtected.javaPProtectedStatic|
public get(): R|kotlin/Int|
public final val p3: R|kotlin/Int| = this@R|k/B|.R|j/JavaProtected.javaPProtectedPackage|
public get(): R|kotlin/Int|
public final fun test(): R|kotlin/Unit| {
Q|j/JavaProtected|.R|j/JavaProtected.javaMProtectedStatic|()
Q|j/JavaPackageLocal|.<Inapplicable(HIDDEN): [j/JavaPackageLocal.javaMPackage]>#()
}
}
FILE: j.kt
public final class C : R|kotlin/Any| {
public constructor(): R|j/C| {
super<R|kotlin/Any|>()
}
public final val p1: R|kotlin/Int| = Q|j/JavaPackageLocal|.R|j/JavaPackageLocal.javaPPackage|
public get(): R|kotlin/Int|
public final val p2: R|kotlin/Int| = Q|j/JavaProtected|.R|j/JavaProtected.javaPProtectedStatic|
public get(): R|kotlin/Int|
public final val p3: R|kotlin/Int| = R|j/JavaProtected.JavaProtected|().R|j/JavaProtected.javaPProtectedPackage|
public get(): R|kotlin/Int|
public final fun test(): R|kotlin/Unit| {
Q|j/JavaProtected|.R|j/JavaProtected.javaMProtectedStatic|()
Q|j/JavaProtected|.R|j/JavaProtected.javaMProtectedStatic|()
Q|j/JavaPackageLocal|.R|j/JavaPackageLocal.javaMPackage|()
}
}
@@ -0,0 +1,30 @@
// FILE: K1.kt
class K2: J1() {
fun bar() {
foo()
baz()
superClass()
superI()
}
}
// FILE: J1.java
public class J1 extends KFirst {
void baz() {}
}
// FILE: K2.kt
open class KFirst : SuperClass(), SuperI {
fun foo() {
}
}
// FILE: K3.kt
abstract class SuperClass {
fun superClass() {}
}
interface SuperI {
fun superI() {}
}
@@ -0,0 +1,39 @@
FILE: K1.kt
public final class K2 : R|J1| {
public constructor(): R|K2| {
super<R|J1|>()
}
public final fun bar(): R|kotlin/Unit| {
this@R|/K2|.R|/KFirst.foo|()
this@R|/K2|.R|/J1.baz|()
this@R|/K2|.R|/SuperClass.superClass|()
this@R|/K2|.R|/SuperI.superI|()
}
}
FILE: K2.kt
public open class KFirst : R|SuperClass|, R|SuperI| {
public constructor(): R|KFirst| {
super<R|SuperClass|>()
}
public final fun foo(): R|kotlin/Unit| {
}
}
FILE: K3.kt
public abstract class SuperClass : R|kotlin/Any| {
public constructor(): R|SuperClass| {
super<R|kotlin/Any|>()
}
public final fun superClass(): R|kotlin/Unit| {
}
}
public abstract interface SuperI : R|kotlin/Any| {
public open fun superI(): R|kotlin/Unit| {
}
}
@@ -0,0 +1,37 @@
// FILE: K1.kt
class KSub : J1()
fun main(k: KSub, vString: SuperClass<String>.NestedInSuperClass, vInt: SuperClass<Int>.NestedInSuperClass) {
k.getImpl().nestedI(vString)
// TODO: Support parametrisized inner classes
k.getImpl().nestedI(vInt)
k.getNestedSubClass().<!INAPPLICABLE_CANDIDATE!>nested<!>("")
k.getNestedSubClass().nested(1)
}
// FILE: J1.java
public class J1 extends KFirst {
public class NestedSubClass extends NestedInSuperClass {}
public abstract class NestedIImpl implements NestedInI<NestedInSuperClass> {}
public NestedIImpl getImpl() { return null; }
public NestedSubClass getNestedSubClass() { return null; }
}
// FILE: K2.kt
open class KFirst : SuperClass<String>(), SuperI<Int>
// FILE: K3.kt
abstract class SuperClass<T> {
inner open class NestedInSuperClass {
fun nested(x: T) {}
}
}
interface SuperI<E> {
interface NestedInI<F> {
fun nestedI(f: F) {}
}
}
@@ -0,0 +1,45 @@
FILE: K1.kt
public final class KSub : R|J1| {
public constructor(): R|KSub| {
super<R|J1|>()
}
}
public final fun main(k: R|KSub|, vString: R|SuperClass.NestedInSuperClass<kotlin/String>|, vInt: R|SuperClass.NestedInSuperClass<kotlin/Int>|): R|kotlin/Unit| {
R|<local>/k|.R|/J1.getImpl|().R|FakeOverride</J1.NestedIImpl.nestedI: R|kotlin/Unit|>|(R|<local>/vString|)
R|<local>/k|.R|/J1.getImpl|().R|FakeOverride</J1.NestedIImpl.nestedI: R|kotlin/Unit|>|(R|<local>/vInt|)
R|<local>/k|.R|/J1.getNestedSubClass|().<Inapplicable(INAPPLICABLE): [/SuperClass.NestedInSuperClass.nested]>#(String())
R|<local>/k|.R|/J1.getNestedSubClass|().R|/SuperClass.NestedInSuperClass.nested|(Int(1))
}
FILE: K2.kt
public open class KFirst : R|SuperClass<kotlin/String>|, R|SuperI<kotlin/Int>| {
public constructor(): R|KFirst| {
super<R|SuperClass<kotlin/String>|>()
}
}
FILE: K3.kt
public abstract class SuperClass<T> : R|kotlin/Any| {
public constructor<T>(): R|SuperClass<T>| {
super<R|kotlin/Any|>()
}
public open inner class NestedInSuperClass : R|kotlin/Any| {
public constructor(): R|SuperClass.NestedInSuperClass| {
super<R|kotlin/Any|>()
}
public final fun nested(x: R|T|): R|kotlin/Unit| {
}
}
}
public abstract interface SuperI<E> : R|kotlin/Any| {
public abstract interface NestedInI<F> : R|kotlin/Any| {
public open fun nestedI(f: R|F|): R|kotlin/Unit| {
}
}
}
@@ -0,0 +1,18 @@
// FILE: K1.kt
open class KFirst() {
fun foo() {
}
}
// FILE: J1.java
public class J1 extends KFirst {
void baz() {}
}
// FILE: K2.kt
class K2: J1() {
fun bar() {
foo()
baz()
}
}
@@ -0,0 +1,22 @@
FILE: K1.kt
public open class KFirst : R|kotlin/Any| {
public constructor(): R|KFirst| {
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/Unit| {
}
}
FILE: K2.kt
public final class K2 : R|J1| {
public constructor(): R|K2| {
super<R|J1|>()
}
public final fun bar(): R|kotlin/Unit| {
this@R|/K2|.R|/KFirst.foo|()
this@R|/K2|.R|/J1.baz|()
}
}
@@ -0,0 +1,17 @@
// FILE: K1.kt
open class KFirst<T: java.io.Serializable>() {
fun foo(t: T): T = t
}
// FILE: J1.java
public class J1 extends KFirst<Integer> {
void baz() {}
}
// FILE: K2.kt
class K2: J1() {
fun bar() {
foo(1)
baz()
}
}
@@ -0,0 +1,23 @@
FILE: K1.kt
public open class KFirst<T : R|java/io/Serializable|> : R|kotlin/Any| {
public constructor<T : R|java/io/Serializable|>(): R|KFirst<T>| {
super<R|kotlin/Any|>()
}
public final fun foo(t: R|T|): R|T| {
^foo R|<local>/t|
}
}
FILE: K2.kt
public final class K2 : R|J1| {
public constructor(): R|K2| {
super<R|J1|>()
}
public final fun bar(): R|kotlin/Unit| {
this@R|/K2|.R|FakeOverride</J1.foo: R|ft<kotlin/Int, kotlin/Int?>!|>|(Int(1))
this@R|/K2|.R|/J1.baz|()
}
}
@@ -0,0 +1,13 @@
// FILE: K1.kt
class KotlinClass
// FILE: JavaClass.java
public class JavaClass {
public static void baz(KotlinClass k) {}
}
// FILE: K2.kt
fun main() {
JavaClass.baz(KotlinClass())
JavaClass.<!INAPPLICABLE_CANDIDATE!>baz<!>("")
}
@@ -0,0 +1,12 @@
FILE: K1.kt
public final class KotlinClass : R|kotlin/Any| {
public constructor(): R|KotlinClass| {
super<R|kotlin/Any|>()
}
}
FILE: K2.kt
public final fun main(): R|kotlin/Unit| {
Q|JavaClass|.R|/JavaClass.baz|(R|/KotlinClass.KotlinClass|())
Q|JavaClass|.<Inapplicable(INAPPLICABLE): [/JavaClass.baz]>#(String())
}
@@ -0,0 +1,15 @@
// FILE: K1.kt
class KotlinClass<T>
// FILE: JavaClass.java
public class JavaClass {
public static void baz(KotlinClass<Integer> k) {}
}
// FILE: K2.kt
fun main() {
JavaClass.baz(KotlinClass())
JavaClass.baz(KotlinClass<Int>())
JavaClass.<!INAPPLICABLE_CANDIDATE!>baz<!>(KotlinClass<String>())
JavaClass.<!INAPPLICABLE_CANDIDATE!>baz<!>("")
}
@@ -0,0 +1,14 @@
FILE: K1.kt
public final class KotlinClass<T> : R|kotlin/Any| {
public constructor<T>(): R|KotlinClass<T>| {
super<R|kotlin/Any|>()
}
}
FILE: K2.kt
public final fun main(): R|kotlin/Unit| {
Q|JavaClass|.R|/JavaClass.baz|(R|/KotlinClass.KotlinClass|<R|ft<kotlin/Int, kotlin/Int?>!|>())
Q|JavaClass|.R|/JavaClass.baz|(R|/KotlinClass.KotlinClass|<R|kotlin/Int|>())
Q|JavaClass|.<Inapplicable(INAPPLICABLE): [/JavaClass.baz]>#(R|/KotlinClass.KotlinClass|<R|kotlin/String|>())
Q|JavaClass|.<Inapplicable(INAPPLICABLE): [/JavaClass.baz]>#(String())
}
@@ -0,0 +1,26 @@
// FULL_JDK
// FILE: Logger.java
public class Logger {
private static Logger me = new Logger();
public static Logger getInstance(String s) {
return me;
}
public static Logger getInstance(Class c) {
return me;
}
}
// FILE: test.kt
fun test() {
val logger = Logger.getInstance("test")
}
class MyTest {
private val klass = this::class.java
private val logger = Logger.getInstance(klass)
}
@@ -0,0 +1,16 @@
FILE: test.kt
public final fun test(): R|kotlin/Unit| {
lval logger: R|ft<Logger, Logger?>!| = Q|Logger|.R|/Logger.getInstance|(String(test))
}
public final class MyTest : R|kotlin/Any| {
public constructor(): R|MyTest| {
super<R|kotlin/Any|>()
}
private final val klass: R|java/lang/Class<MyTest>| = <getClass>(this@R|/MyTest|).R|kotlin/jvm/java|<R|MyTest|>
private get(): R|java/lang/Class<MyTest>|
private final val logger: R|ft<Logger, Logger?>!| = Q|Logger|.R|/Logger.getInstance|(this@R|/MyTest|.R|/MyTest.klass|)
private get(): R|ft<Logger, Logger?>!|
}
@@ -0,0 +1,11 @@
// FULL_JDK
// STDLIB_JDK8
// !JVM_TARGET: 1.8
fun <D> MutableMap<String, MutableSet<D>>.initAndAdd(key: String, value: D) {
this.compute(key) { _, maybeValues ->
val setOfValues = maybeValues ?: mutableSetOf()
setOfValues.add(value)
setOfValues
}
}
@@ -0,0 +1,17 @@
FILE: MapCompute.kt
public final fun <D> R|kotlin/collections/MutableMap<kotlin/String, kotlin/collections/MutableSet<D>>|.initAndAdd(key: R|kotlin/String|, value: R|D|): R|kotlin/Unit| {
this@R|/initAndAdd|.R|FakeOverride<java/util/Map.compute: R|kotlin/collections/MutableSet<D>?|>|(R|<local>/key|, <L> = compute@fun <anonymous>(_: R|ft<kotlin/String, kotlin/String?>!|, maybeValues: R|ft<kotlin/collections/MutableSet<D>, kotlin/collections/MutableSet<D>?>!|): R|ft<kotlin/collections/MutableSet<D>, kotlin/collections/MutableSet<D>?>!| {
lval setOfValues: R|kotlin/collections/MutableSet<D>| = when (lval <elvis>: R|ft<kotlin/collections/MutableSet<D>, kotlin/collections/MutableSet<D>?>!| = R|<local>/maybeValues|) {
==($subj$, Null(null)) -> {
R|kotlin/collections/mutableSetOf|<R|D|>()
}
else -> {
R|<local>/<elvis>|
}
}
R|<local>/setOfValues|.R|FakeOverride<kotlin/collections/MutableSet.add: R|kotlin/Boolean|>|(R|<local>/value|)
^ R|<local>/setOfValues|
}
)
}
@@ -0,0 +1,23 @@
// FILE: Test.java
import java.lang.*;
import java.util.*;
public class Test {
public static class MapEntryImpl implements Map.Entry<String, String> {
public String getKey() { return null; }
public String getValue() { return null; }
public String setValue(String s) { return null; }
}
}
// FILE: main.kt
class MyMapEntry : Test.MapEntryImpl()
fun test() {
val b = MyMapEntry()
val key = b.key
val value = b.value
b.setValue(null)
}
@@ -0,0 +1,13 @@
FILE: main.kt
public final class MyMapEntry : R|Test.MapEntryImpl| {
public constructor(): R|MyMapEntry| {
super<R|Test.MapEntryImpl|>()
}
}
public final fun test(): R|kotlin/Unit| {
lval b: R|MyMapEntry| = R|/MyMapEntry.MyMapEntry|()
lval key: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/b|.R|/Test.MapEntryImpl.key|
lval value: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/b|.R|/Test.MapEntryImpl.value|
R|<local>/b|.R|/Test.MapEntryImpl.setValue|(Null(null))
}
@@ -0,0 +1,28 @@
// FULL_JDK
// FILE: YourException.java
class YourException extends Exception {
}
// FILE: test.kt
import java.io.PrintStream
class MyException : Exception()
fun test(e: MyException, stream: PrintStream) {
e.printStackTrace() // Cannot be resolved with early J2K mapping due deriving of kotlin.Throwable instead of java.lang.Throwable
e.printStackTrace(stream)
val result = e.getLocalizedMessage()
}
fun test(e: YourException, stream: PrintStream) {
e.printStackTrace()
e.printStackTrace(stream)
val result = e.getLocalizedMessage()
}
fun test(e: Exception, stream: PrintStream) {
e.printStackTrace()
e.printStackTrace(stream)
val result = e.getLocalizedMessage()
}
@@ -0,0 +1,22 @@
FILE: test.kt
public final class MyException : R|kotlin/Exception| {
public constructor(): R|MyException| {
super<R|kotlin/Exception|>()
}
}
public final fun test(e: R|MyException|, stream: R|java/io/PrintStream|): R|kotlin/Unit| {
R|<local>/e|.R|java/lang/Throwable.printStackTrace|()
R|<local>/e|.R|java/lang/Throwable.printStackTrace|(R|<local>/stream|)
lval result: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/e|.R|java/lang/Throwable.getLocalizedMessage|()
}
public final fun test(e: R|YourException|, stream: R|java/io/PrintStream|): R|kotlin/Unit| {
R|<local>/e|.R|java/lang/Throwable.printStackTrace|()
R|<local>/e|.R|java/lang/Throwable.printStackTrace|(R|<local>/stream|)
lval result: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/e|.R|java/lang/Throwable.getLocalizedMessage|()
}
public final fun test(e: R|kotlin/Exception|, stream: R|java/io/PrintStream|): R|kotlin/Unit| {
R|<local>/e|.R|java/lang/Throwable.printStackTrace|()
R|<local>/e|.R|java/lang/Throwable.printStackTrace|(R|<local>/stream|)
lval result: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/e|.R|java/lang/Throwable.getLocalizedMessage|()
}
@@ -0,0 +1,16 @@
// FULL_JDK
// FILE: MyIterable.java
public interface MyIterable<T> extends Iterable<T>
// FILE: test.kt
interface UseIterable : MyIterable<String> {
fun test() {
val it = iterator()
val split = spliterator()
}
}
fun test(some: Iterable<String>) {
val it = some.iterator()
val split = some.spliterator()
}
@@ -0,0 +1,12 @@
FILE: test.kt
public abstract interface UseIterable : R|MyIterable<kotlin/String>| {
public open fun test(): R|kotlin/Unit| {
lval it: R|kotlin/collections/MutableIterator<ft<kotlin/String, kotlin/String?>!>| = this@R|/UseIterable|.R|FakeOverride</UseIterable.iterator: R|kotlin/collections/MutableIterator<ft<kotlin/String, kotlin/String?>!>|>|()
lval split: R|java/util/Spliterator<ft<kotlin/String, kotlin/String?>!>| = this@R|/UseIterable|.R|FakeOverride</UseIterable.spliterator: R|java/util/Spliterator<ft<kotlin/String, kotlin/String?>!>|>|()
}
}
public final fun test(some: R|kotlin/collections/Iterable<kotlin/String>|): R|kotlin/Unit| {
lval it: R|kotlin/collections/Iterator<kotlin/String>| = R|<local>/some|.R|FakeOverride<kotlin/collections/Iterable.iterator: R|kotlin/collections/Iterator<kotlin/String>|>|()
lval split: R|java/util/Spliterator<ft<kotlin/String, kotlin/String?>!>| = R|<local>/some|.R|FakeOverride<java/lang/Iterable.spliterator: R|java/util/Spliterator<ft<kotlin/String, kotlin/String?>!>|>|()
}
@@ -0,0 +1,43 @@
// FULL_JDK
// FILE: MyMap.java
public abstract class MyMap implements java.util.Map<String, String> {}
// FILE: test.kt
fun test(map: MyMap) {
val result = map.getOrPut("key") { "value" } // Cannot be resolved without early J2K mapping
// In contrast, should be taken from JDK
val otherResult = map.getOrDefault("key", "value")
val anotherResult = map.replace("key", "value")
// Java forEach
map.forEach { key, value ->
println("$key: $value")
key.length
value.length
}
// Kotlin forEach
map.forEach { (key, value) ->
println("$key: $value")
key.length
value.length
}
}
fun test(map: MutableMap<String, String>) {
val result = map.getOrPut("key") { "value" } // Cannot be resolved without early J2K mapping
// In contrast, should be taken from JDK
val otherResult = map.getOrDefault("key", "value")
val anotherResult = map.replace("key", "value")
// Java forEach
map.forEach { key, value ->
println("$key: $value")
key.length
value.length
}
// Kotlin forEach
map.forEach { (key, value) ->
println("$key: $value")
key.length
value.length
}
}
@@ -0,0 +1,45 @@
FILE: test.kt
public final fun test(map: R|MyMap|): R|kotlin/Unit| {
lval result: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/map|.R|kotlin/collections/getOrPut|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/String, kotlin/String?>!|>(String(key), <L> = getOrPut@fun <anonymous>(): R|kotlin/String| <kind=UNKNOWN> {
^ String(value)
}
)
lval otherResult: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/map|.R|FakeOverride</MyMap.getOrDefault: R|ft<kotlin/String, kotlin/String?>!|>|(String(key), String(value))
lval anotherResult: R|kotlin/String?| = R|<local>/map|.R|FakeOverride</MyMap.replace: R|kotlin/String?|>|(String(key), String(value))
R|<local>/map|.R|FakeOverride</MyMap.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|ft<kotlin/String, kotlin/String?>!|, value: R|ft<kotlin/String, kotlin/String?>!|): R|kotlin/Unit| {
R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|()))
R|<local>/key|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
R|<local>/map|.R|kotlin/collections/forEach|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = forEach@fun <anonymous>(<destruct>: R|kotlin/collections/Map.Entry<ft<kotlin/String, kotlin/String?>!, ft<kotlin/String, kotlin/String?>!>|): R|kotlin/Unit| <kind=UNKNOWN> {
lval key: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/<destruct>|.R|kotlin/collections/component1|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/String, kotlin/String?>!|>()
lval value: R|ft<kotlin/String, kotlin/String?>!| = R|<local>/<destruct>|.R|kotlin/collections/component2|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/String, kotlin/String?>!|>()
R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|()))
R|<local>/key|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
}
public final fun test(map: R|kotlin/collections/MutableMap<kotlin/String, kotlin/String>|): R|kotlin/Unit| {
lval result: R|kotlin/String| = R|<local>/map|.R|kotlin/collections/getOrPut|<R|kotlin/String|, R|kotlin/String|>(String(key), <L> = getOrPut@fun <anonymous>(): R|kotlin/String| <kind=UNKNOWN> {
^ String(value)
}
)
lval otherResult: R|kotlin/String| = R|<local>/map|.R|FakeOverride<kotlin/collections/MutableMap.getOrDefault: R|kotlin/String|>|(String(key), String(value))
lval anotherResult: R|kotlin/String?| = R|<local>/map|.R|FakeOverride<java/util/Map.replace: R|kotlin/String?|>|(String(key), String(value))
R|<local>/map|.R|FakeOverride<java/util/Map.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|ft<kotlin/String, kotlin/String?>!|, value: R|ft<kotlin/String, kotlin/String?>!|): R|kotlin/Unit| {
R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|()))
R|<local>/key|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
R|<local>/map|.R|kotlin/collections/forEach|<R|kotlin/String|, R|kotlin/String|>(<L> = forEach@fun <anonymous>(<destruct>: R|kotlin/collections/Map.Entry<kotlin/String, kotlin/String>|): R|kotlin/Unit| <kind=UNKNOWN> {
lval key: R|kotlin/String| = R|<local>/<destruct>|.R|kotlin/collections/component1|<R|kotlin/String|, R|kotlin/String|>()
lval value: R|kotlin/String| = R|<local>/<destruct>|.R|kotlin/collections/component2|<R|kotlin/String|, R|kotlin/String|>()
R|kotlin/io/println|(<strcat>(R|<local>/key|.R|kotlin/Any.toString|(), String(: ), R|<local>/value|.R|kotlin/Any.toString|()))
R|<local>/key|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
}
@@ -0,0 +1,13 @@
// FILE: JavaClass.java
public class JavaClass {
public static void foo(ArrayList list) {}
}
// FILE: test.kt
class Some
fun test(list: ArrayList<Some>) {
JavaClass.foo(list)
}
@@ -0,0 +1,10 @@
FILE: test.kt
public final class Some : R|kotlin/Any| {
public constructor(): R|Some| {
super<R|kotlin/Any|>()
}
}
public final fun test(list: R|kotlin/collections/ArrayList<Some>|): R|kotlin/Unit| {
Q|JavaClass|.R|/JavaClass.foo|(R|<local>/list|)
}
@@ -0,0 +1,19 @@
// FILE: AbstractClass.java
public abstract class AbstractClass {
public static class StaticClass {
}
}
// FILE: User.kt
class User : AbstractClass() {
fun foo() {
val sc = StaticClass()
}
}
fun test() {
AbstractClass.StaticClass()
}
@@ -0,0 +1,14 @@
FILE: User.kt
public final class User : R|AbstractClass| {
public constructor(): R|User| {
super<R|AbstractClass|>()
}
public final fun foo(): R|kotlin/Unit| {
lval sc: R|AbstractClass.StaticClass| = R|/AbstractClass.StaticClass.StaticClass|()
}
}
public final fun test(): R|kotlin/Unit| {
Q|AbstractClass|.R|/AbstractClass.StaticClass.StaticClass|()
}
@@ -0,0 +1,23 @@
/*
* See org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt:93
*/
// FILE: CommonDataKeys.java
public class CommonDataKeys {
public static final String PROJECT = "project";
public final String MEMBER = "member"
}
// FILE: PlatformDataKeys.java
public class PlatformDataKeys extends CommonDataKeys {
}
// FILE: main.kt
fun test() {
val project = PlatformDataKeys.PROJECT
val member = PlatformDataKeys().MEMBER
}
@@ -0,0 +1,5 @@
FILE: main.kt
public final fun test(): R|kotlin/Unit| {
lval project: R|ft<kotlin/String, kotlin/String?>!| = Q|PlatformDataKeys|.R|/CommonDataKeys.PROJECT|
lval member: R|ft<kotlin/String, kotlin/String?>!| = R|/PlatformDataKeys.PlatformDataKeys|().R|/CommonDataKeys.MEMBER|
}
@@ -0,0 +1,24 @@
// FILE: StaticOwner.java
// FULL_JDK
import org.jetbrains.annotations.NotNull;
public class StaticOwner {
@NotNull
public static <T> T newInstance(@NotNull Class<T> aClass) {}
}
// FILE: User.kt
interface Freezable
abstract class User<T : Freezable> {
private var settings: T = createSettings()
protected abstract fun createSettings(): T
fun foo() {
settings = StaticOwner.newInstance(settings.javaClass)
}
}
@@ -0,0 +1,19 @@
FILE: User.kt
public abstract interface Freezable : R|kotlin/Any| {
}
public abstract class User<T : R|Freezable|> : R|kotlin/Any| {
public constructor<T : R|Freezable|>(): R|User<T>| {
super<R|kotlin/Any|>()
}
private final var settings: R|T| = this@R|/User|.R|/User.createSettings|()
private get(): R|T|
private set(value: R|T|): R|kotlin/Unit|
protected abstract fun createSettings(): R|T|
public final fun foo(): R|kotlin/Unit| {
this@R|/User|.R|/User.settings| = Q|StaticOwner|.R|/StaticOwner.newInstance|<R|ft<T, T?>!|>(this@R|/User|.R|/User.settings|.R|kotlin/jvm/javaClass|<R|ft<T, T?>!|>)
}
}
@@ -0,0 +1,18 @@
// FILE: PsiElement.java
public interface PsiElement {
PsiElement[] getChildren();
}
// FILE: XmlTag.java
public interface XmlTag extends PsiElement {
String getLocalName();
}
// FILE: test.kt
fun foo(tag: XmlTag, name: String): List<XmlTag> {
val result = tag.children.filterIsInstance<XmlTag>().filter { it.localName == name }
return result
}
@@ -0,0 +1,8 @@
FILE: test.kt
public final fun foo(tag: R|XmlTag|, name: R|kotlin/String|): R|kotlin/collections/List<XmlTag>| {
lval result: R|kotlin/collections/List<XmlTag>| = R|<local>/tag|.R|/PsiElement.children|.R|kotlin/collections/filterIsInstance|<R|XmlTag|>().R|kotlin/collections/filter|<R|XmlTag|>(<L> = filter@fun <anonymous>(it: R|XmlTag|): R|kotlin/Boolean| <kind=UNKNOWN> {
^ ==(R|<local>/it|.R|/XmlTag.localName|, R|<local>/name|)
}
)
^foo R|<local>/result|
}
@@ -0,0 +1,23 @@
// FULL_JDK
// FILE: Call.java
import org.jetbrains.annotations.NotNull;
import java.util.*;
public interface Call<D> {
@NotNull
Map<String, String> getArguments();
}
// FILE: test.kt
fun <D : Any> Call<D>.testForEach() {
arguments.forEach { key, value ->
key.length
value.length
}
arguments.forEach {
it.key.length
it.value.length
}
}
@@ -0,0 +1,13 @@
FILE: test.kt
public final fun <D : R|kotlin/Any|> R|Call<D>|.testForEach(): R|kotlin/Unit| {
this@R|/testForEach|.R|/Call.arguments|.R|FakeOverride<java/util/Map.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|ft<kotlin/String, kotlin/String?>!|, value: R|ft<kotlin/String, kotlin/String?>!|): R|kotlin/Unit| {
R|<local>/key|.R|kotlin/String.length|
^ R|<local>/value|.R|kotlin/String.length|
}
)
this@R|/testForEach|.R|/Call.arguments|.R|kotlin/collections/forEach|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/String, kotlin/String?>!|>(<L> = forEach@fun <anonymous>(it: R|kotlin/collections/Map.Entry<ft<kotlin/String, kotlin/String?>!, ft<kotlin/String, kotlin/String?>!>|): R|kotlin/Unit| <kind=UNKNOWN> {
R|<local>/it|.R|FakeOverride<kotlin/collections/Map.Entry.key: R|ft<kotlin/String, kotlin/String?>!|>|.R|kotlin/String.length|
^ R|<local>/it|.R|FakeOverride<kotlin/collections/Map.Entry.value: R|ft<kotlin/String, kotlin/String?>!|>|.R|kotlin/String.length|
}
)
}
@@ -0,0 +1,4 @@
// FULL_JDK
fun foo(z: java.util.zip.ZipFile) {
z.entries().asSequence()
}
@@ -0,0 +1,4 @@
FILE: capturedFlexible.kt
public final fun foo(z: R|java/util/zip/ZipFile|): R|kotlin/Unit| {
R|<local>/z|.R|java/util/zip/ZipFile.entries|().R|kotlin/sequences/asSequence|<R|CapturedType(out ft<java/util/zip/ZipEntry, java/util/zip/ZipEntry?>!)|>()
}
@@ -0,0 +1,21 @@
// FILE: BindingContext.java
public interface BindingContext {
@org.jetbrains.annotations.Nullable
<K, V> V get(ReadOnlySlice<K, V> slice, K key);
}
// FILE: ReadOnlySlice.java
public interface ReadOnlySlice<K, V> {}
// FILE: Slices.java
public class Slices {
public static ReadOnlySlice<String, Double> X = null;
public static ReadOnlySlice<Integer, String> Y = null;
}
// FILE: main.kt
fun bar(bindingContext: BindingContext) {
bindingContext[Slices.X, bindingContext[Slices.Y, 1]]
}
@@ -0,0 +1,4 @@
FILE: main.kt
public final fun bar(bindingContext: R|BindingContext|): R|kotlin/Unit| {
R|<local>/bindingContext|.R|/BindingContext.get|<R|ft<kotlin/String, kotlin/String?>!|, R|ft<kotlin/Double, kotlin/Double?>!|>(Q|Slices|.R|/Slices.X|, R|<local>/bindingContext|.R|/BindingContext.get|<R|ft<kotlin/Int, kotlin/Int?>!|, R|ft<kotlin/String, kotlin/String?>!|>(Q|Slices|.R|/Slices.Y|, Int(1)))
}
@@ -0,0 +1,15 @@
// FILE: A.java
public class A {
public String x = "";
}
// FILE: B.java
public class B extends A {
public int x = 1;
}
// FILE: main.kt
fun main(b: B) {
b.x + 1
}
@@ -0,0 +1,4 @@
FILE: main.kt
public final fun main(b: R|B|): R|kotlin/Unit| {
R|<local>/b|.R|/B.x|.R|kotlin/Int.plus|(Int(1))
}
@@ -0,0 +1,35 @@
// FULL_JDK
// FILE: imm/Map.java
package imm;
public interface Map<K, V> {
Option<V> get(k K);
}
// FILE: imm/Set.java
package imm;
public interface Set<E> {
}
// FILE: imm/Option.java
package imm;
public interface Option<T> {
T getOrElse(T other);
}
// FILE: imm/LinkedHashSet.java
package imm;
public class LinkedHashSet<E> extends Set<E> {
public static <T> LinkedHashSet<T> empty() { return null; }
}
// FILE: main.kt
typealias ImmutableMap<K, V> = imm.Map<K, V>
typealias ImmutableSet<E> = imm.Set<E>
typealias ImmutableLinkedHashSet<E> = imm.LinkedHashSet<E>
private typealias ImmutableMultimap<K, V> = ImmutableMap<K, ImmutableSet<V>>
private fun <K, V> ImmutableMultimap<K, V>.put(key: K, value: V) {
this[key].getOrElse(ImmutableLinkedHashSet.empty<V>())
}
@@ -0,0 +1,8 @@
FILE: main.kt
public final typealias ImmutableMap<K, V> = R|imm/Map<K, V>|
public final typealias ImmutableSet<E> = R|imm/Set<E>|
public final typealias ImmutableLinkedHashSet<E> = R|imm/LinkedHashSet<E>|
private final typealias ImmutableMultimap<K, V> = R|ImmutableMap<K, ImmutableSet<V>>|
private final fun <K, V> R|ImmutableMultimap<K, V>|.put(key: R|K|, value: R|V|): R|kotlin/Unit| {
this@R|/put|.R|FakeOverride<imm/Map.get: R|ft<imm/Option<ft<ImmutableSet<V>, ImmutableSet<V>?>!>, imm/Option<ft<ImmutableSet<V>, ImmutableSet<V>?>!>?>!|>|(R|<local>/key|).R|FakeOverride<imm/Option.getOrElse: R|ft<ImmutableSet<V>, ImmutableSet<V>?>!|>|(Q|ImmutableLinkedHashSet|.R|imm/LinkedHashSet.empty|<R|V|>())
}
@@ -0,0 +1,5 @@
// FULL_JDK
fun foo(x: MutableMap<String, List<String>>) {
x.merge("", listOf("")) { a, b -> a + b }
}
@@ -0,0 +1,7 @@
FILE: mapMerge.kt
public final fun foo(x: R|kotlin/collections/MutableMap<kotlin/String, kotlin/collections/List<kotlin/String>>|): R|kotlin/Unit| {
R|<local>/x|.R|FakeOverride<java/util/Map.merge: R|kotlin/collections/List<kotlin/String>?|>|(String(), R|kotlin/collections/listOf|<R|kotlin/String|>(String()), <L> = merge@fun <anonymous>(a: R|ft<kotlin/collections/List<kotlin/String>, kotlin/collections/List<kotlin/String>?>!|, b: R|ft<kotlin/collections/List<kotlin/String>, kotlin/collections/List<kotlin/String>?>!|): R|ft<kotlin/collections/List<kotlin/String>, kotlin/collections/List<kotlin/String>?>!| {
^ R|<local>/a|.R|kotlin/collections/plus|<R|kotlin/String|>(R|<local>/b|)
}
)
}
@@ -0,0 +1,34 @@
// FILE: K1.kt
open class KotlinOuter {
inner open class KotlinInner {
fun foo() {}
}
fun bar() {}
}
// FILE: J1.java
public class J1 extends KotlinOuter {
public class J2 extends KotlinInner {
public void bazbaz() {}
}
public void baz() {}
}
// FILE: K2.kt
class K2: J1() {
fun main() {
bar()
baz()
}
inner class K3 : J2() {
fun main() {
foo()
bazbaz()
bar()
baz()
}
}
}
@@ -0,0 +1,46 @@
FILE: K1.kt
public open class KotlinOuter : R|kotlin/Any| {
public constructor(): R|KotlinOuter| {
super<R|kotlin/Any|>()
}
public open inner class KotlinInner : R|kotlin/Any| {
public constructor(): R|KotlinOuter.KotlinInner| {
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/Unit| {
}
}
public final fun bar(): R|kotlin/Unit| {
}
}
FILE: K2.kt
public final class K2 : R|J1| {
public constructor(): R|K2| {
super<R|J1|>()
}
public final fun main(): R|kotlin/Unit| {
this@R|/K2|.R|/KotlinOuter.bar|()
this@R|/K2|.R|/J1.baz|()
}
public final inner class K3 : R|J1.J2| {
public constructor(): R|K2.K3| {
super<R|J1.J2|>()
}
public final fun main(): R|kotlin/Unit| {
this@R|/K2.K3|.R|/KotlinOuter.KotlinInner.foo|()
this@R|/K2.K3|.R|/J1.J2.bazbaz|()
this@R|/K2|.R|/KotlinOuter.bar|()
this@R|/K2|.R|/J1.baz|()
}
}
}
@@ -0,0 +1,14 @@
import java.util.AbstractSet
class SmartSet<T> : AbstractSet<T>() {
override var size: Int = 0
override fun iterator(): MutableIterator<T> = TODO()
override fun add(element: T): Boolean = true
override fun clear() {}
override fun contains(element: T): Boolean = false
}
fun foo(x: Any) {
val s = SmartSet<Any>()
s.add(x)
}
@@ -0,0 +1,30 @@
FILE: smartSet.kt
public final class SmartSet<T> : R|java/util/AbstractSet<T>| {
public constructor<T>(): R|SmartSet<T>| {
super<R|java/util/AbstractSet<T>|>()
}
public final override var size: R|kotlin/Int| = Int(0)
public get(): R|kotlin/Int|
public set(value: R|kotlin/Int|): R|kotlin/Unit|
public final override fun iterator(): R|kotlin/collections/MutableIterator<T>| {
^iterator R|kotlin/TODO|()
}
public final override fun add(element: R|T|): R|kotlin/Boolean| {
^add Boolean(true)
}
public final override fun clear(): R|kotlin/Unit| {
}
public final override fun contains(element: R|T|): R|kotlin/Boolean| {
^contains Boolean(false)
}
}
public final fun foo(x: R|kotlin/Any|): R|kotlin/Unit| {
lval s: R|SmartSet<kotlin/Any>| = R|/SmartSet.SmartSet|<R|kotlin/Any|>()
R|<local>/s|.R|FakeOverride</SmartSet.add: R|kotlin/Boolean|>|(R|<local>/x|)
}
@@ -0,0 +1,19 @@
// FULL_JDK
// FILE: U.java
import org.jetbrains.annotations.NotNull;
public class U {
@NotNull
public <T> T getValue(Box<@NotNull T> box) {}
}
// FILE: Box.java
public class Box<T> {}
// FILE: useSite.kt
fun foo(holder: U, box: Box<Int>): Int {
return holder.getValue(box)
}
@@ -0,0 +1,4 @@
FILE: useSite.kt
public final fun foo(holder: R|U|, box: R|Box<kotlin/Int>|): R|kotlin/Int| {
^foo R|<local>/holder|.R|/U.getValue|<R|ft<kotlin/Int, kotlin/Int?>!|>(R|<local>/box|)
}