Write nullability annotations on extension receiver parameters

#KT-5429 Fixed
This commit is contained in:
Alexander Udalov
2016-03-09 12:51:24 +03:00
parent 597c571f25
commit 994dc46bcd
5 changed files with 28 additions and 20 deletions
@@ -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());
}
}
}
@@ -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() = ""
get() = ""
@@ -1,8 +1,8 @@
@kotlin.Metadata
public final class A {
public method <init>(): 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
}