From 889ea107f6973aecee148ca1fa1941a3af604d92 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 21 Nov 2012 22:30:59 +0400 Subject: [PATCH] Reflect Kotlin's declaration-site variance in Java signatures --- .../signature/BothSignatureWriter.java | 10 ++- .../jet/codegen/state/JetTypeMapper.java | 76 +++++++++++++++---- .../method/QExtendsListString.java | 2 +- .../writeSignature/ListOfCharSequence.kt | 2 +- .../testData/writeSignature/ListOfStar.kt | 4 +- .../ConstructorCollectionParameter.kt | 2 +- .../FunctionTwoTypeParameters.kt | 10 +++ .../declarationSiteVariance/InInInPosition.kt | 8 ++ .../InInOutPosition.kt | 8 ++ .../InOfInInInPosition.kt | 9 +++ .../InOfInInOutPosition.kt | 9 +++ .../InOfOutInInPosition.kt | 10 +++ .../InOfOutInOutPosition.kt | 10 +++ .../OutInInPosition.kt | 6 ++ .../OutInOutPosition.kt | 6 ++ .../OutOfInInInPosition.kt | 10 +++ .../OutOfInInOutPosition.kt | 10 +++ .../OutOfOutInInPosition.kt | 9 +++ .../OutOfOutInOutPosition.kt | 19 +++++ .../PropertyGetterIn.kt | 9 +++ .../PropertyGetterOut.kt | 9 +++ .../PropertyGetterTwoParams.kt | 9 +++ .../PropertySetterIn.kt | 9 +++ .../PropertySetterOut.kt | 9 +++ 24 files changed, 243 insertions(+), 22 deletions(-) create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/FunctionTwoTypeParameters.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/InInInPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/InInOutPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/InOfInInInPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/InOfInInOutPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/InOfOutInInPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/InOfOutInOutPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/OutInInPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/OutInOutPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/OutOfInInInPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/OutOfInInOutPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/OutOfOutInInPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/OutOfOutInOutPosition.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterIn.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterOut.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterTwoParams.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/PropertySetterIn.kt create mode 100644 compiler/testData/writeSignature/declarationSiteVariance/PropertySetterOut.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java b/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java index 64650091b64..f99e349d6da 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/signature/BothSignatureWriter.java @@ -260,10 +260,12 @@ public class BothSignatureWriter { } } - public void writeTypeArgument(Variance variance) { - JetSignatureVariance jsVariance = toJetSignatureVariance(variance); - push(signatureVisitor().visitTypeArgument(jsVariance.getChar())); - jetSignatureWriter.visitTypeArgument(jsVariance); + public void writeTypeArgument(Variance projectionKindForKotlin, Variance projectionKindForJava) { + push(signatureVisitor().visitTypeArgument( + toJetSignatureVariance(projectionKindForJava).getChar() + )); + + jetSignatureWriter.visitTypeArgument(toJetSignatureVariance(projectionKindForKotlin)); generic = true; } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index 5e071d2e4bd..4a1119a39d6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -184,7 +184,7 @@ public class JetTypeMapper extends BindingTraceAware { } return AsmTypeConstants.OBJECT_TYPE; } - return mapType(jetType, signatureVisitor, JetTypeMapperMode.VALUE); + return mapType(jetType, signatureVisitor, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE); } @NotNull @@ -209,6 +209,16 @@ public class JetTypeMapper extends BindingTraceAware { @NotNull public Type mapType(JetType jetType, @Nullable BothSignatureWriter signatureVisitor, @NotNull JetTypeMapperMode kind) { + return mapType(jetType, signatureVisitor, kind, Variance.INVARIANT); + } + + @NotNull + public Type mapType( + JetType jetType, + @Nullable BothSignatureWriter signatureVisitor, + @NotNull JetTypeMapperMode kind, + @NotNull Variance howThisTypeIsUsed + ) { Type known = null; DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); @@ -220,10 +230,10 @@ public class JetTypeMapper extends BindingTraceAware { if (known != null) { if (kind == JetTypeMapperMode.VALUE) { - return mapKnownAsmType(jetType, known, signatureVisitor); + return mapKnownAsmType(jetType, known, signatureVisitor, howThisTypeIsUsed); } else if (kind == JetTypeMapperMode.TYPE_PARAMETER) { - return mapKnownAsmType(jetType, boxType(known), signatureVisitor); + return mapKnownAsmType(jetType, boxType(known), signatureVisitor, howThisTypeIsUsed); } else if (kind == JetTypeMapperMode.TRAIT_IMPL) { throw new IllegalStateException("TRAIT_IMPL is not possible for " + jetType); @@ -234,7 +244,7 @@ public class JetTypeMapper extends BindingTraceAware { // TODO: enable and fix tests //throw new IllegalStateException("must not map known type to IMPL when not compiling builtins: " + jetType); } - return mapKnownAsmType(jetType, known, signatureVisitor); + return mapKnownAsmType(jetType, known, signatureVisitor, howThisTypeIsUsed); } else { throw new IllegalStateException("unknown kind: " + kind); @@ -297,7 +307,7 @@ public class JetTypeMapper extends BindingTraceAware { } boolean forceReal = KotlinToJavaTypesMap.getInstance().isForceReal(name); - writeGenericType(signatureVisitor, asmType, jetType, forceReal); + writeGenericType(signatureVisitor, asmType, jetType, forceReal, howThisTypeIsUsed); checkValidType(asmType); return asmType; @@ -334,28 +344,68 @@ public class JetTypeMapper extends BindingTraceAware { parentDeclarationElement != null ? parentDeclarationElement.getText() : "null"); } - private void writeGenericType(BothSignatureWriter signatureVisitor, Type asmType, JetType jetType, boolean forceReal) { + private void writeGenericType( + BothSignatureWriter signatureVisitor, + Type asmType, + JetType jetType, + boolean forceReal, + Variance howThisTypeIsUsed + ) { if (signatureVisitor != null) { String kotlinTypeName = getKotlinTypeNameForSignature(jetType, asmType); signatureVisitor.writeClassBegin(asmType.getInternalName(), jetType.isNullable(), forceReal, kotlinTypeName); - for (TypeProjection proj : jetType.getArguments()) { - // TODO: +- - signatureVisitor.writeTypeArgument(proj.getProjectionKind()); - mapType(proj.getType(), signatureVisitor, JetTypeMapperMode.TYPE_PARAMETER); + + List arguments = jetType.getArguments(); + for (TypeParameterDescriptor parameter : jetType.getConstructor().getParameters()) { + TypeProjection argument = arguments.get(parameter.getIndex()); + + Variance projectionKindForKotlin = argument.getProjectionKind(); + Variance projectionKindForJava = getEffectiveVariance( + parameter.getVariance(), + projectionKindForKotlin, + howThisTypeIsUsed + ); + signatureVisitor.writeTypeArgument(projectionKindForKotlin, projectionKindForJava); + + mapType(argument.getType(), signatureVisitor, JetTypeMapperMode.TYPE_PARAMETER); signatureVisitor.writeTypeArgumentEnd(); } signatureVisitor.writeClassEnd(); } } - private Type mapKnownAsmType(JetType jetType, Type asmType, @Nullable BothSignatureWriter signatureVisitor) { + private static Variance getEffectiveVariance(Variance parameterVariance, Variance projectionKind, Variance howThisTypeIsUsed) { + // Return type must not contain wildcards + if (howThisTypeIsUsed == Variance.OUT_VARIANCE) return projectionKind; + + if (parameterVariance == Variance.INVARIANT) { + return projectionKind; + } + if (projectionKind == Variance.INVARIANT) { + return parameterVariance; + } + if (parameterVariance == projectionKind) { + return parameterVariance; + } + + // In = In<*> + // Out = Out<*> + return Variance.OUT_VARIANCE; + } + + private Type mapKnownAsmType( + JetType jetType, + Type asmType, + @Nullable BothSignatureWriter signatureVisitor, + @NotNull Variance howThisTypeIsUsed + ) { if (signatureVisitor != null) { if (jetType.getArguments().isEmpty()) { String kotlinTypeName = getKotlinTypeNameForSignature(jetType, asmType); signatureVisitor.writeAsmType(asmType, jetType.isNullable(), kotlinTypeName); } else { - writeGenericType(signatureVisitor, asmType, jetType, false); + writeGenericType(signatureVisitor, asmType, jetType, false, howThisTypeIsUsed); } } checkValidType(asmType); @@ -695,7 +745,7 @@ public class JetTypeMapper extends BindingTraceAware { signatureWriter.writeParametersEnd(); signatureWriter.writeReturnType(); - mapType(descriptor.getType(), signatureWriter, JetTypeMapperMode.VALUE); + mapType(descriptor.getType(), signatureWriter, JetTypeMapperMode.VALUE, Variance.OUT_VARIANCE); signatureWriter.writeReturnTypeEnd(); JvmMethodSignature jvmMethodSignature = signatureWriter.makeJvmMethodSignature(name); diff --git a/compiler/testData/compileJavaAgainstKotlin/method/QExtendsListString.java b/compiler/testData/compileJavaAgainstKotlin/method/QExtendsListString.java index 6fa47cca12d..26ec2aea4a4 100644 --- a/compiler/testData/compileJavaAgainstKotlin/method/QExtendsListString.java +++ b/compiler/testData/compileJavaAgainstKotlin/method/QExtendsListString.java @@ -2,6 +2,6 @@ class Question { // id2 is to prevent java type parameter type inference static T id2(T p) { return p; } { - java.util.List s = id2(namespace.id(null)); + java.util.List s = id2(namespace.id(null)); } } diff --git a/compiler/testData/writeSignature/ListOfCharSequence.kt b/compiler/testData/writeSignature/ListOfCharSequence.kt index 75f2980cf04..7845e8ce088 100644 --- a/compiler/testData/writeSignature/ListOfCharSequence.kt +++ b/compiler/testData/writeSignature/ListOfCharSequence.kt @@ -3,5 +3,5 @@ fun foo(p: List) = 1 // method: namespace::foo // jvm signature: (Ljava/util/List;)I -// generic signature: (Ljava/util/List;)I +// generic signature: (Ljava/util/List<+Ljava/lang/CharSequence;>;)I // kotlin signature: (Ljet/List;)I // TODO: skip Kotlin signature diff --git a/compiler/testData/writeSignature/ListOfStar.kt b/compiler/testData/writeSignature/ListOfStar.kt index edc429c8b25..460c50173ad 100644 --- a/compiler/testData/writeSignature/ListOfStar.kt +++ b/compiler/testData/writeSignature/ListOfStar.kt @@ -3,5 +3,5 @@ fun listOfStar(): List<*> = throw Exception() // method: namespace::listOfStar // jvm signature: ()Ljava/util/List; -// generic signature: ()Ljava/util/List<+Ljava/lang/Object;>; -// kotlin signature: ()Ljet/List<+?Ljava/lang/Object;>; +// generic signature: ()Ljava/util/List; +// kotlin signature: ()Ljet/List; diff --git a/compiler/testData/writeSignature/constructor/ConstructorCollectionParameter.kt b/compiler/testData/writeSignature/constructor/ConstructorCollectionParameter.kt index 24e7f775289..ae56611f1d4 100644 --- a/compiler/testData/writeSignature/constructor/ConstructorCollectionParameter.kt +++ b/compiler/testData/writeSignature/constructor/ConstructorCollectionParameter.kt @@ -3,5 +3,5 @@ class TestingKotlinCollections(val arguments: Collection) // method: TestingKotlinCollections:: // jvm signature: (Ljava/util/Collection;)V -// generic signature: (Ljava/util/Collection;)V +// generic signature: (Ljava/util/Collection<+Ljava/lang/String;>;)V // kotlin signature: (Ljet/Collection;)null diff --git a/compiler/testData/writeSignature/declarationSiteVariance/FunctionTwoTypeParameters.kt b/compiler/testData/writeSignature/declarationSiteVariance/FunctionTwoTypeParameters.kt new file mode 100644 index 00000000000..227a56956c4 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/FunctionTwoTypeParameters.kt @@ -0,0 +1,10 @@ +class M + +class X + +fun f(m: M): M = throw Exception() + +// method: namespace::f +// jvm signature: (LM;)LM; +// generic signature: (LM<-LX;+LX;>;)LM; +// kotlin signature: (LM;)LM; diff --git a/compiler/testData/writeSignature/declarationSiteVariance/InInInPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/InInInPosition.kt new file mode 100644 index 00000000000..8e49e46ef73 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/InInInPosition.kt @@ -0,0 +1,8 @@ +class In + +fun f(p: In) {} + +// method: namespace::f +// jvm signature: (LIn;)V +// generic signature: (LIn<-Ljava/lang/String;>;)V +// kotlin signature: (LIn;)V diff --git a/compiler/testData/writeSignature/declarationSiteVariance/InInOutPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/InInOutPosition.kt new file mode 100644 index 00000000000..80387fe396b --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/InInOutPosition.kt @@ -0,0 +1,8 @@ +class In + +fun f(): In = throw Exception() + +// method: namespace::f +// jvm signature: ()LIn; +// generic signature: ()LIn; +// kotlin signature: ()LIn; diff --git a/compiler/testData/writeSignature/declarationSiteVariance/InOfInInInPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/InOfInInInPosition.kt new file mode 100644 index 00000000000..c2a13fa3d99 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/InOfInInInPosition.kt @@ -0,0 +1,9 @@ +class In +class X + +fun f(p: In>) {} + +// method: namespace::f +// jvm signature: (LIn;)V +// generic signature: (LIn<-LIn<-LX;>;>;)V +// kotlin signature: (LIn;>;)V diff --git a/compiler/testData/writeSignature/declarationSiteVariance/InOfInInOutPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/InOfInInOutPosition.kt new file mode 100644 index 00000000000..63a09b31970 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/InOfInInOutPosition.kt @@ -0,0 +1,9 @@ +class In +class X + +fun f(): In> = throw Exception() + +// method: namespace::f +// jvm signature: ()LIn; +// generic signature: ()LIn;>; +// kotlin signature: ()LIn;>; diff --git a/compiler/testData/writeSignature/declarationSiteVariance/InOfOutInInPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/InOfOutInInPosition.kt new file mode 100644 index 00000000000..2a761e0d90c --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/InOfOutInInPosition.kt @@ -0,0 +1,10 @@ +class In +class Out +class X + +fun f(p: In>) {} + +// method: namespace::f +// jvm signature: (LIn;)V +// generic signature: (LIn<-LOut<+LX;>;>;)V +// kotlin signature: (LIn;>;)V diff --git a/compiler/testData/writeSignature/declarationSiteVariance/InOfOutInOutPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/InOfOutInOutPosition.kt new file mode 100644 index 00000000000..7eaeb69102f --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/InOfOutInOutPosition.kt @@ -0,0 +1,10 @@ +class In +class Out +class X + +fun f(): In> = throw Exception() + +// method: namespace::f +// jvm signature: ()LIn; +// generic signature: ()LIn;>; +// kotlin signature: ()LIn;>; diff --git a/compiler/testData/writeSignature/declarationSiteVariance/OutInInPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/OutInInPosition.kt new file mode 100644 index 00000000000..893f83fa7c6 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/OutInInPosition.kt @@ -0,0 +1,6 @@ +fun f(p: List) {} + +// method: namespace::f +// jvm signature: (Ljava/util/List;)V +// generic signature: (Ljava/util/List<+Ljava/lang/String;>;)V +// kotlin signature: (Ljet/List;)V diff --git a/compiler/testData/writeSignature/declarationSiteVariance/OutInOutPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/OutInOutPosition.kt new file mode 100644 index 00000000000..fc6a3935869 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/OutInOutPosition.kt @@ -0,0 +1,6 @@ +fun f(): List = throw Exception() + +// method: namespace::f +// jvm signature: ()Ljava/util/List; +// generic signature: ()Ljava/util/List; +// kotlin signature: ()Ljet/List; diff --git a/compiler/testData/writeSignature/declarationSiteVariance/OutOfInInInPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/OutOfInInInPosition.kt new file mode 100644 index 00000000000..fcc1345b7e9 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/OutOfInInInPosition.kt @@ -0,0 +1,10 @@ +class In +class Out +class X + +fun f(p: Out>) {} + +// method: namespace::f +// jvm signature: (LOut;)V +// generic signature: (LOut<+LIn<-LX;>;>;)V +// kotlin signature: (LOut;>;)V diff --git a/compiler/testData/writeSignature/declarationSiteVariance/OutOfInInOutPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/OutOfInInOutPosition.kt new file mode 100644 index 00000000000..ca1b8126b6e --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/OutOfInInOutPosition.kt @@ -0,0 +1,10 @@ +class In +class Out +class X + +fun f(): Out> = throw Exception() + +// method: namespace::f +// jvm signature: ()LOut; +// generic signature: ()LOut;>; +// kotlin signature: ()LOut;>; diff --git a/compiler/testData/writeSignature/declarationSiteVariance/OutOfOutInInPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/OutOfOutInInPosition.kt new file mode 100644 index 00000000000..601a9cde2d6 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/OutOfOutInInPosition.kt @@ -0,0 +1,9 @@ +class Out +class X + +fun f(p: Out>) {} + +// method: namespace::f +// jvm signature: (LOut;)V +// generic signature: (LOut<+LOut<+LX;>;>;)V +// kotlin signature: (LOut;>;)V diff --git a/compiler/testData/writeSignature/declarationSiteVariance/OutOfOutInOutPosition.kt b/compiler/testData/writeSignature/declarationSiteVariance/OutOfOutInOutPosition.kt new file mode 100644 index 00000000000..3f3b4769559 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/OutOfOutInOutPosition.kt @@ -0,0 +1,19 @@ +class Out +class X + +// Why we want this to be translated to 'Out> f()' instead of 'Out> f()' +// There are two instantiations of 'In' in this test: outer Out<...> and inner Out +// So why do we want to put a wildcard on the inner one and not the outer? +// People don't want wildcards in return types, because they are _long_. So we try our best to remove wildcards where possible +// Not putting a wildcard on the outer occurrence is not imposing a restriction, actually it is removing one: +// anything that can be done with Out in Java can be done with Out +// But omitting the wildcard on the inner occurrence is restrictive: +// one can add a List to a List>, +// but not to a List>, +// thus removing the wildcard would be restricting the use of the return value of the method, and we don't want do this. +fun f(): Out> = throw Exception() + +// method: namespace::f +// jvm signature: ()LOut; +// generic signature: ()LOut;>; +// kotlin signature: ()LOut;>; diff --git a/compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterIn.kt b/compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterIn.kt new file mode 100644 index 00000000000..7415426e435 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterIn.kt @@ -0,0 +1,9 @@ +class M +class X + +val p: M = throw Exception() + +// method: namespace::getP +// jvm signature: ()LM; +// generic signature: ()LM; +// kotlin signature: null \ No newline at end of file diff --git a/compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterOut.kt b/compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterOut.kt new file mode 100644 index 00000000000..773740fdc8c --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterOut.kt @@ -0,0 +1,9 @@ +class M +class X + +val p: M = throw Exception() + +// method: namespace::getP +// jvm signature: ()LM; +// generic signature: ()LM; +// kotlin signature: null diff --git a/compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterTwoParams.kt b/compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterTwoParams.kt new file mode 100644 index 00000000000..fec368b1f61 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/PropertyGetterTwoParams.kt @@ -0,0 +1,9 @@ +class M +class X + +val p: M = throw Exception() + +// method: namespace::getP +// jvm signature: ()LM; +// generic signature: ()LM; +// kotlin signature: null diff --git a/compiler/testData/writeSignature/declarationSiteVariance/PropertySetterIn.kt b/compiler/testData/writeSignature/declarationSiteVariance/PropertySetterIn.kt new file mode 100644 index 00000000000..a164bdd4515 --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/PropertySetterIn.kt @@ -0,0 +1,9 @@ +class M +class X + +var p: M = throw Exception() + +// method: namespace::setP +// jvm signature: (LM;)V +// generic signature: (LM<-LX;>;)V +// kotlin signature: null \ No newline at end of file diff --git a/compiler/testData/writeSignature/declarationSiteVariance/PropertySetterOut.kt b/compiler/testData/writeSignature/declarationSiteVariance/PropertySetterOut.kt new file mode 100644 index 00000000000..b88b0cae2fb --- /dev/null +++ b/compiler/testData/writeSignature/declarationSiteVariance/PropertySetterOut.kt @@ -0,0 +1,9 @@ +class M +class X + +var p: M = throw Exception() + +// method: namespace::setP +// jvm signature: (LM;)V +// generic signature: (LM<+LX;>;)V +// kotlin signature: null