1 /* 2 * Copyright 2022 Google LLC 3 * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 // TEST PROCESSOR: AnnotationDefaultValuesProcessor 19 // EXPECTED: 20 // KotlinAnnotation -> b:default,kClassValue:Array<Array<InnerObj>>,topLevelProp:foo,companionProp:companion 21 // JavaAnnotation -> withDefaultValue:OK,nested:@Nested 22 // JavaAnnotation2 -> x:x-default,y:y-default,z:z-default 23 // KotlinAnnotation2 -> y:y-default,z:z-default,kotlinEnumVal:VALUE_1 24 // KotlinAnnotationLib -> b:defaultInLib,kClassValue:OtherKotlinAnnotation,topLevelProp:bar 25 // JavaAnnotationWithDefaults -> stringVal:foo,stringArrayVal:[x, y],typeVal:HashMap<*, *>,typeArrayVal:[LinkedHashMap<*, *>],intVal:3,intArrayVal:[1, 3, 5],enumVal:JavaEnum.DEFAULT,enumArrayVal:[JavaEnum.VAL1, JavaEnum.VAL2],localEnumVal:JavaAnnotationWithDefaults.LocalEnum.LOCAL1,otherAnnotationVal:@OtherAnnotation,otherAnnotationArrayVal:[@OtherAnnotation],kotlinAnnotationLibVal:@OtherKotlinAnnotation 26 // KotlinAnnotationWithDefaults -> stringVal:foo,stringArrayVal:[x, y],typeVal:HashMap<*, *>,typeArrayVal:[LinkedHashMap<*, *>],intVal:3,intArrayVal:[1, 3, 5],enumVal:JavaEnum.DEFAULT,enumArrayVal:[JavaEnum.VAL1, JavaEnum.VAL2],otherAnnotationVal:@OtherAnnotation,otherAnnotationArrayVal:[@OtherAnnotation],kotlinAnnotationLibVal:@OtherKotlinAnnotation 27 // KotlinAnnotation -> b:default,kClassValue:Array<Array<InnerObj>>,topLevelProp:foo,companionProp:companion 28 // JavaAnnotation -> withDefaultValue:OK,nested:@Nested 29 // JavaAnnotation2 -> x:x-default,y:y-default,z:z-default 30 // KotlinAnnotation2 -> y:y-default,z:z-default,kotlinEnumVal:VALUE_1 31 // END 32 // MODULE: lib 33 // FILE: Default.kt 34 const val Bar = "bar" 35 annotation class KotlinAnnotationLib(val a: String, val b: String = "defaultInLib", val kClassValue: kotlin.reflect.KClass<*> = OtherKotlinAnnotation::class, val topLevelProp:String = Bar) 36 37 annotation class OtherKotlinAnnotation(val b: String = "otherKotlinAnnotationDefault") 38 39 // FILE: JavaEnum.java 40 public enum JavaEnum { 41 VAL1, 42 VAL2, 43 DEFAULT 44 } 45 46 // FILE: OtherAnnotation.java 47 import java.lang.annotation.Retention; 48 import java.lang.annotation.RetentionPolicy; 49 @Retention(RetentionPolicy.RUNTIME) 50 public @interface OtherAnnotation { 51 String value(); 52 } 53 54 // FILE: JavaAnnotationWithDefaults.java 55 import java.util.HashMap; 56 import java.util.LinkedHashMap; 57 public @interface JavaAnnotationWithDefaults { 58 String stringVal() default "foo"; 59 String[] stringArrayVal() default {"x", "y"}; 60 Class<?> typeVal() default HashMap.class; 61 Class[] typeArrayVal() default {LinkedHashMap.class}; 62 int intVal() default 3; 63 int[] intArrayVal() default {1, 3, 5}; 64 JavaEnum enumVal() default JavaEnum.DEFAULT; 65 JavaEnum[] enumArrayVal() default {JavaEnum.VAL1, JavaEnum.VAL2}; 66 LocalEnum localEnumVal() default LocalEnum.LOCAL1; 67 OtherAnnotation otherAnnotationVal() default @OtherAnnotation("def"); 68 OtherAnnotation[] otherAnnotationArrayVal() default {@OtherAnnotation("v1")}; 69 OtherKotlinAnnotation kotlinAnnotationLibVal() default @OtherKotlinAnnotation(b = "JavaAnnotationWithDefaults"); 70 enum LocalEnum { 71 LOCAL1, 72 LOCAL2 73 } 74 } 75 76 // FILE: KotlinAnnotationWithDefaults.kt 77 import kotlin.reflect.KClass 78 79 annotation class KotlinAnnotationWithDefaults( 80 val stringVal: String = "foo", 81 val stringArrayVal: Array<String> = ["x", "y"], 82 val typeVal: KClass<*> = java.util.HashMap::class, 83 val typeArrayVal: Array<KClass<*>> = [java.util.LinkedHashMap::class], 84 val intVal: Int = 3, 85 val intArrayVal: IntArray = [1, 3, 5], 86 val enumVal: JavaEnum = JavaEnum.DEFAULT, 87 val enumArrayVal: Array<JavaEnum> = [JavaEnum.VAL1, JavaEnum.VAL2], 88 val otherAnnotationVal: OtherAnnotation = OtherAnnotation("def"), 89 val otherAnnotationArrayVal: Array<OtherAnnotation> = [OtherAnnotation("v1")], 90 val kotlinAnnotationLibVal: OtherKotlinAnnotation = OtherKotlinAnnotation("1") 91 ) 92 // MODULE: main(lib) 93 // FILE: Const.kt 94 const val Foo = "foo" 95 const val DebugKt = "debugKt" 96 97 class Container { 98 companion object { 99 const val comp = "companion" 100 } 101 } 102 103 // FILE: a.kt 104 import test.KotlinEnum 105 import Container.Companion.comp 106 107 108 annotation class KotlinAnnotation(val a: String, val b:String = "default", val kClassValue: kotlin.reflect.KClass<*> = Array<Array<InnerObj>>::class, val topLevelProp: String = Foo, val companionProp: String = comp) { 109 object InnerObj 110 } 111 annotation class KotlinAnnotation2(val x: String, val y:String = "y-default", val z:String = "z-default", val kotlinEnumVal: KotlinEnum = KotlinEnum.VALUE_1) 112 113 @KotlinAnnotation(DebugKt) 114 @JavaAnnotation("debug") 115 @JavaAnnotation2(y="y-kotlin", x="x-kotlin") 116 @KotlinAnnotation2(y="y-kotlin", x="x-kotlin") 117 @KotlinAnnotationLib("debugLibKt") 118 @JavaAnnotationWithDefaults 119 @KotlinAnnotationWithDefaults 120 class A 121 122 // FILE: test.kt 123 package test 124 125 enum class KotlinEnum { 126 VALUE_1, 127 VALUE2 128 } 129 130 // FILE: JavaAnnotation.java 131 public @interface JavaAnnotation { 132 String debug(); 133 String withDefaultValue() default "OK"; 134 @interface Nested { 135 String nestedX() default "nested"; 136 } 137 Nested nested() default @Nested(); 138 } 139 140 // FILE: JavaAnnotation2.java 141 public @interface JavaAnnotation2 { 142 String x() default "x-default"; 143 String y() default "y-default"; 144 String z() default "z-default"; 145 } 146 147 // FILE: JavaAnnotated.java 148 149 @KotlinAnnotation(ConstKt.DebugKt) 150 @JavaAnnotation("debugJava2") 151 @JavaAnnotation2(y="y-java", x="x-java") 152 @KotlinAnnotation2(y="y-java", x="x-java") 153 public class JavaAnnotated { 154 155 } 156