Refine member scope for types with projections

Instead of erasing descriptors with conflicting substitution,
use invariant CapturedType(<projection>) as replacement for type parameter
within default member scope.

After substitution leave such types 'as is' everywhere except return types,
use common approximation for them.

 #KT-9294 In Progress
 #KT-5411 Fixed
 #KT-8647 Fixed

 #KT-9462 Fixed
 #KT-9893 Fixed
 #KT-7581 Fixed
 #KT-7296 In Progress
This commit is contained in:
Denis Zharkov
2015-12-22 14:02:55 +03:00
parent 365ff593f3
commit e2c02f825f
50 changed files with 655 additions and 60 deletions
+7 -7
View File
@@ -18,13 +18,13 @@ class Inv<T>() {
fun testInOut() {
In<String>().`In.f:T->Unit`f("1");
(return as In<in String>).`In.f:T->Unit`f("1");
(return as In<out String>).`In.f:Int->Int`f("1")
(return as In<*>).`In.f:Int->Int`f("1");
(return as In<out String>).`In.f:T->Unit`f("1")
(return as In<*>).`In.f:T->Unit`f("1");
In<String>().`In.f:Int->Int`f(1);
(return as In<in String>).`In.f:Int->Int`f(1);
(return as In<out String>).`In.f:Int->Int`f(1)
(return as In<out String>).`!`f1(1)
(return as In<out String>).`In.f1`f1(1)
(return as In<*>).`In.f:Int->Int`f(1);
Out<Int>().`Out.f(a)`f(1)
@@ -39,13 +39,13 @@ fun testInOut() {
Inv<Int>().`Inv.f`f(1)
(return as Inv<in Int>).`Inv.f`f(1)
(return as Inv<out Int>).`!`f(1)
(return as Inv<*>).`!`f(1)
(return as Inv<out Int>).`Inv.f`f(1)
(return as Inv<*>).`Inv.f`f(1)
Inv<Int>().`Inv.inf`inf(1)
(return as Inv<in Int>).`Inv.inf`inf(1)
(return as Inv<out Int>).`!`inf(1)
(return as Inv<*>).`!`inf(1)
(return as Inv<out Int>).`Inv.inf`inf(1)
(return as Inv<*>).`Inv.inf`inf(1)
Inv<Int>().`Inv.outf`outf()
((return as Inv<in Int>).`Inv.outf`outf())`:kotlin::Any`