Refine type arguments resolution and rendering

In case of type constructors captured parameters from outer classes

 #KT-5510 Fixed
 #KT-3112 Fixed
 #KT-6325 Fixed
 #KT-408  Fixed
 #KT-6337 Fixed
This commit is contained in:
Denis Zharkov
2015-11-03 14:28:34 +03:00
parent 990bd7e71d
commit deea0643ad
72 changed files with 1450 additions and 94 deletions
@@ -0,0 +1,37 @@
// !CHECK_TYPE
// !DIAGNOSTICS: -UNUSED_EXPRESSION -UNUSED_PARAMETER
class Outer<E> {
inner class Inner {
fun foo() = this
fun baz(): Inner = this
}
fun bar() = Inner()
fun set(inner: Inner) {}
}
fun factoryString(): Outer<String>.Inner = null!!
fun <T> infer(x: T): Outer<T>.Inner = null!!
val infered = infer("")
fun main() {
val outer: Outer<out String> = Outer<String>()
checkSubtype<Outer<out String>.Inner>(outer.bar())
checkSubtype<Outer<out String>.Inner>(outer.Inner())
checkSubtype<Outer<*>.Inner>(outer.bar())
checkSubtype<Outer<*>.Inner>(outer.Inner())
checkSubtype<Outer<out CharSequence>.Inner>(outer.bar())
checkSubtype<Outer<out CharSequence>.Inner>(outer.Inner())
// Should not actually work as in Java (captured constructor type mismatch)
outer.set(outer.bar())
outer.set(outer.Inner())
val x: Outer<String>.Inner = factoryString()
outer.set(x)
}