Deprecate java.lang.Class as annotation parameter

This commit is contained in:
Denis Zharkov
2015-04-20 15:27:52 +03:00
parent fa2af69942
commit fc5236244b
17 changed files with 91 additions and 2 deletions
@@ -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);
@@ -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,3 +1,4 @@
// !DIAGNOSTICS: -JAVA_LANG_CLASS_PARAMETER_IN_ANNOTATION
package test
annotation class AnnClass(val a: Class<*>)
@@ -0,0 +1,11 @@
package test
import kotlin.reflect.KClass
annotation class AnnClass(val a: KClass<*>)
class MyClass {
AnnClass(MyClass::class) companion object {
}
}
@@ -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,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,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,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");
@@ -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()