From 6375ea89a02743a8360865c0a7b263eefee087e5 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 27 Nov 2012 18:11:32 +0400 Subject: [PATCH] Supported propagation of upper bounds of method type parameters. #KT-2776 in progress --- .../SignaturesPropagationData.java | 60 ++++++++++++++++++- .../java/resolver/JavaFunctionResolver.java | 3 +- .../typeParameter/InheritMutability.java | 19 ++++++ .../typeParameter/InheritMutability.kt | 12 ++++ .../typeParameter/InheritMutability.txt | 10 ++++ .../typeParameter/InheritNullability.java | 16 +++++ .../typeParameter/InheritNullability.kt | 12 ++++ .../typeParameter/InheritNullability.txt | 10 ++++ .../typeParameter/InheritReadOnliness.java | 18 ++++++ .../typeParameter/InheritReadOnliness.kt | 12 ++++ .../typeParameter/InheritReadOnliness.txt | 10 ++++ .../propagation/typeParameter/TwoBounds.java | 18 ++++++ .../propagation/typeParameter/TwoBounds.kt | 12 ++++ .../propagation/typeParameter/TwoBounds.txt | 10 ++++ .../typeParameter/TwoSuperclasses.java | 21 +++++++ .../typeParameter/TwoSuperclasses.kt | 16 +++++ .../typeParameter/TwoSuperclasses.txt | 13 ++++ .../typeParameter/TwoTypeParameters.java | 16 +++++ .../typeParameter/TwoTypeParameters.kt | 12 ++++ .../typeParameter/TwoTypeParameters.txt | 10 ++++ .../UseParameterAsUpperBound.java | 17 ++++++ .../typeParameter/UseParameterAsUpperBound.kt | 12 ++++ .../UseParameterAsUpperBound.txt | 10 ++++ .../UseParameterInUpperBound.java | 17 ++++++ .../typeParameter/UseParameterInUpperBound.kt | 12 ++++ .../UseParameterInUpperBound.txt | 10 ++++ .../jvm/compiler/LoadJavaTestGenerated.java | 51 +++++++++++++++- ...esolveNamespaceComparingTestGenerated.java | 51 +++++++++++++++- 28 files changed, 486 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.java create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.kt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.txt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.java create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.kt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.txt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.java create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.kt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.txt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.java create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.kt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.txt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.java create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.kt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.txt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.java create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.kt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.txt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.java create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.kt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.txt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.java create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.kt create mode 100644 compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.txt diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java index 01460c8449c..e941b94f3bf 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java @@ -39,24 +39,34 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.*; public class SignaturesPropagationData { + private final List modifiedTypeParameters; private final JavaDescriptorResolver.ValueParameterDescriptors modifiedValueParameters; private final JetType modifiedReturnType; private final List signatureErrors = Lists.newArrayList(); private final List superFunctions; + private final Map autoTypeParameterToModified; public SignaturesPropagationData( @NotNull JetType autoReturnType, // type built by JavaTypeTransformer from Java signature and @NotNull annotations @NotNull JavaDescriptorResolver.ValueParameterDescriptors autoValueParameters, // descriptors built by parameters resolver + @NotNull List autoTypeParameters, // descriptors built by signature resolver @NotNull PsiMethodWrapper method, @NotNull BindingTrace trace ) { superFunctions = getSuperFunctionsForMethod(method, trace); + autoTypeParameterToModified = SignaturesUtil.recreateTypeParametersAndReturnMapping(autoTypeParameters); + + modifiedTypeParameters = modifyTypeParametersAccordingToSuperMethods(autoTypeParameters); modifiedReturnType = modifyReturnTypeAccordingToSuperMethods(autoReturnType); modifiedValueParameters = modifyValueParametersAccordingToSuperMethods(autoValueParameters); } + public List getModifiedTypeParameters() { + return modifiedTypeParameters; + } + public JavaDescriptorResolver.ValueParameterDescriptors getModifiedValueParameters() { return modifiedValueParameters; } @@ -91,6 +101,41 @@ public class SignaturesPropagationData { return modifyTypeAccordingToSuperMethods(autoType, typesFromSuperMethods, true); } + private List modifyTypeParametersAccordingToSuperMethods(List autoTypeParameters) { + List result = Lists.newArrayList(); + + for (TypeParameterDescriptor autoParameter : autoTypeParameters) { + int index = autoParameter.getIndex(); + TypeParameterDescriptorImpl modifiedTypeParameter = autoTypeParameterToModified.get(autoParameter); + + List> upperBoundFromSuperFunctionsIterators = Lists.newArrayList(); + for (FunctionDescriptor superFunction : superFunctions) { + upperBoundFromSuperFunctionsIterators.add(superFunction.getTypeParameters().get(index).getUpperBounds().iterator()); + } + + for (JetType autoUpperBound : autoParameter.getUpperBounds()) { + List upperBoundsFromSuperFunctions = Lists.newArrayList(); + + for (Iterator iterator : upperBoundFromSuperFunctionsIterators) { + assert iterator.hasNext(); + upperBoundsFromSuperFunctions.add(iterator.next()); + } + + JetType modifiedUpperBound = modifyTypeAccordingToSuperMethods(autoUpperBound, upperBoundsFromSuperFunctions, false); + modifiedTypeParameter.addUpperBound(modifiedUpperBound); + } + + for (Iterator iterator : upperBoundFromSuperFunctionsIterators) { + assert !iterator.hasNext(); + } + + modifiedTypeParameter.setInitialized(); + result.add(modifiedTypeParameter); + } + + return result; + } + private JavaDescriptorResolver.ValueParameterDescriptors modifyValueParametersAccordingToSuperMethods( @NotNull JavaDescriptorResolver.ValueParameterDescriptors parameters // descriptors built by parameters resolver ) { @@ -126,7 +171,16 @@ public class SignaturesPropagationData { )); } - return new JavaDescriptorResolver.ValueParameterDescriptors(parameters.getReceiverType(), resultParameters); + JetType originalReceiverType = parameters.getReceiverType(); + if (originalReceiverType != null) { + JetType substituted = SignaturesUtil.createSubstitutorForFunctionTypeParameters(autoTypeParameterToModified) + .substitute(originalReceiverType, Variance.INVARIANT); + assert substituted != null; + return new JavaDescriptorResolver.ValueParameterDescriptors(substituted, resultParameters); + } + else { + return new JavaDescriptorResolver.ValueParameterDescriptors(null, resultParameters); + } } private static List getSuperFunctionsForMethod( @@ -414,6 +468,10 @@ public class SignaturesPropagationData { ClassifierDescriptor classifier = autoType.getConstructor().getDeclarationDescriptor(); if (!(classifier instanceof ClassDescriptor)) { assert classifier != null : "no declaration descriptor for type " + autoType; + + if (classifier instanceof TypeParameterDescriptor && autoTypeParameterToModified.containsKey(classifier)) { + return autoTypeParameterToModified.get(classifier); + } return classifier; } ClassDescriptor clazz = (ClassDescriptor) classifier; diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java index e983a00e191..277edbb13b0 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/JavaFunctionResolver.java @@ -142,11 +142,12 @@ public final class JavaFunctionResolver { final List signatureErrors = Lists.newArrayList(); SignaturesPropagationData signaturesPropagationData = - new SignaturesPropagationData(returnType, valueParameterDescriptors, method, trace); + new SignaturesPropagationData(returnType, valueParameterDescriptors, methodTypeParameters, method, trace); List superFunctions = signaturesPropagationData.getSuperFunctions(); returnType = signaturesPropagationData.getModifiedReturnType(); valueParameterDescriptors = signaturesPropagationData.getModifiedValueParameters(); + methodTypeParameters = signaturesPropagationData.getModifiedTypeParameters(); signatureErrors.addAll(signaturesPropagationData.getSignatureErrors()); diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.java b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.java new file mode 100644 index 00000000000..4bd96edcdf9 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.java @@ -0,0 +1,19 @@ +package test; + +import org.jetbrains.annotations.NotNull; +import jet.runtime.typeinfo.KotlinSignature; +import org.jetbrains.jet.jvm.compiler.annotation.ExpectLoadError; +import java.util.*; +import java.util.List; + +public interface InheritMutability { + + public interface Super { + @KotlinSignature("fun > foo(a: A)") + > void foo(A a); + } + + public interface Sub extends Super { + > void foo(B b); + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.kt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.kt new file mode 100644 index 00000000000..763b57e5284 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.kt @@ -0,0 +1,12 @@ +package test + +public trait InheritMutability: Object { + + public trait Super: Object { + public fun > foo(p0: A) + } + + public trait Sub: Super { + override fun > foo(p0: B) + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.txt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.txt new file mode 100644 index 00000000000..84b16dbfe3e --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.txt @@ -0,0 +1,10 @@ +namespace test + +public abstract trait test.InheritMutability : java.lang.Object { + public abstract trait test.InheritMutability.Sub : test.InheritMutability.Super { + public abstract override /*1*/ fun >foo(/*0*/ p0: B): jet.Tuple0 + } + public abstract trait test.InheritMutability.Super : java.lang.Object { + public abstract fun >foo(/*0*/ p0: A): jet.Tuple0 + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.java b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.java new file mode 100644 index 00000000000..350d9dc3749 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.java @@ -0,0 +1,16 @@ +package test; + +import org.jetbrains.annotations.NotNull; +import jet.runtime.typeinfo.KotlinSignature; + +public interface InheritNullability { + + public interface Super { + @KotlinSignature("fun foo(a: A)") + void foo(A a); + } + + public interface Sub extends Super { + void foo(B b); + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.kt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.kt new file mode 100644 index 00000000000..53870399b65 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.kt @@ -0,0 +1,12 @@ +package test + +public trait InheritNullability: Object { + + public trait Super: Object { + public fun foo(p0: A) + } + + public trait Sub: Super { + override fun foo(p0: B) + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.txt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.txt new file mode 100644 index 00000000000..a0956aec824 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.txt @@ -0,0 +1,10 @@ +namespace test + +public abstract trait test.InheritNullability : java.lang.Object { + public abstract trait test.InheritNullability.Sub : test.InheritNullability.Super { + public abstract override /*1*/ fun foo(/*0*/ p0: B): jet.Tuple0 + } + public abstract trait test.InheritNullability.Super : java.lang.Object { + public abstract fun foo(/*0*/ p0: A): jet.Tuple0 + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.java b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.java new file mode 100644 index 00000000000..9e7dd3f9c7c --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.java @@ -0,0 +1,18 @@ +package test; + +import org.jetbrains.annotations.NotNull; +import jet.runtime.typeinfo.KotlinSignature; +import org.jetbrains.jet.jvm.compiler.annotation.ExpectLoadError; +import java.util.*; + +public interface InheritReadOnliness { + + public interface Super { + @KotlinSignature("fun > foo(a: A)") + > void foo(A a); + } + + public interface Sub extends Super { + > void foo(B b); + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.kt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.kt new file mode 100644 index 00000000000..66143473110 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.kt @@ -0,0 +1,12 @@ +package test + +public trait InheritReadOnliness: Object { + + public trait Super: Object { + public fun > foo(p0: A) + } + + public trait Sub: Super { + override fun > foo(p0: B) + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.txt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.txt new file mode 100644 index 00000000000..e0448bdea91 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.txt @@ -0,0 +1,10 @@ +namespace test + +public abstract trait test.InheritReadOnliness : java.lang.Object { + public abstract trait test.InheritReadOnliness.Sub : test.InheritReadOnliness.Super { + public abstract override /*1*/ fun >foo(/*0*/ p0: B): jet.Tuple0 + } + public abstract trait test.InheritReadOnliness.Super : java.lang.Object { + public abstract fun >foo(/*0*/ p0: A): jet.Tuple0 + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.java b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.java new file mode 100644 index 00000000000..472f606708e --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.java @@ -0,0 +1,18 @@ +package test; + +import org.jetbrains.annotations.NotNull; +import jet.runtime.typeinfo.KotlinSignature; + +import java.lang.Cloneable; + +public interface TwoBounds { + + public interface Super { + @KotlinSignature("fun foo(a: A) where A: Cloneable") + void foo(A a); + } + + public interface Sub extends Super { + void foo(B b); + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.kt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.kt new file mode 100644 index 00000000000..c13948755ca --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.kt @@ -0,0 +1,12 @@ +package test + +public trait TwoBounds: Object { + + public trait Super: Object { + public fun foo(p0: A) where A: Cloneable + } + + public trait Sub: Super { + override fun foo(p0: B) where B: Cloneable + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.txt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.txt new file mode 100644 index 00000000000..e2af3cc6938 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.txt @@ -0,0 +1,10 @@ +namespace test + +public abstract trait test.TwoBounds : java.lang.Object { + public abstract trait test.TwoBounds.Sub : test.TwoBounds.Super { + public abstract override /*1*/ fun foo(/*0*/ p0: B): jet.Tuple0 + } + public abstract trait test.TwoBounds.Super : java.lang.Object { + public abstract fun foo(/*0*/ p0: A): jet.Tuple0 + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.java b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.java new file mode 100644 index 00000000000..e23969d497f --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.java @@ -0,0 +1,21 @@ +package test; + +import org.jetbrains.annotations.NotNull; +import jet.runtime.typeinfo.KotlinSignature; + +public interface TwoSuperclasses { + + public interface Super1 { + @KotlinSignature("fun foo(a: A)") + void foo(A a); + } + + public interface Super2 { + @KotlinSignature("fun foo(a: B)") + void foo(B a); + } + + public interface Sub extends Super1, Super2 { + void foo(C c); + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.kt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.kt new file mode 100644 index 00000000000..d0390c27464 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.kt @@ -0,0 +1,16 @@ +package test + +public trait TwoSuperclasses: Object { + + public trait Super1: Object { + public fun foo(p0: A) + } + + public trait Super2: Object { + public fun foo(p0: B) + } + + public trait Sub: Super1, Super2 { + override fun foo(p0: C) + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.txt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.txt new file mode 100644 index 00000000000..9a78cf92a78 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.txt @@ -0,0 +1,13 @@ +namespace test + +public abstract trait test.TwoSuperclasses : java.lang.Object { + public abstract trait test.TwoSuperclasses.Sub : test.TwoSuperclasses.Super1, test.TwoSuperclasses.Super2 { + public abstract override /*2*/ fun foo(/*0*/ p0: C): jet.Tuple0 + } + public abstract trait test.TwoSuperclasses.Super1 : java.lang.Object { + public abstract fun foo(/*0*/ p0: A): jet.Tuple0 + } + public abstract trait test.TwoSuperclasses.Super2 : java.lang.Object { + public abstract fun foo(/*0*/ p0: B): jet.Tuple0 + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.java b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.java new file mode 100644 index 00000000000..2b1b3275914 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.java @@ -0,0 +1,16 @@ +package test; + +import org.jetbrains.annotations.NotNull; +import jet.runtime.typeinfo.KotlinSignature; + +public interface TwoTypeParameters { + + public interface Super { + @KotlinSignature("fun foo(a: A, b: B)") + void foo(A a, B b); + } + + public interface Sub extends Super { + void foo(B b, A a); + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.kt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.kt new file mode 100644 index 00000000000..6d80b9dce81 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.kt @@ -0,0 +1,12 @@ +package test + +public trait TwoTypeParameters: Object { + + public trait Super: Object { + public fun foo(p0: A, p1: B) + } + + public trait Sub: Super { + override fun foo(p0: B, p1: A) + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.txt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.txt new file mode 100644 index 00000000000..79b3c757bd7 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.txt @@ -0,0 +1,10 @@ +namespace test + +public abstract trait test.TwoTypeParameters : java.lang.Object { + public abstract trait test.TwoTypeParameters.Sub : test.TwoTypeParameters.Super { + public abstract override /*1*/ fun foo(/*0*/ p0: B, /*1*/ p1: A): jet.Tuple0 + } + public abstract trait test.TwoTypeParameters.Super : java.lang.Object { + public abstract fun foo(/*0*/ p0: A, /*1*/ p1: B): jet.Tuple0 + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.java b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.java new file mode 100644 index 00000000000..e1b2cd86a8a --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.java @@ -0,0 +1,17 @@ +package test; + +import java.util.List; +import org.jetbrains.annotations.NotNull; +import jet.runtime.typeinfo.KotlinSignature; + +public interface UseParameterAsUpperBound { + + public interface Super { + @KotlinSignature("fun foo(a: A, b: B)") + void foo(A a, B b); + } + + public interface Sub extends Super { + void foo(B b, A a); + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.kt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.kt new file mode 100644 index 00000000000..fd4a7be4554 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.kt @@ -0,0 +1,12 @@ +package test + +public trait UseParameterAsUpperBound: Object { + + public trait Super: Object { + public fun foo(p0: A, p1: B) + } + + public trait Sub: Super { + override fun foo(p0: B, p1: A) + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.txt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.txt new file mode 100644 index 00000000000..56b143eea01 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.txt @@ -0,0 +1,10 @@ +namespace test + +public abstract trait test.UseParameterAsUpperBound : java.lang.Object { + public abstract trait test.UseParameterAsUpperBound.Sub : test.UseParameterAsUpperBound.Super { + public abstract override /*1*/ fun foo(/*0*/ p0: B, /*1*/ p1: A): jet.Tuple0 + } + public abstract trait test.UseParameterAsUpperBound.Super : java.lang.Object { + public abstract fun foo(/*0*/ p0: A, /*1*/ p1: B): jet.Tuple0 + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.java b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.java new file mode 100644 index 00000000000..4e85b95c357 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.java @@ -0,0 +1,17 @@ +package test; + +import java.util.List; +import org.jetbrains.annotations.NotNull; +import jet.runtime.typeinfo.KotlinSignature; + +public interface UseParameterInUpperBound { + + public interface Super { + @KotlinSignature("fun > foo(a: A, b: B)") + > void foo(A a, B b); + } + + public interface Sub extends Super { + > void foo(B b, A a); + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.kt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.kt new file mode 100644 index 00000000000..af8017ca33f --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.kt @@ -0,0 +1,12 @@ +package test + +public trait UseParameterInUpperBound: Object { + + public trait Super: Object { + public fun > foo(p0: A, p1: B) + } + + public trait Sub: Super { + override fun > foo(p0: B, p1: A) + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.txt b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.txt new file mode 100644 index 00000000000..16c0d253153 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.txt @@ -0,0 +1,10 @@ +namespace test + +public abstract trait test.UseParameterInUpperBound : java.lang.Object { + public abstract trait test.UseParameterInUpperBound.Sub : test.UseParameterInUpperBound.Super { + public abstract override /*1*/ fun >foo(/*0*/ p0: B, /*1*/ p1: A): jet.Tuple0 + } + public abstract trait test.UseParameterInUpperBound.Super : java.lang.Object { + public abstract fun >foo(/*0*/ p0: A, /*1*/ p1: B): jet.Tuple0 + } +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index 4510b5aed3e..1e36326e7a3 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -439,7 +439,7 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { } @TestMetadata("compiler/testData/loadJava/kotlinSignature/propagation") - @InnerTestClasses({Propagation.Parameter.class, Propagation.Return.class}) + @InnerTestClasses({Propagation.Parameter.class, Propagation.Return.class, Propagation.TypeParameter.class}) public static class Propagation extends AbstractLoadJavaTest { public void testAllFilesPresentInPropagation() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadJava/kotlinSignature/propagation"), "java", true); @@ -656,11 +656,60 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { } + @TestMetadata("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter") + public static class TypeParameter extends AbstractLoadJavaTest { + public void testAllFilesPresentInTypeParameter() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter"), "java", true); + } + + @TestMetadata("InheritMutability.java") + public void testInheritMutability() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.java"); + } + + @TestMetadata("InheritNullability.java") + public void testInheritNullability() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.java"); + } + + @TestMetadata("InheritReadOnliness.java") + public void testInheritReadOnliness() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.java"); + } + + @TestMetadata("TwoBounds.java") + public void testTwoBounds() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.java"); + } + + @TestMetadata("TwoSuperclasses.java") + public void testTwoSuperclasses() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.java"); + } + + @TestMetadata("TwoTypeParameters.java") + public void testTwoTypeParameters() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.java"); + } + + @TestMetadata("UseParameterAsUpperBound.java") + public void testUseParameterAsUpperBound() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.java"); + } + + @TestMetadata("UseParameterInUpperBound.java") + public void testUseParameterInUpperBound() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.java"); + } + + } + public static Test innerSuite() { TestSuite suite = new TestSuite("Propagation"); suite.addTestSuite(Propagation.class); suite.addTestSuite(Parameter.class); suite.addTestSuite(Return.class); + suite.addTestSuite(TypeParameter.class); return suite; } } diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java index d0a725c8fc0..f390c7e6e84 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -1329,7 +1329,7 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso } @TestMetadata("compiler/testData/loadJava/kotlinSignature/propagation") - @InnerTestClasses({Propagation.Parameter.class, Propagation.Return.class}) + @InnerTestClasses({Propagation.Parameter.class, Propagation.Return.class, Propagation.TypeParameter.class}) public static class Propagation extends AbstractLazyResolveNamespaceComparingTest { public void testAllFilesPresentInPropagation() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadJava/kotlinSignature/propagation"), "kt", true); @@ -1546,11 +1546,60 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso } + @TestMetadata("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter") + public static class TypeParameter extends AbstractLazyResolveNamespaceComparingTest { + public void testAllFilesPresentInTypeParameter() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter"), "kt", true); + } + + @TestMetadata("InheritMutability.kt") + public void testInheritMutability() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritMutability.kt"); + } + + @TestMetadata("InheritNullability.kt") + public void testInheritNullability() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritNullability.kt"); + } + + @TestMetadata("InheritReadOnliness.kt") + public void testInheritReadOnliness() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/InheritReadOnliness.kt"); + } + + @TestMetadata("TwoBounds.kt") + public void testTwoBounds() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoBounds.kt"); + } + + @TestMetadata("TwoSuperclasses.kt") + public void testTwoSuperclasses() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoSuperclasses.kt"); + } + + @TestMetadata("TwoTypeParameters.kt") + public void testTwoTypeParameters() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/TwoTypeParameters.kt"); + } + + @TestMetadata("UseParameterAsUpperBound.kt") + public void testUseParameterAsUpperBound() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterAsUpperBound.kt"); + } + + @TestMetadata("UseParameterInUpperBound.kt") + public void testUseParameterInUpperBound() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/propagation/typeParameter/UseParameterInUpperBound.kt"); + } + + } + public static Test innerSuite() { TestSuite suite = new TestSuite("Propagation"); suite.addTestSuite(Propagation.class); suite.addTestSuite(Parameter.class); suite.addTestSuite(Return.class); + suite.addTestSuite(TypeParameter.class); return suite; } }