Account for substitutions of one variable for another (it must remain a variable)

This commit is contained in:
Andrey Breslav
2014-08-25 20:03:25 +04:00
parent bdbd469aad
commit 969beb7898
3 changed files with 46 additions and 15 deletions
@@ -0,0 +1,23 @@
// FILE: p/Visitor.java
package p;
public interface Visitor<D> {
}
// FILE: p/Element.java
package p;
public class Element {
public <D> R accept(@NotNull Visitor<D> visitor, D data) {return null;}
}
// FILE: k.kt
import p.*
fun test(v: Visitor<Nothing>, e: Element) {
e.accept(v, null)
}
@@ -7811,6 +7811,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("visitor.kt")
public void testVisitor() throws Exception {
doTest("compiler/testData/diagnostics/tests/platformTypes/methodCall/visitor.kt");
}
}
}
@@ -264,6 +264,22 @@ class LazyJavaTypeResolver(
override fun isNullable(): Boolean = _nullable()
}
private open class FlexibleJavaClassifierType(
lowerBound: JetType,
upperBound: JetType
) : DelegatingFlexibleType(lowerBound, upperBound), CustomTypeVariable {
override val isTypeVariable: Boolean = lowerBound.getConstructor() == upperBound.getConstructor()
&& lowerBound.getConstructor().getDeclarationDescriptor() is TypeParameterDescriptor
override val typeParameterDescriptor: TypeParameterDescriptor? = if (isTypeVariable) lowerBound.getConstructor().getDeclarationDescriptor() as TypeParameterDescriptor else null
override fun substitutionResult(replacement: JetType): JetType {
return if (replacement.isFlexible()) replacement
else FlexibleJavaClassifierType(TypeUtils.makeNotNullable(replacement), TypeUtils.makeNullable(replacement))
}
}
/*
* For a java type like java.util.List<Foo>
* lowerBound = MutableList<Foo>
@@ -272,23 +288,10 @@ class LazyJavaTypeResolver(
private inner class LazyFlexibleJavaClassifierType(
javaType: JavaClassifierType,
attr: JavaTypeAttributes
) : DelegatingFlexibleType(
) : FlexibleJavaClassifierType(
LazyJavaClassifierType(javaType, attr.toFlexible(FLEXIBLE_LOWER_BOUND)),
LazyJavaClassifierType(javaType, attr.toFlexible(FLEXIBLE_UPPER_BOUND))
), CustomTypeVariable {
override val isTypeVariable: Boolean = lowerBound.getConstructor() == upperBound.getConstructor()
&& lowerBound.getConstructor().getDeclarationDescriptor() is TypeParameterDescriptor
override val typeParameterDescriptor: TypeParameterDescriptor? = if (isTypeVariable) lowerBound.getConstructor().getDeclarationDescriptor() as TypeParameterDescriptor else null
override fun substitutionResult(replacement: JetType): JetType {
return if (replacement.isFlexible()) replacement
else DelegatingFlexibleType(TypeUtils.makeNotNullable(replacement), TypeUtils.makeNullable(replacement))
}
}
private class JavaTypeVariable()
)
}
trait JavaTypeAttributes {