Drop support of java.lang.Class as annotation parameter
Also drop some related diagnostics and testData
This commit is contained in:
-13
@@ -33,9 +33,6 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument
|
||||
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) {
|
||||
@@ -44,16 +41,6 @@ public class JavaAnnotationCallChecker : CallChecker {
|
||||
resultingDescriptor.getContainingDeclaration().getKind() != ClassKind.ANNOTATION_CLASS) return
|
||||
|
||||
reportErrorsOnPositionedArguments(resolvedCall, context)
|
||||
reportWarningOnJavaClassUsages(resolvedCall, context)
|
||||
}
|
||||
|
||||
private fun reportWarningOnJavaClassUsages(
|
||||
resolvedCall: ResolvedCall<*>,
|
||||
context: BasicCallResolutionContext
|
||||
) {
|
||||
resolvedCall.getValueArguments().filter { it.getKey().getType().isJavaLangClassOrArray() }.forEach {
|
||||
reportOnValueArgument(context, it, ErrorsJvm.JAVA_LANG_CLASS_ARGUMENT_IN_ANNOTATION)
|
||||
}
|
||||
}
|
||||
|
||||
private fun reportErrorsOnPositionedArguments(
|
||||
|
||||
-1
@@ -57,7 +57,6 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension {
|
||||
MAP.put(ErrorsJvm.NATIVE_DECLARATION_CANNOT_BE_INLINED, "Members of interfaces can not be inlined");
|
||||
|
||||
MAP.put(ErrorsJvm.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION, "Only named arguments are available for Java annotations");
|
||||
MAP.put(ErrorsJvm.JAVA_LANG_CLASS_ARGUMENT_IN_ANNOTATION, "Usage of `javaClass<T>()` in annotations is deprecated. Use T::class instead");
|
||||
MAP.put(ErrorsJvm.DEPRECATED_ANNOTATION_METHOD_CALL, "Annotation methods are deprecated. Use property instead");
|
||||
|
||||
MAP.put(ErrorsJvm.NO_REFLECTION_IN_CLASS_PATH, "Expression ''{0}'' uses reflection which is not found in compilation classpath. " +
|
||||
|
||||
@@ -52,7 +52,6 @@ public interface ErrorsJvm {
|
||||
DiagnosticFactory0<JetDeclaration> NATIVE_DECLARATION_CANNOT_BE_INLINED = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE);
|
||||
|
||||
DiagnosticFactory0<JetExpression> POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<JetExpression> JAVA_LANG_CLASS_ARGUMENT_IN_ANNOTATION = DiagnosticFactory0.create(WARNING);
|
||||
DiagnosticFactory0<JetElement> DEPRECATED_ANNOTATION_METHOD_CALL = DiagnosticFactory0.create(WARNING);
|
||||
|
||||
DiagnosticFactory0<JetElement> TRAIT_CANT_CALL_DEFAULT_METHOD_VIA_SUPER = DiagnosticFactory0.create(ERROR);
|
||||
|
||||
@@ -128,7 +128,6 @@ public interface Errors {
|
||||
DiagnosticFactory0<JetModifierListOwner> ILLEGAL_ANNOTATION_KEYWORD = DiagnosticFactory0
|
||||
.create(ERROR, modifierSetPosition(JetTokens.ANNOTATION_KEYWORD));
|
||||
DiagnosticFactory0<JetExpression> ANNOTATION_PARAMETER_MUST_BE_CONST = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<JetExpression> ANNOTATION_PARAMETER_MUST_BE_CLASS_LITERAL = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<JetExpression> ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<JetExpression> ANNOTATION_PARAMETER_MUST_BE_ENUM_CONST = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<JetExpression> ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT = DiagnosticFactory0.create(ERROR);
|
||||
|
||||
-1
@@ -607,7 +607,6 @@ public class DefaultErrorMessages {
|
||||
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");
|
||||
MAP.put(ANNOTATION_PARAMETER_MUST_BE_CLASS_LITERAL, "An annotation parameter must be a `javaClass<T>()` call");
|
||||
MAP.put(ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL, "An annotation parameter must be a class literal (T::class)");
|
||||
MAP.put(ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT, "Default value of annotation parameter must be a compile-time constant");
|
||||
|
||||
|
||||
@@ -289,9 +289,6 @@ public class AnnotationResolver {
|
||||
if (descriptor != null && DescriptorUtils.isEnumClass(descriptor)) {
|
||||
trace.report(Errors.ANNOTATION_PARAMETER_MUST_BE_ENUM_CONST.on(argumentExpression));
|
||||
}
|
||||
else if (descriptor instanceof ClassDescriptor && DescriptorUtils.isJavaLangClass((ClassDescriptor) descriptor)) {
|
||||
trace.report(Errors.ANNOTATION_PARAMETER_MUST_BE_CLASS_LITERAL.on(argumentExpression));
|
||||
}
|
||||
else if (descriptor instanceof ClassDescriptor && KotlinBuiltIns.isKClass((ClassDescriptor) descriptor)) {
|
||||
trace.report(Errors.ANNOTATION_PARAMETER_MUST_BE_KCLASS_LITERAL.on(argumentExpression));
|
||||
}
|
||||
|
||||
@@ -70,9 +70,6 @@ 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -86,7 +83,6 @@ public class CompileTimeConstantUtils {
|
||||
KotlinBuiltIns builtIns = KotlinBuiltIns.getInstance();
|
||||
if (isEnumClass(typeDescriptor) ||
|
||||
isAnnotationClass(typeDescriptor) ||
|
||||
DescriptorUtils.isJavaLangClass(typeDescriptor) ||
|
||||
KotlinBuiltIns.isKClass(typeDescriptor) ||
|
||||
KotlinBuiltIns.isPrimitiveArray(parameterType) ||
|
||||
KotlinBuiltIns.isPrimitiveType(parameterType) ||
|
||||
@@ -105,7 +101,6 @@ public class CompileTimeConstantUtils {
|
||||
if (arrayTypeDescriptor != null) {
|
||||
return isEnumClass(arrayTypeDescriptor) ||
|
||||
isAnnotationClass(arrayTypeDescriptor) ||
|
||||
DescriptorUtils.isJavaLangClass(arrayTypeDescriptor) ||
|
||||
KotlinBuiltIns.isKClass(arrayTypeDescriptor) ||
|
||||
builtIns.getStringType().equals(arrayType);
|
||||
}
|
||||
@@ -131,10 +126,6 @@ public class CompileTimeConstantUtils {
|
||||
return ARRAY_CALL_NAMES.contains(DescriptorUtils.getFqName(resolvedCall.getCandidateDescriptor()).asString());
|
||||
}
|
||||
|
||||
public static boolean isJavaClassMethodCall(@NotNull ResolvedCall<?> resolvedCall) {
|
||||
return "kotlin.javaClass.function".equals(getIntrinsicAnnotationArgument(resolvedCall.getResultingDescriptor().getOriginal()));
|
||||
}
|
||||
|
||||
public static boolean canBeReducedToBooleanConstant(
|
||||
@Nullable JetExpression expression,
|
||||
@NotNull BindingTrace trace,
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
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<*><!>
|
||||
)
|
||||
@@ -1,16 +0,0 @@
|
||||
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
|
||||
}
|
||||
+3
-3
@@ -26,16 +26,16 @@ annotation class Ann4(val p1: IntArray,
|
||||
|
||||
annotation class Ann5(val p1: MyEnum)
|
||||
|
||||
annotation class Ann6(val p: Class<*>)
|
||||
annotation class Ann6(val p: <!INVALID_TYPE_OF_ANNOTATION_MEMBER!>Class<*><!>)
|
||||
annotation class Ann7(val p: RetentionPolicy)
|
||||
|
||||
annotation class Ann8(val p1: Array<String>,
|
||||
val p2: Array<Class<*>>,
|
||||
val p2: <!INVALID_TYPE_OF_ANNOTATION_MEMBER!>Array<Class<*>><!>,
|
||||
val p3: Array<MyEnum>,
|
||||
val p4: Array<Ann1>)
|
||||
|
||||
annotation class Ann9(vararg val p1: String,
|
||||
vararg val p2: Class<*>,
|
||||
vararg val p2: <!INVALID_TYPE_OF_ANNOTATION_MEMBER!>Class<*><!>,
|
||||
vararg val p3: MyEnum,
|
||||
vararg val p4: Ann1,
|
||||
vararg val p5: Int)
|
||||
|
||||
@@ -747,12 +747,6 @@ 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("extensionFunctionType.kt")
|
||||
public void testExtensionFunctionType() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/annotations/extensionFunctionType.kt");
|
||||
|
||||
@@ -541,8 +541,4 @@ public class DescriptorUtils {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isJavaLangClass(ClassDescriptor descriptor) {
|
||||
return "java.lang.Class".equals(getFqName(descriptor).asString());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,18 +86,6 @@ fun JetType.replaceAnnotations(newAnnotations: Annotations): JetType {
|
||||
}
|
||||
}
|
||||
|
||||
public fun JetType.isJavaLangClass(): Boolean {
|
||||
val classifier = getConstructor().getDeclarationDescriptor()
|
||||
|
||||
if (classifier !is ClassDescriptor) return false
|
||||
return DescriptorUtils.isJavaLangClass(classifier)
|
||||
}
|
||||
|
||||
public fun JetType.isArrayOfJavaLangClass(): Boolean =
|
||||
KotlinBuiltIns.isArray(this) && getArguments().firstOrNull()?.getType()?.isJavaLangClass() ?: false
|
||||
|
||||
public fun JetType.isJavaLangClassOrArray(): Boolean = isJavaLangClass() || isArrayOfJavaLangClass()
|
||||
|
||||
public fun JetTypeChecker.equalTypesOrNulls(type1: JetType?, type2: JetType?): Boolean {
|
||||
if (type1 identityEquals type2) return true
|
||||
if (type1 == null || type2 == null) return false
|
||||
|
||||
Reference in New Issue
Block a user