From 969beb78983dc18f867cf1eab18b154f2e121e5a Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Mon, 25 Aug 2014 20:03:25 +0400 Subject: [PATCH] Account for substitutions of one variable for another (it must remain a variable) --- .../tests/platformTypes/methodCall/visitor.kt | 23 +++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++ .../java/lazy/types/LazyJavaTypeResolver.kt | 33 ++++++++++--------- 3 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/platformTypes/methodCall/visitor.kt diff --git a/compiler/testData/diagnostics/tests/platformTypes/methodCall/visitor.kt b/compiler/testData/diagnostics/tests/platformTypes/methodCall/visitor.kt new file mode 100644 index 00000000000..df5b1936f2a --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/methodCall/visitor.kt @@ -0,0 +1,23 @@ +// FILE: p/Visitor.java + +package p; + +public interface Visitor { + +} + +// FILE: p/Element.java + +package p; + +public class Element { + public R accept(@NotNull Visitor visitor, D data) {return null;} +} + +// FILE: k.kt + +import p.* + +fun test(v: Visitor, e: Element) { + e.accept(v, null) +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 3ab126f7672..7032c30df18 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -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"); + } + } } diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt index b8bfcb26777..7781fd2e157 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/types/LazyJavaTypeResolver.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 * lowerBound = MutableList @@ -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 {