Added captured types and approximation
CapturedType captures type projection while solving the constraint system. During the substitution type containing captured types is approximated to get rid of captured types and (for simple cases) replace them with corresponding type projections. Note that Array<Array< CapturedType(out Int) >> is (over)approximated by Array<out<Array<out Int>> See 'Mixed-site variance' by Ross Tate for details. #KT-2570 Fixed #KT-2872 Fixed #KT-3213 Fixed
This commit is contained in:
+1
-1
@@ -47,7 +47,7 @@ public class ConstraintsUtil {
|
||||
|
||||
Collection<JetType> conflictingTypes = constraintSystem.getTypeBounds(firstConflictingParameter).getValues();
|
||||
|
||||
ArrayList<Map<TypeConstructor, TypeProjection>> substitutionContexts = Lists.newArrayList();
|
||||
List<Map<TypeConstructor, TypeProjection>> substitutionContexts = Lists.newArrayList();
|
||||
for (JetType type : conflictingTypes) {
|
||||
Map<TypeConstructor, TypeProjection> context = Maps.newLinkedHashMap();
|
||||
context.put(firstConflictingParameter.getTypeConstructor(), new TypeProjectionImpl(type));
|
||||
|
||||
+3
@@ -226,6 +226,9 @@ public abstract class AbstractTracingStrategy implements TracingStrategy {
|
||||
assert !noExpectedType(data.expectedType) : "Expected type doesn't exist, but there is an expected type mismatch error";
|
||||
trace.report(TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH.on(reference, data.expectedType, substitutedReturnType));
|
||||
}
|
||||
//else if (status.hasConflictWithCapturedType()) {
|
||||
// trace.report(TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS.on(reference, data));
|
||||
//}
|
||||
else if (status.hasViolatedUpperBound()) {
|
||||
trace.report(TYPE_INFERENCE_UPPER_BOUND_VIOLATED.on(reference, data));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
class Contr<in T>
|
||||
|
||||
fun foo<T>(a: Contr<T>) {}
|
||||
|
||||
// T captures 'in Int'
|
||||
// lower: Contr<Any?>
|
||||
// upper: Contr<Int>
|
||||
|
||||
// T captures 'out Int'
|
||||
// lower: Contr<Int>
|
||||
// upper: Contr<out Any?>
|
||||
@@ -0,0 +1,11 @@
|
||||
class Cov<out T>
|
||||
|
||||
fun foo<T>(a: Cov<T>) {}
|
||||
|
||||
// T captures 'in Int'
|
||||
// lower: Cov<Int>
|
||||
// upper: Cov<Any?>
|
||||
|
||||
// T captures 'out Int'
|
||||
// lower: Cov<Nothing>
|
||||
// upper: Cov<Int>
|
||||
@@ -0,0 +1,11 @@
|
||||
class Inv<T>
|
||||
|
||||
fun foo<T>(a: Inv<T>) {}
|
||||
|
||||
// T captures 'in Int'
|
||||
// lower: Nothing
|
||||
// upper: Inv<in Int>
|
||||
|
||||
// T captures 'out Int'
|
||||
// lower: Nothing
|
||||
// upper: Inv<out Int>
|
||||
@@ -0,0 +1,12 @@
|
||||
class Cov<out T>
|
||||
class Inv<T>
|
||||
|
||||
fun foo<T>(a: Cov<Inv<T>>) {}
|
||||
|
||||
// T captures 'in Int'
|
||||
// lower: Cov<Nothing>
|
||||
// upper: Cov<Inv<in Int>>
|
||||
|
||||
// T captures 'out Int'
|
||||
// lower: Cov<Nothing>
|
||||
// upper: Cov<Inv<out Int>>
|
||||
@@ -0,0 +1,11 @@
|
||||
class Inv<T>
|
||||
|
||||
fun foo<T>(a: Inv<Inv<T>>) {}
|
||||
|
||||
// T captures 'in Int'
|
||||
// lower: Nothing
|
||||
// upper: Inv<out Inv<in Int>>
|
||||
|
||||
// T captures 'out Int'
|
||||
// lower: Nothing
|
||||
// upper: Inv<out Inv<out Int>>
|
||||
@@ -0,0 +1,11 @@
|
||||
class Inv<T>
|
||||
|
||||
fun foo<T>(a: Inv<Inv<Inv<T>>>) {}
|
||||
|
||||
// T captures 'in Int'
|
||||
// lower: Nothing
|
||||
// upper: Inv<out Inv<out Inv<in Int>>>
|
||||
|
||||
// T captures 'out Int'
|
||||
// lower: Nothing
|
||||
// upper: Inv<out Inv<out Inv<out Int>>>
|
||||
@@ -0,0 +1,11 @@
|
||||
class Inv<T>
|
||||
|
||||
fun foo<T>(a: Inv<in T>) {}
|
||||
|
||||
// T captures 'in Int'
|
||||
// lower: Inv<Any?>
|
||||
// upper: Inv<in Int>
|
||||
|
||||
// T captures 'out Int'
|
||||
// lower: Inv<in Int>
|
||||
// upper: Inv<out Any?>
|
||||
@@ -0,0 +1,11 @@
|
||||
class Inv<T>
|
||||
|
||||
fun foo<T>(a: Inv<out T>) {}
|
||||
|
||||
// T captures 'in Int'
|
||||
// lower: Inv<out Int>
|
||||
// upper: Inv<out Any?>
|
||||
|
||||
// T captures 'out Int'
|
||||
// lower: Inv<Nothing>
|
||||
// upper: Inv<out Int>
|
||||
@@ -14280,15 +14280,15 @@ package java {
|
||||
|
||||
private final inner class EntryIterator : java.util.HashMap.HashIterator<kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!> {
|
||||
private constructor EntryIterator()
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var index: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -14342,15 +14342,15 @@ package java {
|
||||
|
||||
private final inner class KeyIterator : java.util.HashMap.HashIterator<K!> {
|
||||
private constructor KeyIterator()
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var index: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -14377,15 +14377,15 @@ package java {
|
||||
|
||||
private final inner class ValueIterator : java.util.HashMap.HashIterator<V!> {
|
||||
private constructor ValueIterator()
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var index: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): V!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -15376,14 +15376,14 @@ package java {
|
||||
public/*package*/ final inner class DescendingKeyIterator : java.util.TreeMap.PrivateEntryIterator<K!> {
|
||||
public/*package*/ constructor DescendingKeyIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -15510,14 +15510,14 @@ package java {
|
||||
public/*package*/ final inner class EntryIterator : java.util.TreeMap.PrivateEntryIterator<kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!> {
|
||||
public/*package*/ constructor EntryIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -15545,14 +15545,14 @@ package java {
|
||||
public/*package*/ final inner class KeyIterator : java.util.TreeMap.PrivateEntryIterator<K!> {
|
||||
public/*package*/ constructor KeyIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -15670,14 +15670,14 @@ package java {
|
||||
public/*package*/ constructor DescendingSubMapEntryIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!, /*1*/ p1: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ val fenceKey: kotlin.Any!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ fun remove(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeAscending(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeDescending(): kotlin.Unit
|
||||
@@ -15688,14 +15688,14 @@ package java {
|
||||
public/*package*/ constructor DescendingSubMapKeyIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!, /*1*/ p1: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ val fenceKey: kotlin.Any!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ fun remove(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeAscending(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeDescending(): kotlin.Unit
|
||||
@@ -15728,14 +15728,14 @@ package java {
|
||||
public/*package*/ constructor SubMapEntryIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!, /*1*/ p1: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ val fenceKey: kotlin.Any!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ fun remove(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeAscending(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeDescending(): kotlin.Unit
|
||||
@@ -15764,14 +15764,14 @@ package java {
|
||||
public/*package*/ constructor SubMapKeyIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!, /*1*/ p1: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ val fenceKey: kotlin.Any!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ fun remove(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeAscending(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeDescending(): kotlin.Unit
|
||||
@@ -15833,14 +15833,14 @@ package java {
|
||||
public/*package*/ final inner class ValueIterator : java.util.TreeMap.PrivateEntryIterator<V!> {
|
||||
public/*package*/ constructor ValueIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): V!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
// !CHECK_TYPE
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
// FILE: A.java
|
||||
public class A {
|
||||
public static <T> Class<T> foo(Class<T> clazz) {
|
||||
return clazz;
|
||||
}
|
||||
|
||||
public static <T> Class<Class<T>> bar(Class<T> clazz) {
|
||||
throw new Exception();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: b.kt
|
||||
fun test1(clazz: Class<out Int>) {
|
||||
val foo0: Class<out Int> = A.foo(clazz)
|
||||
val foo1 = A.foo(clazz)
|
||||
foo1 checkType { it: _< Class<out Int> > }
|
||||
// should be ok
|
||||
foo1 checkType { <!TYPE_MISMATCH!>it<!>: _< Class<out Int?> > }
|
||||
}
|
||||
|
||||
fun tes2t(clazz: Class<in Int>) {
|
||||
val foo0: Class<out Class<in Int>> = A.bar(clazz)
|
||||
val foo1 = A.bar(clazz)
|
||||
foo1 checkType { it: _< Class<out Class<in Int>> > }
|
||||
// should be ok
|
||||
foo1 checkType { <!TYPE_MISMATCH!>it<!>: _< Class<out Class<in Int?>> > }
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package
|
||||
|
||||
internal fun tes2t(/*0*/ clazz: java.lang.Class<in kotlin.Int>): kotlin.Unit
|
||||
internal fun test1(/*0*/ clazz: java.lang.Class<out kotlin.Int>): kotlin.Unit
|
||||
|
||||
public open 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
|
||||
|
||||
// Static members
|
||||
public open fun </*0*/ T> bar(/*0*/ clazz: java.lang.Class<T!>!): java.lang.Class<java.lang.Class<T!>!>!
|
||||
public open fun </*0*/ T> foo(/*0*/ clazz: java.lang.Class<T!>!): java.lang.Class<T!>!
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// !CHECK_TYPE
|
||||
|
||||
fun <T> foo(array: Array<T>): Array<T> = array
|
||||
|
||||
fun test1(a1: Array<out Int>) {
|
||||
val b1: Array<out Int> = foo(a1)
|
||||
val c1 = foo(a1)
|
||||
c1 checkType { it : _<Array<out Int>> }
|
||||
}
|
||||
|
||||
fun test2(a2: Array<in Int>) {
|
||||
val b2: Array<in Int> = foo(a2)
|
||||
val c2 = foo(a2)
|
||||
c2 checkType { it : _<Array<in Int>> }
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package
|
||||
|
||||
internal fun </*0*/ T> foo(/*0*/ array: kotlin.Array<T>): kotlin.Array<T>
|
||||
internal fun test1(/*0*/ a1: kotlin.Array<out kotlin.Int>): kotlin.Unit
|
||||
internal fun test2(/*0*/ a2: kotlin.Array<in kotlin.Int>): kotlin.Unit
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
// !CHECK_TYPE
|
||||
|
||||
fun <T> foo(a: Array<T>): Array<Array<T>> = throw Exception()
|
||||
|
||||
fun test1(a1: Array<out Int>) {
|
||||
val b1: Array<out Array<out Int>> = foo(a1)
|
||||
val c1 = foo(a1)
|
||||
c1 checkType { it : _<Array<out Array<out Int>>> }
|
||||
}
|
||||
|
||||
fun test2(a2: Array<in Int>) {
|
||||
val b2: Array<out Array<in Int>> = foo(a2)
|
||||
val c2 = foo(a2)
|
||||
c2 checkType { it : _<Array<out Array<in Int>>> }
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package
|
||||
|
||||
internal fun </*0*/ T> foo(/*0*/ a: kotlin.Array<T>): kotlin.Array<kotlin.Array<T>>
|
||||
internal fun test1(/*0*/ a1: kotlin.Array<out kotlin.Int>): kotlin.Unit
|
||||
internal fun test2(/*0*/ a2: kotlin.Array<in kotlin.Int>): kotlin.Unit
|
||||
@@ -0,0 +1,9 @@
|
||||
// !CHECK_TYPE
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE
|
||||
|
||||
fun <T> foo(l: MutableList<T>): MutableList<T> = l
|
||||
fun test(l: MutableList<out Int>) {
|
||||
val a: MutableList<out Int> = foo(l)
|
||||
val b = foo(l)
|
||||
b checkType { it: _< MutableList<out Int> > }
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package
|
||||
|
||||
internal fun </*0*/ T> foo(/*0*/ l: kotlin.MutableList<T>): kotlin.MutableList<T>
|
||||
internal fun test(/*0*/ l: kotlin.MutableList<out kotlin.Int>): kotlin.Unit
|
||||
@@ -0,0 +1,6 @@
|
||||
fun <T> Array<T>.foo() {}
|
||||
|
||||
fun test(array: Array<out Int>) {
|
||||
array.foo()
|
||||
<!TYPE_MISMATCH!>array<!>.foo<<!PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT!>out<!> Int>()
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
package
|
||||
|
||||
internal fun test(/*0*/ array: kotlin.Array<out kotlin.Int>): kotlin.Unit
|
||||
internal fun </*0*/ T> kotlin.Array<T>.foo(): kotlin.Unit
|
||||
@@ -14286,15 +14286,15 @@ package java {
|
||||
|
||||
private final inner class EntryIterator : java.util.HashMap.HashIterator<kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!> {
|
||||
private constructor EntryIterator()
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var index: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -14348,15 +14348,15 @@ package java {
|
||||
|
||||
private final inner class KeyIterator : java.util.HashMap.HashIterator<K!> {
|
||||
private constructor KeyIterator()
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var index: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -14383,15 +14383,15 @@ package java {
|
||||
|
||||
private final inner class ValueIterator : java.util.HashMap.HashIterator<V!> {
|
||||
private constructor ValueIterator()
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var current: java.util.HashMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var index: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): V!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.HashMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -15382,14 +15382,14 @@ package java {
|
||||
public/*package*/ final inner class DescendingKeyIterator : java.util.TreeMap.PrivateEntryIterator<K!> {
|
||||
public/*package*/ constructor DescendingKeyIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -15516,14 +15516,14 @@ package java {
|
||||
public/*package*/ final inner class EntryIterator : java.util.TreeMap.PrivateEntryIterator<kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!> {
|
||||
public/*package*/ constructor EntryIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -15551,14 +15551,14 @@ package java {
|
||||
public/*package*/ final inner class KeyIterator : java.util.TreeMap.PrivateEntryIterator<K!> {
|
||||
public/*package*/ constructor KeyIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -15676,14 +15676,14 @@ package java {
|
||||
public/*package*/ constructor DescendingSubMapEntryIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!, /*1*/ p1: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ val fenceKey: kotlin.Any!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ fun remove(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeAscending(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeDescending(): kotlin.Unit
|
||||
@@ -15694,14 +15694,14 @@ package java {
|
||||
public/*package*/ constructor DescendingSubMapKeyIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!, /*1*/ p1: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ val fenceKey: kotlin.Any!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ fun remove(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeAscending(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeDescending(): kotlin.Unit
|
||||
@@ -15734,14 +15734,14 @@ package java {
|
||||
public/*package*/ constructor SubMapEntryIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!, /*1*/ p1: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ val fenceKey: kotlin.Any!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): kotlin.(Mutable)Map.(Mutable)Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ fun remove(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeAscending(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeDescending(): kotlin.Unit
|
||||
@@ -15770,14 +15770,14 @@ package java {
|
||||
public/*package*/ constructor SubMapKeyIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!, /*1*/ p1: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ val fenceKey: kotlin.Any!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): K!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ fun remove(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeAscending(): kotlin.Unit
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun removeDescending(): kotlin.Unit
|
||||
@@ -15839,14 +15839,14 @@ package java {
|
||||
public/*package*/ final inner class ValueIterator : java.util.TreeMap.PrivateEntryIterator<V!> {
|
||||
public/*package*/ constructor ValueIterator(/*0*/ p0: java.util.TreeMap.Entry<K!, V!>!)
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var expectedModCount: kotlin.Int
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var lastReturned: java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ var next: java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun hasNext(): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ fun next(): V!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K, V>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun nextEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public/*package*/ final override /*1*/ /*fake_override*/ fun prevEntry(): java.util.TreeMap.Entry<K!, V!>!
|
||||
public open override /*1*/ /*fake_override*/ fun remove(): kotlin.Unit
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
@@ -4899,7 +4899,7 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
||||
|
||||
@TestMetadata("compiler/testData/diagnostics/tests/inference")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@InnerTestClasses({Inference.Constraints.class, Inference.NestedCalls.class, Inference.Regressions.class, Inference.ReportingImprovements.class, Inference.Substitutions.class, Inference.UpperBounds.class, Inference.Varargs.class})
|
||||
@InnerTestClasses({Inference.CapturedTypes.class, Inference.Constraints.class, Inference.NestedCalls.class, Inference.Regressions.class, Inference.ReportingImprovements.class, Inference.Substitutions.class, Inference.UpperBounds.class, Inference.Varargs.class})
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class Inference extends AbstractJetDiagnosticsTest {
|
||||
public void testAllFilesPresentInInference() throws Exception {
|
||||
@@ -5086,6 +5086,45 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public static class CapturedTypes extends AbstractJetDiagnosticsTest {
|
||||
public void testAllFilesPresentInCapturedTypes() throws Exception {
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/diagnostics/tests/inference/capturedTypes"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("captureForPlatformTypes.kt")
|
||||
public void testCaptureForPlatformTypes() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes/captureForPlatformTypes.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("capturedType.kt")
|
||||
public void testCapturedType() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes/capturedType.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("capturedTypeAndApproximation.kt")
|
||||
public void testCapturedTypeAndApproximation() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes/capturedTypeAndApproximation.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt2570.kt")
|
||||
public void testKt2570() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes/kt2570.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("kt2872.kt")
|
||||
public void testKt2872() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
}
|
||||
|
||||
@TestMetadata("compiler/testData/diagnostics/tests/inference/constraints")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright 2010-2014 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.jet.resolve.typeApproximation
|
||||
|
||||
import org.jetbrains.jet.JetLiteFixture
|
||||
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment
|
||||
import org.jetbrains.jet.ConfigurationKind
|
||||
import java.io.File
|
||||
import org.jetbrains.jet.lang.resolve.lazy.JvmResolveUtil
|
||||
import org.jetbrains.jet.lang.resolve.BindingContext
|
||||
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.jet.lang.types.TypeSubstitutor
|
||||
import org.jetbrains.jet.lang.types.TypeProjectionImpl
|
||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
|
||||
import org.jetbrains.jet.lang.types.Variance
|
||||
import org.jetbrains.jet.lang.types.typesApproximation.approximateCapturedTypes
|
||||
import org.jetbrains.jet.JetTestUtils
|
||||
import org.jetbrains.jet.lang.psi.JetPsiFactory
|
||||
import org.jetbrains.jet.lang.resolve.calls.inference.CapturedTypeConstructor
|
||||
import org.jetbrains.jet.lang.types.JetTypeImpl
|
||||
import org.jetbrains.jet.lang.resolve.calls.inference.createCapturedType
|
||||
|
||||
abstract public class AbstractCapturedTypeApproximationTest() : JetLiteFixture() {
|
||||
override fun createEnvironment(): JetCoreEnvironment = createEnvironmentWithMockJdk(ConfigurationKind.ALL)
|
||||
|
||||
public fun doTest(filePath: String) {
|
||||
val file = File(filePath)
|
||||
val text = JetTestUtils.doLoadFile(file)!!
|
||||
|
||||
val jetFile = JetPsiFactory(getProject()).createFile(text)
|
||||
val bindingContext = JvmResolveUtil.analyzeOneFileWithJavaIntegration(jetFile).bindingContext
|
||||
|
||||
val functions = bindingContext.getSliceContents(BindingContext.FUNCTION)
|
||||
val functionFoo = functions.values().firstOrNull { it.getName().asString() == "foo" } ?:
|
||||
throw AssertionError("Function 'foo' is not declared")
|
||||
val typeParameter = functionFoo.getTypeParameters().first()
|
||||
val parameter = functionFoo.getValueParameters().first().getType()
|
||||
|
||||
val result = StringBuilder {
|
||||
val endIndex = text.indexOf("// T captures")
|
||||
appendln(if (endIndex == -1) text else text.substring(0, endIndex).trimTrailing())
|
||||
|
||||
for (variance in listOf(Variance.IN_VARIANCE, Variance.OUT_VARIANCE)) {
|
||||
|
||||
val captured = createCapturedType(TypeProjectionImpl(variance, KotlinBuiltIns.getInstance().getIntType()))
|
||||
val typeSubstitutor = TypeSubstitutor.create(mapOf(typeParameter.getTypeConstructor() to TypeProjectionImpl(captured)))
|
||||
val typeWithCapturedType = typeSubstitutor.substituteWithoutApproximation(
|
||||
TypeProjectionImpl(Variance.INVARIANT, parameter))!!.getType()
|
||||
|
||||
val (lower, upper) = approximateCapturedTypes(typeWithCapturedType)
|
||||
|
||||
appendln()
|
||||
appendln("// T captures '${(captured.getConstructor() as CapturedTypeConstructor).typeProjection}'")
|
||||
appendln("// lower: $lower")
|
||||
appendln("// upper: $upper")
|
||||
}
|
||||
}.toString()
|
||||
|
||||
JetTestUtils.assertEqualsToFile(file, result)
|
||||
}
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Copyright 2010-2014 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.jetbrains.jet.resolve.typeApproximation;
|
||||
|
||||
import com.intellij.testFramework.TestDataPath;
|
||||
import org.jetbrains.jet.JUnit3RunnerWithInners;
|
||||
import org.jetbrains.jet.JetTestUtils;
|
||||
import org.jetbrains.jet.test.InnerTestClasses;
|
||||
import org.jetbrains.jet.test.TestMetadata;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/** This class is generated by {@link org.jetbrains.jet.generators.tests.TestsPackage}. DO NOT MODIFY MANUALLY */
|
||||
@SuppressWarnings("all")
|
||||
@TestMetadata("compiler/testData/capturedTypeApproximation")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
@RunWith(JUnit3RunnerWithInners.class)
|
||||
public class CapturedTypeApproximationTestGenerated extends AbstractCapturedTypeApproximationTest {
|
||||
public void testAllFilesPresentInCapturedTypeApproximation() throws Exception {
|
||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/capturedTypeApproximation"), Pattern.compile("^(.+)\\.kt$"), true);
|
||||
}
|
||||
|
||||
@TestMetadata("contravariant.kt")
|
||||
public void testContravariant() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/contravariant.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("covariant.kt")
|
||||
public void testCovariant() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/covariant.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("invariant.kt")
|
||||
public void testInvariant() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/invariant.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("nestedCov.kt")
|
||||
public void testNestedCov() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nestedCov.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("nestedInv.kt")
|
||||
public void testNestedInv() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nestedInv.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("nestedInvLevel2.kt")
|
||||
public void testNestedInvLevel2() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/nestedInvLevel2.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("useSiteVarianceIn.kt")
|
||||
public void testUseSiteVarianceIn() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/useSiteVarianceIn.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("useSiteVarianceOut.kt")
|
||||
public void testUseSiteVarianceOut() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/capturedTypeApproximation/useSiteVarianceOut.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
}
|
||||
@@ -235,7 +235,7 @@ public class TypeSubstitutorTest extends KotlinTestWithEnvironment {
|
||||
|
||||
public void testOutInProjection() throws Exception {
|
||||
doTest(
|
||||
"C<out Any>",
|
||||
"C<out Any?>",
|
||||
"C<out T>",
|
||||
map("T", "in String")
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user