KT-6081 Chained generic method calls: wrong type inference

#KT-6081 Fixed
This commit is contained in:
Svetlana Isakova
2014-11-24 18:10:23 +03:00
parent 9c880de735
commit 724f2e6e7b
12 changed files with 295 additions and 17 deletions
@@ -0,0 +1,14 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
//KT-6081 Chained generic method calls: wrong type inference
class Bar<T>
fun bar<T>(): Bar<T> = null!!
class Foo {
fun <R> add(bar: Bar<R>): Foo {return this}
}
fun doesNotWork(bi: Bar<Int>, bs: Bar<String>) {
Foo().add(bi).add(bs)
}
@@ -0,0 +1,19 @@
package
internal fun </*0*/ T> bar(): Bar<T>
internal fun doesNotWork(/*0*/ bi: Bar<kotlin.Int>, /*1*/ bs: Bar<kotlin.String>): kotlin.Unit
internal final class Bar</*0*/ T> {
public constructor Bar</*0*/ T>()
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
}
internal final class Foo {
public constructor Foo()
internal final fun </*0*/ R> add(/*0*/ bar: Bar<R>): Foo
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
}
@@ -0,0 +1,10 @@
class A<T> {
fun useT(t: T) = t
fun <U> newA(): A<U> = A()
}
fun test1() {
A<Int>().newA<String>().useT("")
A<Int>().newA<String>().useT(<!CONSTANT_EXPECTED_TYPE_MISMATCH!>1<!>)
}
@@ -0,0 +1,12 @@
package
internal fun test1(): kotlin.Unit
internal final class A</*0*/ T> {
public constructor A</*0*/ T>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
internal final fun </*0*/ U> newA(): A<U>
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
internal final fun useT(/*0*/ t: T): T
}
@@ -0,0 +1,25 @@
class Test {
private fun <T : Any> T.self() = object {
fun bar(): T {
return this@self
}
}
fun test() {
1.self().bar() + 1
}
}
class Foo<R> {
private fun <T> bar() = object {
fun baz(): Foo<R> {
return this@Foo
}
}
fun getR(r: R) = r
fun test() {
Foo<Int>().bar<String>().baz().getR(1)
Foo<Int>().bar<String>().baz().getR(<!TYPE_MISMATCH!>""<!>)
}
}
@@ -0,0 +1,20 @@
package
internal final class Foo</*0*/ R> {
public constructor Foo</*0*/ R>()
private final fun </*0*/ T> bar(): Foo.bar.<no name provided>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
internal final fun getR(/*0*/ r: R): R
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
internal final fun test(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal final class Test {
public constructor Test()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
internal final fun test(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
private final fun </*0*/ T : kotlin.Any> T.self(): Test.self.<no name provided>
}
@@ -0,0 +1,22 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER
class Outer<T> {
inner class Inner<I> {
fun getOuter(): Outer<T> = this@Outer
fun <R> genericFun(r: R): Outer<T> = this@Outer
}
fun useOuterParam(t: T) {}
}
fun test1() {
Outer<Int>().Inner<String>().getOuter().useOuterParam(22)
Outer<Int>().Inner<String>().getOuter().useOuterParam(<!TYPE_MISMATCH!>""<!>)
}
class A
class B
fun test1(a: A, b: B) {
Outer<Int>().Inner<String>().genericFun(a).Inner<Double>().genericFun(b)
}
@@ -0,0 +1,35 @@
package
internal fun test1(): kotlin.Unit
internal fun test1(/*0*/ a: A, /*1*/ b: B): kotlin.Unit
internal 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 open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
internal final class B {
public constructor B()
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
}
internal final class Outer</*0*/ T> {
public constructor Outer</*0*/ T>()
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
internal final fun useOuterParam(/*0*/ t: T): kotlin.Unit
internal final inner class Inner</*0*/ I> {
public constructor Inner</*0*/ I>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
internal final fun </*0*/ R> genericFun(/*0*/ r: R): Outer<T>
internal final fun getOuter(): Outer<T>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}