JVM_IR: add offsets to JvmStatic and JvmOverloads proxies

KAPT3 needs them to correct error types in arguments.

 #KT-64639 Fixed
This commit is contained in:
Sonya Valchuk
2023-12-19 11:52:44 +00:00
committed by Space Cloud
parent d5aaa29a7f
commit 588549d1d0
10 changed files with 433 additions and 196 deletions
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.builders.declarations.buildConstructor
import org.jetbrains.kotlin.ir.builders.declarations.buildFun
import org.jetbrains.kotlin.ir.builders.setSourceRange
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.types.defaultType
@@ -120,6 +121,7 @@ private class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : C
val res = when (oldFunction) {
is IrConstructor -> {
buildConstructor {
setSourceRange(oldFunction)
origin = JvmLoweredDeclarationOrigin.JVM_OVERLOADS_WRAPPER
name = oldFunction.name
visibility = oldFunction.visibility
@@ -128,6 +130,7 @@ private class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : C
}
}
is IrSimpleFunction -> buildFun {
setSourceRange(oldFunction)
origin = JvmLoweredDeclarationOrigin.JVM_OVERLOADS_WRAPPER
name = oldFunction.name
visibility = oldFunction.visibility
@@ -135,6 +135,7 @@ class JvmCachedDeclarations(
private fun IrClass.makeProxy(target: IrSimpleFunction, isStatic: Boolean) =
context.irFactory.buildFun {
setSourceRange(target)
returnType = target.returnType
origin = JvmLoweredDeclarationOrigin.JVM_STATIC_WRAPPER
// The proxy needs to have the same name as what it is targeting. If that is a property accessor,
@@ -119,6 +119,9 @@ public final class ErrorInConstructorParameter {
* // signature: f4()Lerror/NonExistentClass;
* public final fun f4(): error/NonExistentClass
*
* // signature: f5(Lerror/NonExistentClass;Ljava/lang/String;)V
* public final fun f5(a: error/NonExistentClass, b: kotlin/String (* = ... *)): kotlin/Unit
*
* // signature: overloads(Lerror/NonExistentClass;)V
* public final fun overloads(a: error/NonExistentClass): kotlin/Unit
*
@@ -146,6 +149,10 @@ public final class ErrorInConstructorParameter {
* public final get
* public final set
*
* // companion object: Companion
*
* // nested class: Companion
*
* // module name: main
* }
*/
@@ -154,6 +161,8 @@ public final class ErrorInDeclarations {
public java.lang.String p1;
public ABC p2;
public BCD<java.lang.String> p3;
@org.jetbrains.annotations.NotNull()
public static final ErrorInDeclarations.Companion Companion = null;
public ErrorInDeclarations() {
super();
@@ -209,6 +218,47 @@ public final class ErrorInDeclarations {
public final ABC f4() {
return null;
}
@kotlin.jvm.JvmOverloads()
public final void f5(@org.jetbrains.annotations.NotNull()
ABC a) {
}
@kotlin.jvm.JvmOverloads()
public final void f5(@org.jetbrains.annotations.NotNull()
ABC a, @org.jetbrains.annotations.NotNull()
java.lang.String b) {
}
@kotlin.jvm.JvmStatic()
public static final void f6(@org.jetbrains.annotations.NotNull()
ABC a) {
}
/**
* public final companion object ErrorInDeclarations.Companion : kotlin/Any {
*
* // signature: <init>()V
* private constructor()
*
* // signature: f6(Lerror/NonExistentClass;)V
* public final fun f6(a: error/NonExistentClass): kotlin/Unit
*
* // module name: main
* }
*/
@kotlin.Metadata()
public static final class Companion {
private Companion() {
super();
}
@kotlin.jvm.JvmStatic()
public final void f6(@org.jetbrains.annotations.NotNull()
ABC a) {
}
}
}
////////////////////
@@ -0,0 +1,314 @@
import kotlin.reflect.KClass;
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
/**
* public final annotation class Anno : kotlin/Annotation {
*
* // signature: <init>(Lkotlin/reflect/KClass;)V
* public constructor(a: kotlin/reflect/KClass<kotlin/Any>)
*
* // getter: a()Ljava/lang/Class;
* public final val a: kotlin/reflect/KClass<kotlin/Any>
* public final get
*
* // module name: main
* }
*/
@kotlin.Metadata()
public abstract @interface Anno {
public abstract java.lang.Class<java.lang.Object> a();
}
////////////////////
import kotlin.reflect.KClass;
@Anno(a = ABC.class)
/**
* public final class ErrorInAnnotation : kotlin/Any {
*
* // signature: <init>()V
* public constructor()
*
* // module name: main
* }
*/
@kotlin.Metadata()
public final class ErrorInAnnotation {
public ErrorInAnnotation() {
super();
}
}
////////////////////
import kotlin.reflect.KClass;
/**
* public final class ErrorInConstructorParameter : kotlin/Any {
*
* // signature: <init>(Ljava/lang/String;Lerror/NonExistentClass;Ljava/util/List;)V
* public constructor(a: kotlin/String, b: error/NonExistentClass, c: kotlin/collections/List<error/NonExistentClass>)
*
* // field: a:Ljava/lang/String;
* // getter: getA()Ljava/lang/String;
* public final val a: kotlin/String
* public final get
*
* // field: b:Lerror/NonExistentClass;
* // getter: getB()Lerror/NonExistentClass;
* public final val b: error/NonExistentClass
* public final get
*
* // field: c:Ljava/util/List;
* // getter: getC()Ljava/util/List;
* public final val c: kotlin/collections/List<error/NonExistentClass>
* public final get
*
* // module name: main
* }
*/
@kotlin.Metadata()
public final class ErrorInConstructorParameter {
@org.jetbrains.annotations.NotNull()
private final java.lang.String a = null;
@org.jetbrains.annotations.NotNull()
private final ABC b = null;
@org.jetbrains.annotations.NotNull()
private final java.util.List<ABC> c = null;
public ErrorInConstructorParameter(@org.jetbrains.annotations.NotNull()
java.lang.String a, @org.jetbrains.annotations.NotNull()
ABC b, @org.jetbrains.annotations.NotNull()
java.util.List<? extends ABC> c) {
super();
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getA() {
return null;
}
@org.jetbrains.annotations.NotNull()
public final ABC getB() {
return null;
}
@org.jetbrains.annotations.NotNull()
public final java.util.List<ABC> getC() {
return null;
}
}
////////////////////
import kotlin.reflect.KClass;
/**
* public final class ErrorInDeclarations : kotlin/Any {
*
* // signature: <init>()V
* public constructor()
*
* // signature: f1(Ljava/lang/String;Lerror/NonExistentClass;)V
* public final fun f1(a: kotlin/String, b: error/NonExistentClass): kotlin/Unit
*
* // signature: f2()V
* public final fun <T#0 (* T *) : kotlin/String> f2(): kotlin/Unit
*
* // signature: f3()V
* public final fun <T#0 (* T *)> f3(): kotlin/Unit
*
* // signature: f4()Lerror/NonExistentClass;
* public final fun f4(): error/NonExistentClass
*
* // signature: f5(Lerror/NonExistentClass;Ljava/lang/String;)V
* public final fun f5(a: error/NonExistentClass, b: kotlin/String (* = ... *)): kotlin/Unit
*
* // signature: overloads(Lerror/NonExistentClass;)V
* public final fun overloads(a: error/NonExistentClass): kotlin/Unit
*
* // signature: overloads(Ljava/lang/String;)V
* public final fun overloads(a: kotlin/String): kotlin/Unit
*
* // field: p1:Ljava/lang/String;
* // getter: getP1()Ljava/lang/String;
* // setter: setP1(Ljava/lang/String;)V
* public final lateinit var p1: kotlin/String
* public final get
* public final set
*
* // field: p2:Lerror/NonExistentClass;
* // getter: getP2()Lerror/NonExistentClass;
* // setter: setP2(Lerror/NonExistentClass;)V
* public final lateinit var p2: error/NonExistentClass
* public final get
* public final set
*
* // field: p3:Lerror/NonExistentClass;
* // getter: getP3()Lerror/NonExistentClass;
* // setter: setP3(Lerror/NonExistentClass;)V
* public final lateinit var p3: error/NonExistentClass
* public final get
* public final set
*
* // companion object: Companion
*
* // nested class: Companion
*
* // module name: main
* }
*/
@kotlin.Metadata()
public final class ErrorInDeclarations {
public java.lang.String p1;
public ABC p2;
public BCD<java.lang.String> p3;
@org.jetbrains.annotations.NotNull()
public static final ErrorInDeclarations.Companion Companion = null;
public ErrorInDeclarations() {
super();
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getP1() {
return null;
}
public final void setP1(@org.jetbrains.annotations.NotNull()
java.lang.String p0) {
}
@org.jetbrains.annotations.NotNull()
public final ABC getP2() {
return null;
}
public final void setP2(@org.jetbrains.annotations.NotNull()
ABC p0) {
}
@org.jetbrains.annotations.NotNull()
public final BCD<java.lang.String> getP3() {
return null;
}
public final void setP3(@org.jetbrains.annotations.NotNull()
BCD<java.lang.String> p0) {
}
public final void overloads(@org.jetbrains.annotations.NotNull()
java.lang.String a) {
}
public final void overloads(@org.jetbrains.annotations.NotNull()
ABC a) {
}
public final void f1(@org.jetbrains.annotations.NotNull()
java.lang.String a, @org.jetbrains.annotations.NotNull()
ABC<java.util.List<java.lang.String>> b) {
}
public final <T extends java.lang.String>void f2() {
}
public final <T extends java.lang.Object>void f3() {
}
@org.jetbrains.annotations.Nullable()
public final ABC f4() {
return null;
}
@kotlin.jvm.JvmOverloads()
public final void f5(@org.jetbrains.annotations.NotNull()
ABC a) {
}
@kotlin.jvm.JvmOverloads()
public final void f5(@org.jetbrains.annotations.NotNull()
ABC a, @org.jetbrains.annotations.NotNull()
java.lang.String b) {
}
@kotlin.jvm.JvmStatic()
public static final void f6(@org.jetbrains.annotations.NotNull()
ABC a) {
}
/**
* public final companion object ErrorInDeclarations.Companion : kotlin/Any {
*
* // signature: <init>()V
* private constructor()
*
* // signature: f6(Lerror/NonExistentClass;)V
* public final fun f6(a: error/NonExistentClass): kotlin/Unit
*
* // module name: main
* }
*/
@kotlin.Metadata()
public static final class Companion {
private Companion() {
super();
}
@kotlin.jvm.JvmStatic()
public final void f6(@org.jetbrains.annotations.NotNull()
ABC a) {
}
}
}
////////////////////
import kotlin.reflect.KClass;
/**
* public final class ErrorInSupertype : kotlin/Any {
*
* // signature: <init>()V
* public constructor()
*
* // module name: main
* }
*/
@kotlin.Metadata()
public final class ErrorInSupertype implements ABC {
public ErrorInSupertype() {
super();
}
}
////////////////////
import kotlin.reflect.KClass;
/**
* public final class ErrorInSupertype2 : kotlin/Any {
*
* // signature: <init>()V
* public constructor()
*
* // module name: main
* }
*/
@kotlin.Metadata()
public final class ErrorInSupertype2 extends ABC<java.lang.String> {
public ErrorInSupertype2() {
super();
}
}
@@ -23,6 +23,14 @@ class ErrorInDeclarations {
fun <T : String> f2() {}
fun <T : ABC> f3() {}
fun f4(): ABC? = null
@JvmOverloads
fun f5(a: ABC, b: String = "") {}
companion object {
@JvmStatic
fun f6(a: ABC) {}
}
}
annotation class Anno(val a: KClass<Any>)
@@ -127,6 +127,9 @@ import kotlin.reflect.KClass;
* // signature: f4()Lerror/NonExistentClass;
* public final fun f4(): error/NonExistentClass
*
* // signature: f5(Lerror/NonExistentClass;Ljava/lang/String;)V
* public final fun f5(a: error/NonExistentClass, b: kotlin/String (* = ... *)): kotlin/Unit
*
* // signature: overloads(Lerror/NonExistentClass;)V
* public final fun overloads(a: error/NonExistentClass): kotlin/Unit
*
@@ -154,6 +157,10 @@ import kotlin.reflect.KClass;
* public final get
* public final set
*
* // companion object: Companion
*
* // nested class: Companion
*
* // module name: main
* }
*/
@@ -162,6 +169,8 @@ public final class ErrorInDeclarations {
public java.lang.String p1;
public ABC p2;
public BCD<java.lang.String> p3;
@org.jetbrains.annotations.NotNull()
public static final ErrorInDeclarations.Companion Companion = null;
public ErrorInDeclarations() {
super();
@@ -217,6 +226,47 @@ public final class ErrorInDeclarations {
public final ABC f4() {
return null;
}
@kotlin.jvm.JvmOverloads()
public final void f5(@org.jetbrains.annotations.NotNull()
error.NonExistentClass a) {
}
@kotlin.jvm.JvmOverloads()
public final void f5(@org.jetbrains.annotations.NotNull()
ABC a, @org.jetbrains.annotations.NotNull()
java.lang.String b) {
}
@kotlin.jvm.JvmStatic()
public static final void f6(@org.jetbrains.annotations.NotNull()
ABC a) {
}
/**
* public final companion object ErrorInDeclarations.Companion : kotlin/Any {
*
* // signature: <init>()V
* private constructor()
*
* // signature: f6(Lerror/NonExistentClass;)V
* public final fun f6(a: error/NonExistentClass): kotlin/Unit
*
* // module name: main
* }
*/
@kotlin.Metadata()
public static final class Companion {
private Companion() {
super();
}
@kotlin.jvm.JvmStatic()
public final void f6(@org.jetbrains.annotations.NotNull()
ABC a) {
}
}
}
////////////////////
@@ -1,138 +0,0 @@
/**
* public final class State : kotlin/Any {
*
* // signature: <init>(IJLjava/lang/String;)V
* public constructor(someInt: kotlin/Int, someLong: kotlin/Long, someString: kotlin/String (* = ... *))
*
* // field: someInt:I
* // getter: getSomeInt()I
* public final val someInt: kotlin/Int
* public final get
*
* // field: someLong:J
* // getter: getSomeLong()J
* public final val someLong: kotlin/Long
* public final get
*
* // field: someString:Ljava/lang/String;
* // getter: getSomeString()Ljava/lang/String;
* public final val someString: kotlin/String
* public final get
*
* // module name: main
* }
*/
@kotlin.Metadata()
public final class State {
private final int someInt = 0;
private final long someLong = 0L;
@org.jetbrains.annotations.NotNull()
private final java.lang.String someString = null;
@kotlin.jvm.JvmOverloads()
public State(int someInt, long someLong, @org.jetbrains.annotations.NotNull()
java.lang.String someString) {
super();
}
public final int getSomeInt() {
return 0;
}
public final long getSomeLong() {
return 0L;
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getSomeString() {
return null;
}
@kotlin.jvm.JvmOverloads()
public State(int someInt, long someLong) {
super();
}
}
////////////////////
/**
* public final class State2 : kotlin/Any {
*
* // signature: <init>(IJLjava/lang/String;)V
* public constructor(someInt: kotlin/Int, someLong: kotlin/Long (* = ... *), someString: kotlin/String (* = ... *))
*
* // signature: methodWithoutArgs()V
* public final fun methodWithoutArgs(): kotlin/Unit
*
* // signature: someMethod(Ljava/lang/String;)V
* public final fun someMethod(str: kotlin/String): kotlin/Unit
*
* // signature: test(IJLjava/lang/String;)I
* public final fun test(someInt: kotlin/Int, someLong: kotlin/Long (* = ... *), someString: kotlin/String (* = ... *)): kotlin/Int
*
* // field: someInt:I
* public final val someInt: kotlin/Int
* public final get
*
* // field: someLong:J
* public final val someLong: kotlin/Long
* public final get
*
* // field: someString:Ljava/lang/String;
* public final val someString: kotlin/String
* public final get
*
* // module name: main
* }
*/
@kotlin.Metadata()
public final class State2 {
@kotlin.jvm.JvmField()
public final int someInt = 0;
@kotlin.jvm.JvmField()
public final long someLong = 0L;
@kotlin.jvm.JvmField()
@org.jetbrains.annotations.NotNull()
public final java.lang.String someString = null;
@kotlin.jvm.JvmOverloads()
public State2(int someInt, long someLong, @org.jetbrains.annotations.NotNull()
java.lang.String someString) {
super();
}
@kotlin.jvm.JvmOverloads()
public final int test(int someInt, long someLong, @org.jetbrains.annotations.NotNull()
java.lang.String someString) {
return 0;
}
public final void someMethod(@org.jetbrains.annotations.NotNull()
java.lang.String str) {
}
public final void methodWithoutArgs() {
}
@kotlin.jvm.JvmOverloads()
public State2(int someInt) {
super();
}
@kotlin.jvm.JvmOverloads()
public State2(int someInt, long someLong) {
super();
}
@kotlin.jvm.JvmOverloads()
public final int test(int someInt) {
return 0;
}
@kotlin.jvm.JvmOverloads()
public final int test(int someInt, long someLong) {
return 0;
}
}
@@ -1,4 +1,3 @@
// FIR_BLOCKED: support of @JvmOverloads in LC
class State @JvmOverloads constructor(
val someInt: Int,
val someLong: Long,
@@ -93,13 +93,6 @@ public final class Modifiers {
public final strictfp void strictFp() {
}
@kotlin.jvm.JvmOverloads()
@org.jetbrains.annotations.NotNull()
public final java.lang.String overloads(@org.jetbrains.annotations.NotNull()
java.lang.String a, int n) {
return null;
}
@kotlin.jvm.JvmOverloads()
@org.jetbrains.annotations.NotNull()
public final java.lang.String overloads() {
@@ -112,6 +105,13 @@ public final class Modifiers {
java.lang.String a) {
return null;
}
@kotlin.jvm.JvmOverloads()
@org.jetbrains.annotations.NotNull()
public final java.lang.String overloads(@org.jetbrains.annotations.NotNull()
java.lang.String a, int n) {
return null;
}
}
////////////////////
@@ -1,50 +0,0 @@
package error;
public final class NonExistentClass {
}
////////////////////
package test;
@MyAnnotation()
@kotlin.Metadata()
public final class State {
private final int someInt = 0;
private final long someLong = 0L;
@org.jetbrains.annotations.NotNull()
private final java.lang.String someString = null;
@kotlin.jvm.JvmOverloads()
public State(int someInt, long someLong, @org.jetbrains.annotations.NotNull()
java.lang.String someString) {
super();
}
public final int getSomeInt() {
return 0;
}
public final long getSomeLong() {
return 0L;
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getSomeString() {
return null;
}
@kotlin.jvm.JvmOverloads()
public State(int someInt, long someLong) {
super();
}
}
////////////////////
package test;
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@kotlin.Metadata()
public abstract @interface MyAnnotation {
}