Deprecate java.lang.Class as annotation parameter
This commit is contained in:
+1
-2
@@ -35,6 +35,7 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
|
||||
import org.jetbrains.kotlin.types.JetType
|
||||
import org.jetbrains.kotlin.types.typeUtil.isArrayOfJavaLangClass
|
||||
import org.jetbrains.kotlin.types.typeUtil.isJavaLangClass
|
||||
import org.jetbrains.kotlin.types.typeUtil.isJavaLangClassOrArray
|
||||
|
||||
public class JavaAnnotationCallChecker : CallChecker {
|
||||
override fun <F : CallableDescriptor?> check(resolvedCall: ResolvedCall<F>, context: BasicCallResolutionContext) {
|
||||
@@ -55,8 +56,6 @@ public class JavaAnnotationCallChecker : CallChecker {
|
||||
}
|
||||
}
|
||||
|
||||
private fun JetType.isJavaLangClassOrArray() = isJavaLangClass() || isArrayOfJavaLangClass()
|
||||
|
||||
private fun reportErrorsOnPositionedArguments(
|
||||
resolvedCall: ResolvedCall<*>,
|
||||
context: BasicCallResolutionContext
|
||||
|
||||
@@ -123,6 +123,7 @@ public interface Errors {
|
||||
DiagnosticFactory0<PsiElement> ANNOTATION_CLASS_WITH_BODY = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<JetTypeReference> INVALID_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<JetTypeReference> NULLABLE_TYPE_OF_ANNOTATION_MEMBER = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<JetTypeReference> JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION = DiagnosticFactory0.create(WARNING);
|
||||
DiagnosticFactory0<JetModifierListOwner> ILLEGAL_ANNOTATION_KEYWORD = DiagnosticFactory0
|
||||
.create(ERROR, modifierSetPosition(JetTokens.ANNOTATION_KEYWORD));
|
||||
DiagnosticFactory0<JetExpression> ANNOTATION_PARAMETER_MUST_BE_CONST = DiagnosticFactory0.create(ERROR);
|
||||
|
||||
+1
@@ -565,6 +565,7 @@ public class DefaultErrorMessages {
|
||||
MAP.put(ANNOTATION_CLASS_WITH_BODY, "Body is not allowed for annotation class");
|
||||
MAP.put(INVALID_TYPE_OF_ANNOTATION_MEMBER, "Invalid type of annotation member");
|
||||
MAP.put(NULLABLE_TYPE_OF_ANNOTATION_MEMBER, "An annotation parameter cannot be nullable");
|
||||
MAP.put(JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION, "java.lang.Class as annotation parameter is deprecated. Use KClass instead");
|
||||
MAP.put(ILLEGAL_ANNOTATION_KEYWORD, "''annotation'' keyword is only applicable for class");
|
||||
MAP.put(ANNOTATION_PARAMETER_MUST_BE_CONST, "An annotation parameter must be a compile-time constant");
|
||||
MAP.put(ANNOTATION_PARAMETER_MUST_BE_ENUM_CONST, "An enum annotation parameter must be a enum constant");
|
||||
|
||||
@@ -35,12 +35,14 @@ import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluat
|
||||
import org.jetbrains.kotlin.types.JetType;
|
||||
import org.jetbrains.kotlin.types.TypeProjection;
|
||||
import org.jetbrains.kotlin.types.TypeUtils;
|
||||
import org.jetbrains.kotlin.types.typeUtil.TypeUtilPackage;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.jetbrains.kotlin.diagnostics.Errors.INVALID_TYPE_OF_ANNOTATION_MEMBER;
|
||||
import static org.jetbrains.kotlin.diagnostics.Errors.JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION;
|
||||
import static org.jetbrains.kotlin.diagnostics.Errors.NULLABLE_TYPE_OF_ANNOTATION_MEMBER;
|
||||
import static org.jetbrains.kotlin.resolve.BindingContext.VALUE_PARAMETER;
|
||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isAnnotationClass;
|
||||
@@ -68,6 +70,9 @@ public class CompileTimeConstantUtils {
|
||||
else if (!isAcceptableTypeForAnnotationParameter(parameterType)) {
|
||||
trace.report(INVALID_TYPE_OF_ANNOTATION_MEMBER.on(typeReference));
|
||||
}
|
||||
else if (TypeUtilPackage.isJavaLangClassOrArray(parameterType)) {
|
||||
trace.report(JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION.on(typeReference));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
annotation class Ann(
|
||||
val x1: <!JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION!>Class<*><!>,
|
||||
val x2: <!JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION!>Class<in String?><!>,
|
||||
val x3: <!JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION!>Class<out String?><!>,
|
||||
val x4: <!JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION!>java.lang.Class<*><!>,
|
||||
val x5: <!JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION!>Array<Class<*>><!>,
|
||||
val x6: <!JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION!>Array<in Class<*>><!>,
|
||||
val x7: <!JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION!>Array<out Class<*>><!>,
|
||||
vararg val x8: <!JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION!>Class<*><!>
|
||||
)
|
||||
@@ -0,0 +1,16 @@
|
||||
package
|
||||
|
||||
internal final annotation class Ann : kotlin.Annotation {
|
||||
public constructor Ann(/*0*/ x1: java.lang.Class<*>, /*1*/ x2: java.lang.Class<in kotlin.String?>, /*2*/ x3: java.lang.Class<out kotlin.String?>, /*3*/ x4: java.lang.Class<*>, /*4*/ x5: kotlin.Array<java.lang.Class<*>>, /*5*/ x6: kotlin.Array<in java.lang.Class<*>>, /*6*/ x7: kotlin.Array<out java.lang.Class<*>>, /*7*/ vararg x8: java.lang.Class<*> /*kotlin.Array<out java.lang.Class<*>>*/)
|
||||
internal final val x1: java.lang.Class<*>
|
||||
internal final val x2: java.lang.Class<in kotlin.String?>
|
||||
internal final val x3: java.lang.Class<out kotlin.String?>
|
||||
internal final val x4: java.lang.Class<*>
|
||||
internal final val x5: kotlin.Array<java.lang.Class<*>>
|
||||
internal final val x6: kotlin.Array<in java.lang.Class<*>>
|
||||
internal final val x7: kotlin.Array<out java.lang.Class<*>>
|
||||
internal final val x8: kotlin.Array<out java.lang.Class<*>>
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
// !DIAGNOSTICS: -JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION
|
||||
package test
|
||||
|
||||
import java.lang.annotation.RetentionPolicy
|
||||
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// !DIAGNOSTICS: -JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION
|
||||
package test
|
||||
|
||||
annotation class AnnClass(val a: Class<*>)
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
package test
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
annotation class AnnClass(val a: KClass<*>)
|
||||
|
||||
class MyClass {
|
||||
|
||||
AnnClass(MyClass::class) companion object {
|
||||
}
|
||||
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
package
|
||||
|
||||
package test {
|
||||
|
||||
internal final annotation class AnnClass : kotlin.Annotation {
|
||||
public constructor AnnClass(/*0*/ a: kotlin.reflect.KClass<*>)
|
||||
internal final val a: kotlin.reflect.KClass<*>
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
internal final class MyClass {
|
||||
public constructor MyClass()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
test.AnnClass(a = test.MyClass::class: kotlin.reflect.KClass<test.MyClass>) internal companion object Companion {
|
||||
private constructor Companion()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
}
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// !DIAGNOSTICS: -JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION
|
||||
annotation class Ann(val i: IntArray)
|
||||
|
||||
Ann(intArrayOf(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i<!>))
|
||||
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// !DIAGNOSTICS: -JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION
|
||||
annotation class AnnC(val c: Class<*>)
|
||||
|
||||
AnnC(<!ANNOTATION_PARAMETER_MUST_BE_CLASS_LITERAL!>c<!>)
|
||||
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// !DIAGNOSTICS: -JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION
|
||||
annotation class Ann(vararg val i: Int)
|
||||
|
||||
Ann(<!ANNOTATION_PARAMETER_MUST_BE_CONST!>i<!>)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
// !DIAGNOSTICS: -JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION
|
||||
package a.b.c
|
||||
|
||||
kotlin.deprecated("aaa")
|
||||
|
||||
@@ -681,6 +681,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("deprecatedJavaLangClass.kt")
|
||||
public void testDeprecatedJavaLangClass() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/deprecatedJavaLangClass.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("invalidTypesInAnnotationConstructor.kt")
|
||||
public void testInvalidTypesInAnnotationConstructor() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/invalidTypesInAnnotationConstructor.kt");
|
||||
|
||||
+6
@@ -55,6 +55,12 @@ public class JetDiagnosticsTestWithStdLibGenerated extends AbstractJetDiagnostic
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("ClassObjectAnnotatedWithItsKClass.kt")
|
||||
public void testClassObjectAnnotatedWithItsKClass() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/ClassObjectAnnotatedWithItsKClass.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("qualifiedCallValue.kt")
|
||||
public void testQualifiedCallValue() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithStdLib/annotations/qualifiedCallValue.kt");
|
||||
|
||||
@@ -95,3 +95,5 @@ public fun JetType.isJavaLangClass(): Boolean {
|
||||
|
||||
public fun JetType.isArrayOfJavaLangClass(): Boolean =
|
||||
KotlinBuiltIns.isArray(this) && getArguments().firstOrNull()?.getType()?.isJavaLangClass() ?: false
|
||||
|
||||
public fun JetType.isJavaLangClassOrArray(): Boolean = isJavaLangClass() || isArrayOfJavaLangClass()
|
||||
|
||||
Reference in New Issue
Block a user