diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index a19a96f13c5..f1298eca23c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -60,7 +60,10 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.TypeUtils; -import org.jetbrains.org.objectweb.asm.*; +import org.jetbrains.org.objectweb.asm.AnnotationVisitor; +import org.jetbrains.org.objectweb.asm.Label; +import org.jetbrains.org.objectweb.asm.MethodVisitor; +import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter; import org.jetbrains.org.objectweb.asm.commons.Method; import org.jetbrains.org.objectweb.asm.util.TraceMethodVisitor; @@ -273,13 +276,14 @@ public class FunctionCodegen { } } else if (kind == JvmMethodParameterKind.RECEIVER) { - ReceiverParameterDescriptor receiver = ((functionDescriptor instanceof PropertyAccessorDescriptor) - ? ((PropertyAccessorDescriptor) functionDescriptor).getCorrespondingProperty() - : functionDescriptor).getExtensionReceiverParameter(); + ReceiverParameterDescriptor receiver = JvmCodegenUtil.getDirectMember(functionDescriptor).getExtensionReceiverParameter(); + if (receiver != null) { AnnotationCodegen annotationCodegen = AnnotationCodegen.forParameter(i, mv, typeMapper); Annotated targetedAnnotations = new AnnotatedWithOnlyTargetedAnnotations(receiver.getType()); annotationCodegen.genAnnotations(targetedAnnotations, parameterSignature.getAsmType(), RECEIVER); + + annotationCodegen.genAnnotations(receiver, parameterSignature.getAsmType()); } } } diff --git a/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.kt b/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.kt index d33f698dbdb..86297f6032d 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.kt +++ b/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.kt @@ -1,14 +1,14 @@ -public annotation class Ann +annotation class Ann -public class A { +class A { fun @receiver:Ann String.f(): String = "" - val @receiver:Ann String.p: String + val @receiver:Ann String?.p: String get() = "" } -fun @receiver:Ann String.topLevelF(): String = "" +fun @receiver:Ann String?.topLevelF(): String = "" val @receiver:Ann String.topLevelP: String - get() = "" \ No newline at end of file + get() = "" diff --git a/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt b/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt index 3c3bc6d1f68..251e95c3cfc 100644 --- a/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt +++ b/compiler/testData/codegen/bytecodeListing/annotations/onReceiver.txt @@ -1,8 +1,8 @@ @kotlin.Metadata public final class A { public method (): void - public final @org.jetbrains.annotations.NotNull method f(@Ann p0: java.lang.String): java.lang.String - public final @org.jetbrains.annotations.NotNull method getP(@Ann p0: java.lang.String): java.lang.String + public final @org.jetbrains.annotations.NotNull method f(@Ann @org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String + public final @org.jetbrains.annotations.NotNull method getP(@Ann @org.jetbrains.annotations.Nullable p0: java.lang.String): java.lang.String } @java.lang.annotation.Retention @@ -11,6 +11,6 @@ public abstract class Ann @kotlin.Metadata public final class OnReceiverKt { - public final static @org.jetbrains.annotations.NotNull method getTopLevelP(@Ann p0: java.lang.String): java.lang.String - public final static @org.jetbrains.annotations.NotNull method topLevelF(@Ann p0: java.lang.String): java.lang.String + public final static @org.jetbrains.annotations.NotNull method getTopLevelP(@Ann @org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String + public final static @org.jetbrains.annotations.NotNull method topLevelF(@Ann @org.jetbrains.annotations.Nullable p0: java.lang.String): java.lang.String } \ No newline at end of file diff --git a/idea/testData/refactoring/changeSignature/AddPropertyReceiverAfter.1.java b/idea/testData/refactoring/changeSignature/AddPropertyReceiverAfter.1.java index 17292121118..0a3107ef785 100644 --- a/idea/testData/refactoring/changeSignature/AddPropertyReceiverAfter.1.java +++ b/idea/testData/refactoring/changeSignature/AddPropertyReceiverAfter.1.java @@ -1,15 +1,17 @@ +import org.jetbrains.annotations.NotNull; + import java.lang.Override; public class J extends A { private int p; @Override - public int getP(String receiver) { + public int getP(@NotNull String receiver) { return p; } @Override - public void setP(String receiver, int value) { + public void setP(@NotNull String receiver, int value) { p = value; } } @@ -28,4 +30,4 @@ class Test { new B().getP(""); new B().setP("", 3); } -} \ No newline at end of file +} diff --git a/idea/testData/refactoring/changeSignature/AddReceiverToGenericsWithOverridesAfter.1.java b/idea/testData/refactoring/changeSignature/AddReceiverToGenericsWithOverridesAfter.1.java index 631c8c226ce..6e34de26712 100644 --- a/idea/testData/refactoring/changeSignature/AddReceiverToGenericsWithOverridesAfter.1.java +++ b/idea/testData/refactoring/changeSignature/AddReceiverToGenericsWithOverridesAfter.1.java @@ -1,18 +1,20 @@ +import org.jetbrains.annotations.NotNull; + interface J extends T { @Override - int foofoofoo(U a, B b); + int foofoofoo(@NotNull U a, B b); } abstract class J1 implements J> { @Override - public int foofoofoo(U> xu, C c) { + public int foofoofoo(@NotNull U> xu, C c) { throw new UnsupportedOperationException(); } } abstract class J2 extends J1 { @Override - public int foofoofoo(U> xu, C c) { + public int foofoofoo(@NotNull U> xu, C c) { throw new UnsupportedOperationException(); } -} \ No newline at end of file +}