Write nullability annotations on extension receiver parameters
#KT-5429 Fixed
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -1,15 +1,17 @@
|
||||
<caret>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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+6
-4
@@ -1,18 +1,20 @@
|
||||
<caret>import org.jetbrains.annotations.NotNull;
|
||||
|
||||
interface J<A> extends T<A> {
|
||||
@Override
|
||||
<B> int foofoofoo(U<A> a, B b);
|
||||
<B> int foofoofoo(@NotNull U<A> a, B b);
|
||||
}
|
||||
|
||||
abstract class J1<X> implements J<U<X>> {
|
||||
@Override
|
||||
public <C> int foofoofoo(U<U<X>> xu, C c) {
|
||||
public <C> int foofoofoo(@NotNull U<U<X>> xu, C c) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
|
||||
abstract class J2 extends J1<String> {
|
||||
@Override
|
||||
public <C> int foofoofoo(U<U<String>> xu, C c) {
|
||||
public <C> int foofoofoo(@NotNull U<U<String>> xu, C c) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user