Kapt: support property $annotations methods for JVM IR

`is PropertyDescriptor` check doesn't work for JVM IR where descriptor
is created on-the-fly and is an `IrBasedSimpleFunctionDescriptor`.

 #KT-49682
This commit is contained in:
Alexander Udalov
2021-12-21 01:48:43 +01:00
parent 25edf64daf
commit 07d3e3a5bd
14 changed files with 756 additions and 13 deletions
@@ -42,6 +42,7 @@ import org.jetbrains.kotlin.kapt3.javac.KaptJavaFileObject
import org.jetbrains.kotlin.kapt3.javac.KaptTreeMaker
import org.jetbrains.kotlin.kapt3.stubs.ErrorTypeCorrector.TypeKind.*
import org.jetbrains.kotlin.kapt3.util.*
import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
import org.jetbrains.kotlin.load.kotlin.TypeMappingMode
import org.jetbrains.kotlin.name.FqName
@@ -881,8 +882,8 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati
if (isIgnored(method.invisibleAnnotations)) return null
val descriptor = kaptContext.origins[method]?.descriptor as? CallableDescriptor ?: return null
val isAnnotationHolderForProperty = descriptor is PropertyDescriptor && isSynthetic(method.access)
&& isStatic(method.access) && method.name.endsWith("\$annotations")
val isAnnotationHolderForProperty =
isSynthetic(method.access) && isStatic(method.access) && method.name.endsWith(JvmAbi.ANNOTATED_PROPERTY_METHOD_NAME_SUFFIX)
if (isSynthetic(method.access) && !isAnnotationHolderForProperty) return null
@@ -0,0 +1,117 @@
package test;
import java.lang.System;
@kotlin.Metadata()
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Anno(value = "anno-class")
public abstract @interface Anno {
public abstract java.lang.String value();
}
////////////////////
package test;
import java.lang.System;
@kotlin.jvm.JvmName(name = "AnnotationsTest")
@kotlin.Metadata()
public final class AnnotationsTest {
public AnnotationsTest() {
super();
}
@Anno(value = "top-level-fun")
public static final void topLevelFun(@org.jetbrains.annotations.NotNull()
@Anno(value = "top-level-fun-receiver")
java.lang.String $this$topLevelFun) {
}
@Anno(value = "top-level-val")
@java.lang.Deprecated()
public static void getTopLevelVal$annotations(int p0) {
}
@org.jetbrains.annotations.NotNull()
public static final java.lang.String getTopLevelVal(@Anno(value = "top-level-val-receiver")
int $this$topLevelVal) {
return null;
}
}
////////////////////
package test;
import java.lang.System;
@kotlin.Metadata()
@Anno(value = "enum")
public enum Enum {
@Anno(value = "white")
/*public static final*/ WHITE /* = new Enum() */,
@Anno(value = "black")
/*public static final*/ BLACK /* = new Enum() */;
private final int x = 0;
@Anno(value = "enum-constructor")
Enum(@Anno(value = "x")
int x) {
}
public final int getX() {
return 0;
}
}
////////////////////
package test;
import java.lang.System;
@kotlin.Metadata()
@Anno(value = "clazz")
public abstract class Test {
@org.jetbrains.annotations.NotNull()
private java.lang.String v;
@Anno(value = "test-constructor")
protected Test(@org.jetbrains.annotations.NotNull()
@Anno(value = "v-param")
java.lang.String v) {
super();
}
@org.jetbrains.annotations.NotNull()
@Anno(value = "v-get")
public final java.lang.String getV() {
return null;
}
@Anno(value = "v-set")
public final void setV(@org.jetbrains.annotations.NotNull()
@Anno(value = "v-setparam")
java.lang.String p0) {
}
@org.jetbrains.annotations.NotNull()
@Anno(value = "abstract-method")
public abstract java.lang.String abstractMethod();
@org.jetbrains.annotations.NotNull()
public abstract java.lang.String getAbstractVal();
@Anno(value = "abstract-val")
@java.lang.Deprecated()
public static void getAbstractVal$annotations() {
}
@Anno(value = "v-property")
@java.lang.Deprecated()
public static void getV$annotations() {
}
}
@@ -1,5 +1,3 @@
// IGNORE_BACKEND: JVM_IR
@Target(AnnotationTarget.FIELD)
annotation class FieldAnno
@@ -0,0 +1,132 @@
import java.lang.System;
@kotlin.Metadata()
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
public abstract @interface Anno1 {
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
public abstract @interface Anno2 {
public abstract int i() default 5;
public abstract java.lang.String s() default "ABC";
public abstract int[] ii() default {1, 2, 3};
public abstract java.lang.String[] ss() default {"A", "B"};
public abstract Anno1 a();
public abstract Colors color() default Colors.BLACK;
public abstract Colors[] colors() default {Colors.BLACK, Colors.WHITE};
public abstract java.lang.Class<?> clazz();
public abstract java.lang.Class<?>[] classes();
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
public abstract @interface Anno3 {
public abstract java.lang.String value();
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public enum Colors {
/*public static final*/ WHITE /* = new Colors() */,
/*public static final*/ BLACK /* = new Colors() */;
Colors() {
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public enum Enum1 {
/*public static final*/ BLACK /* = new Enum1() */,
@Anno1()
/*public static final*/ WHITE /* = new Enum1() */;
Enum1() {
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
@Anno3(value = "value")
@Anno2(a = @Anno1(), clazz = TestAnno.class, classes = {TestAnno.class, Anno1.class})
@Anno1()
public final class TestAnno {
public TestAnno() {
super();
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
@Anno2(i = 6, s = "BCD", ii = {4, 5, 6}, ss = {"Z", "X"}, a = @Anno1(), color = Colors.WHITE, colors = {Colors.WHITE}, clazz = TestAnno.class, classes = {TestAnno.class, Anno1.class})
@Anno3(value = "value")
public final class TestAnno2 {
@org.jetbrains.annotations.NotNull()
@Anno3(value = "field")
private java.lang.String b = "property initializer";
public TestAnno2() {
super();
}
@Anno1()
public final void a(@org.jetbrains.annotations.NotNull()
@Anno3(value = "param-pam-pam")
java.lang.String param) {
}
@org.jetbrains.annotations.NotNull()
@Anno3(value = "getter")
public final java.lang.String getB() {
return null;
}
@Anno3(value = "setter")
public final void setB(@org.jetbrains.annotations.NotNull()
@Anno3(value = "setparam")
java.lang.String p0) {
}
@Anno3(value = "property")
@java.lang.Deprecated()
public static void getB$annotations() {
}
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
// !KEEP_KDOC_COMMENTS_IN_STUBS
/** Test. */
class Test {
@@ -0,0 +1,153 @@
import java.lang.System;
@kotlin.Metadata()
@java.lang.annotation.Target(value = {})
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY})
public abstract @interface Anno {
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public enum EnumError {
/*public static final*/ One /* = new EnumError() */,
/*public static final*/ Two /* = new EnumError() */;
EnumError() {
}
@org.jetbrains.annotations.NotNull()
public abstract java.lang.String doIt();
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public final class Obj {
@org.jetbrains.annotations.NotNull()
public static final Obj INSTANCE = null;
private Obj() {
super();
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public final class Test {
@org.jetbrains.annotations.NotNull()
public final java.lang.String prop = "";
@org.jetbrains.annotations.NotNull()
private final java.lang.String prop2 = "";
public Test() {
super();
}
public final void method() {
}
public final void method(int a) {
}
public final void method(@org.jetbrains.annotations.NotNull()
java.lang.String a) {
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getProp2() {
return null;
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getProp3() {
return null;
}
public final void setProp3(@org.jetbrains.annotations.NotNull()
java.lang.String v) {
}
@Anno()
@java.lang.Deprecated()
public static void getProp2$annotations() {
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public final class Test2 {
@org.jetbrains.annotations.NotNull()
private final java.lang.String a = null;
public Test2(@org.jetbrains.annotations.NotNull()
java.lang.String a) {
super();
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getA() {
return null;
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public final class Test3 {
@org.jetbrains.annotations.NotNull()
private final java.lang.String a = null;
protected Test3(@org.jetbrains.annotations.NotNull()
java.lang.String a) {
super();
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getA() {
return null;
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public final class Test4 {
public Test4() {
super();
}
public final void method() {
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public abstract interface TestComponent {
}
@@ -0,0 +1,196 @@
import java.lang.System;
@kotlin.Metadata()
@java.lang.annotation.Target(value = {})
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@kotlin.annotation.Target(allowedTargets = {kotlin.annotation.AnnotationTarget.PROPERTY})
public abstract @interface Anno {
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public enum EnumError {
/*public static final*/ One /* = new EnumError() */,
/*public static final*/ Two /* = new EnumError() */;
EnumError() {
}
@org.jetbrains.annotations.NotNull()
public abstract java.lang.String doIt();
}
////////////////////
import java.lang.System;
/**
* Obj.
*/
@kotlin.Metadata()
public final class Obj {
@org.jetbrains.annotations.NotNull()
public static final Obj INSTANCE = null;
private Obj() {
super();
}
}
////////////////////
import java.lang.System;
/**
* Test.
*/
@kotlin.Metadata()
public final class Test {
/**
* prop.
*/
@org.jetbrains.annotations.NotNull()
public final java.lang.String prop = "";
/**
* prop2.
*/
@org.jetbrains.annotations.NotNull()
private final java.lang.String prop2 = "";
public Test() {
super();
}
/**
* method().
*/
public final void method() {
}
/**
* method(int).
*/
public final void method(int a) {
}
/**
* method(String).
*/
public final void method(@org.jetbrains.annotations.NotNull()
java.lang.String a) {
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getProp2() {
return null;
}
/**
* get.
*/
@org.jetbrains.annotations.NotNull()
public final java.lang.String getProp3() {
return null;
}
/**
* set.
*/
public final void setProp3(@org.jetbrains.annotations.NotNull()
java.lang.String v) {
}
/**
* prop2.
*/
@Anno()
@java.lang.Deprecated()
public static void getProp2$annotations() {
}
}
////////////////////
import java.lang.System;
/**
* Test2
* Multiline
* documentation.
*/
@kotlin.Metadata()
public final class Test2 {
@org.jetbrains.annotations.NotNull()
private final java.lang.String a = null;
public Test2(@org.jetbrains.annotations.NotNull()
java.lang.String a) {
super();
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getA() {
return null;
}
}
////////////////////
import java.lang.System;
/**
* constructor.
*/
@kotlin.Metadata()
public final class Test3 {
@org.jetbrains.annotations.NotNull()
private final java.lang.String a = null;
protected Test3(@org.jetbrains.annotations.NotNull()
java.lang.String a) {
super();
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getA() {
return null;
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public final class Test4 {
public Test4() {
super();
}
public final void method() {
}
}
////////////////////
import java.lang.System;
/**
* `/ * Failure * /`
*/
@kotlin.Metadata()
public abstract interface TestComponent {
}
@@ -1,5 +1,3 @@
// IGNORE_BACKEND: JVM_IR
package deprecated
@Deprecated("Deprecated annotation")
@@ -0,0 +1,49 @@
package deprecated;
import java.lang.System;
@kotlin.Metadata()
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.Deprecated()
public abstract @interface Anno {
}
////////////////////
package deprecated;
import java.lang.System;
@kotlin.Metadata()
@Anno()
@java.lang.Deprecated()
public final class Foo {
@java.lang.Deprecated()
private final int prop = 0;
public Foo() {
super();
}
@java.lang.Deprecated()
public final void foo(int a) {
}
@java.lang.Deprecated()
public final int getProp() {
return 0;
}
@java.lang.Deprecated()
public final int getFoo() {
return 0;
}
@java.lang.Deprecated()
public final void setFoo(int value) {
}
@java.lang.Deprecated()
public static void getProp$annotations() {
}
}
@@ -1,5 +1,3 @@
// IGNORE_BACKEND: JVM_IR
class JvmStaticTest {
companion object {
@JvmStatic
@@ -1,5 +1,3 @@
// IGNORE_BACKEND: JVM_IR
class Test {
companion object A {
@JvmStatic
@@ -0,0 +1,36 @@
import java.lang.System;
@kotlin.Metadata()
public final class Test {
@org.jetbrains.annotations.NotNull()
private static final java.lang.String test = "";
@org.jetbrains.annotations.NotNull()
public static final Test.A A = null;
public Test() {
super();
}
@org.jetbrains.annotations.NotNull()
public static final java.lang.String getTest() {
return null;
}
@kotlin.Metadata()
public static final class A {
private A() {
super();
}
@org.jetbrains.annotations.NotNull()
public final java.lang.String getTest() {
return null;
}
@kotlin.jvm.JvmStatic()
@java.lang.Deprecated()
public static void getTest$annotations() {
}
}
}
@@ -0,0 +1,70 @@
import java.lang.System;
@kotlin.Metadata()
public abstract interface FooComponent {
@org.jetbrains.annotations.NotNull()
public static final FooComponent.Companion Companion = null;
@org.jetbrains.annotations.NotNull()
@kotlin.jvm.JvmStatic()
public static java.lang.String create(@org.jetbrains.annotations.NotNull()
java.lang.String context) {
return null;
}
@kotlin.Metadata()
public static final class Companion {
private Companion() {
super();
}
@org.jetbrains.annotations.NotNull()
@kotlin.jvm.JvmStatic()
public final java.lang.String create(@org.jetbrains.annotations.NotNull()
java.lang.String context) {
return null;
}
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public final class JvmStaticTest {
private static final int one = 1;
public static final int two = 2;
public static final char c = 'C';
public final byte three = (byte)3;
public final char d = 'D';
@org.jetbrains.annotations.NotNull()
public static final JvmStaticTest.Companion Companion = null;
public JvmStaticTest() {
super();
}
public static final int getOne() {
return 0;
}
@kotlin.Metadata()
public static final class Companion {
private Companion() {
super();
}
public final int getOne() {
return 0;
}
@kotlin.jvm.JvmStatic()
@java.lang.Deprecated()
public static void getOne$annotations() {
}
}
}
@@ -1,5 +1,3 @@
// IGNORE_BACKEND: JVM_IR
annotation class Anno
@Target(AnnotationTarget.PROPERTY, AnnotationTarget.CLASS)