diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java index 5a782edbf2b..38ebcb60e14 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java @@ -118,11 +118,23 @@ class TypeTransformingVisitor extends JetVisitor { List altArguments = new ArrayList(); for (int i = 0, size = arguments.size(); i < size; i++) { - JetTypeElement argumentAlternativeTypeElement = type.getTypeArgumentsAsTypes().get(i).getTypeElement(); + JetTypeReference typeReference = type.getTypeArgumentsAsTypes().get(i); + + if (typeReference == null) { + // star projection + assert type instanceof JetUserType + && ((JetUserType) type).getTypeArguments().get(i).getProjectionKind() == JetProjectionKind.STAR; + + altArguments.add(arguments.get(i)); + + continue; + } + + JetTypeElement argumentAlternativeTypeElement = typeReference.getTypeElement(); assert argumentAlternativeTypeElement != null; TypeProjection argument = arguments.get(i); - JetType alternativeType = computeType(argumentAlternativeTypeElement, argument.getType(), originalToAltTypeParameters); + JetType alternativeArgumentType = computeType(argumentAlternativeTypeElement, argument.getType(), originalToAltTypeParameters); Variance projectionKind = argument.getProjectionKind(); Variance altProjectionKind; if (type instanceof JetUserType) { @@ -135,18 +147,19 @@ class TypeTransformingVisitor extends JetVisitor { altProjectionKind = Variance.OUT_VARIANCE; break; case STAR: - throw new AlternativeSignatureMismatchException("Star projection is not available in alternative signatures"); + throw new IllegalStateException("star projection should have been processed above"); default: altProjectionKind = Variance.INVARIANT; } if (altProjectionKind != projectionKind && projectionKind != Variance.INVARIANT) { - throw new AlternativeSignatureMismatchException("Variance mismatch, actual: %s, in alternative signature: %s", projectionKind, altProjectionKind); + throw new AlternativeSignatureMismatchException("Variance mismatch, actual: %s, in alternative signature: %s", + projectionKind, altProjectionKind); } } else { altProjectionKind = projectionKind; } - altArguments.add(new TypeProjection(altProjectionKind, alternativeType)); + altArguments.add(new TypeProjection(altProjectionKind, alternativeArgumentType)); } TypeConstructor typeConstructor; diff --git a/compiler/testData/loadJava/kotlinSignature/StarProjection.java b/compiler/testData/loadJava/kotlinSignature/StarProjection.java new file mode 100644 index 00000000000..a88acd75715 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/StarProjection.java @@ -0,0 +1,13 @@ +package test; + +import jet.runtime.typeinfo.KotlinSignature; + +public final class StarProjection { + @KotlinSignature("fun foo(): MyClass<*>") + public final MyClass foo() { + throw new UnsupportedOperationException(); + } + + public interface MyClass { + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/StarProjection.kt b/compiler/testData/loadJava/kotlinSignature/StarProjection.kt new file mode 100644 index 00000000000..9d45bb6c1a9 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/StarProjection.kt @@ -0,0 +1,7 @@ +package test + +public final class StarProjection: Object() { + public final fun foo(): MyClass<*> = throw UnsupportedOperationException() + + public trait MyClass: Object +} diff --git a/compiler/testData/loadJava/kotlinSignature/StarProjection.txt b/compiler/testData/loadJava/kotlinSignature/StarProjection.txt new file mode 100644 index 00000000000..d36f20f3073 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/StarProjection.txt @@ -0,0 +1,8 @@ +namespace test + +public final class test.StarProjection : java.lang.Object { + public final /*constructor*/ fun (): test.StarProjection + public final fun foo(): test.StarProjection.MyClass + public abstract trait test.StarProjection.MyClass : java.lang.Object { + } +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index 89eedfa5292..476993e484c 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -310,6 +310,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTest("compiler/testData/loadJava/kotlinSignature/PropertySimpleType.java"); } + @TestMetadata("StarProjection.java") + public void testStarProjection() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/StarProjection.java"); + } + @TestMetadata("compiler/testData/loadJava/kotlinSignature/error") public static class Error extends AbstractLoadJavaTest { @TestMetadata("AddingNullability.java") 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 2c4e2a886cd..06fceef7926 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -1200,6 +1200,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/PropertySimpleType.kt"); } + @TestMetadata("StarProjection.kt") + public void testStarProjection() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/StarProjection.kt"); + } + @TestMetadata("compiler/testData/loadJava/kotlinSignature/error") public static class Error extends AbstractLazyResolveNamespaceComparingTest { @TestMetadata("AddingNullability.kt")