Make diagnostic about redundant spread in @Foo(s = *[A]) more clear
This commit is contained in:
@@ -667,6 +667,7 @@ public interface Errors {
|
||||
DiagnosticFactory1<KtExpression, KotlinType> ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR = DiagnosticFactory1.create(ERROR);
|
||||
DiagnosticFactory0<KtExpression> ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION = DiagnosticFactory0.create(WARNING);
|
||||
DiagnosticFactory0<KtExpression> ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR = DiagnosticFactory0.create(ERROR);
|
||||
DiagnosticFactory0<KtExpression> REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION = DiagnosticFactory0.create(WARNING);
|
||||
|
||||
// Call resolution
|
||||
|
||||
|
||||
+1
@@ -783,6 +783,7 @@ public class DefaultErrorMessages {
|
||||
MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR, "Assigning single elements to varargs in named form is forbidden", TO_STRING);
|
||||
MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, "Assigning single elements to varargs in named form is deprecated");
|
||||
MAP.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR, "Assigning single elements to varargs in named form is forbidden");
|
||||
MAP.put(REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION, "Redundant spread (*) operator");
|
||||
|
||||
MAP.put(CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS, "Cannot create an instance of an abstract class");
|
||||
|
||||
|
||||
+5
-10
@@ -66,19 +66,15 @@ class AssigningNamedArgumentToVarargChecker : CallChecker {
|
||||
argumentExpression: KtExpression,
|
||||
context: ResolutionContext<*>
|
||||
) {
|
||||
fun report(onlyWarning: Boolean = false) {
|
||||
reportMigrationDiagnostic(migrationDiagnosticsForAnnotation, context, onlyWarning) { diagnostic ->
|
||||
context.trace.report(diagnostic.on(argumentExpression))
|
||||
}
|
||||
}
|
||||
|
||||
if (isArrayOrArrayLiteral(argument, context.trace)) {
|
||||
if (argument.hasSpread()) {
|
||||
// We want to make calls @Foo(value = [A]) and @Foo(value = *[A]) equivalent
|
||||
report(onlyWarning = true)
|
||||
context.trace.report(Errors.REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION.on(argumentExpression))
|
||||
}
|
||||
} else {
|
||||
report()
|
||||
reportMigrationDiagnostic(migrationDiagnosticsForAnnotation, context) { diagnostic ->
|
||||
context.trace.report(diagnostic.on(argumentExpression))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -100,11 +96,10 @@ class AssigningNamedArgumentToVarargChecker : CallChecker {
|
||||
private inline fun <T : DiagnosticFactory<*>> reportMigrationDiagnostic(
|
||||
migrationDiagnostics: MigrationDiagnostics<T>,
|
||||
context: ResolutionContext<*>,
|
||||
onlyWarning: Boolean = false,
|
||||
report: (T) -> Unit
|
||||
) {
|
||||
val (warning, error) = migrationDiagnostics
|
||||
if (!onlyWarning && context.languageVersionSettings.supportsFeature(ProhibitAssigningSingleElementsToVarargsInNamedForm)) {
|
||||
if (context.languageVersionSettings.supportsFeature(ProhibitAssigningSingleElementsToVarargsInNamedForm)) {
|
||||
report(error)
|
||||
} else {
|
||||
report(warning)
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ fun test1_2() {}
|
||||
@Ann2(*[])
|
||||
fun test2() {}
|
||||
|
||||
@Ann3(a = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR!>[0f, <!DIVISION_BY_ZERO!>1 / 0f<!>]<!>)
|
||||
@Ann3(a = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION!>[0f, <!DIVISION_BY_ZERO!>1 / 0f<!>]<!>)
|
||||
fun test3() {}
|
||||
|
||||
@Ann5(Ann4(*["/"]))
|
||||
|
||||
Vendored
+1
-1
@@ -19,7 +19,7 @@ fun foo3() {}
|
||||
@Anno(value = <!ANNOTATION_ARGUMENT_IS_NON_CONST!>[<!ANNOTATION_ARGUMENT_IS_NON_CONST!>nonConstLong()<!>]<!>)
|
||||
fun foo4() {}
|
||||
|
||||
@Anno(value = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
@Anno(value = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION, ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
fun bar1() {}
|
||||
|
||||
@Anno(*<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
|
||||
+1
-1
@@ -19,7 +19,7 @@ fun foo3() {}
|
||||
@Anno(value = <!NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION!>[<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstLong()<!>]<!>)
|
||||
fun foo4() {}
|
||||
|
||||
@Anno(value = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
@Anno(value = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION, ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
fun bar1() {}
|
||||
|
||||
@Anno(*<!ANNOTATION_ARGUMENT_MUST_BE_CONST!>nonConstArray<!>)
|
||||
|
||||
+2
-2
@@ -14,10 +14,10 @@ annotation class Ann(vararg val s: String)
|
||||
@Ann(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR!>"value"<!>)
|
||||
fun test1() {}
|
||||
|
||||
@Ann(s = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION!>arrayOf("value")<!>)
|
||||
@Ann(s = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION!>arrayOf("value")<!>)
|
||||
fun test2() {}
|
||||
|
||||
@Ann(s = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION!>["value"]<!>)
|
||||
@Ann(s = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION!>["value"]<!>)
|
||||
fun test3() {}
|
||||
|
||||
@JavaAnn(value = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR!>"value"<!>)
|
||||
|
||||
+2
-2
@@ -14,10 +14,10 @@ annotation class Ann(vararg val s: String)
|
||||
@Ann(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION!>"value"<!>)
|
||||
fun test1() {}
|
||||
|
||||
@Ann(s = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION!>arrayOf("value")<!>)
|
||||
@Ann(s = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION!>arrayOf("value")<!>)
|
||||
fun test2() {}
|
||||
|
||||
@Ann(s = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION!>["value"]<!>)
|
||||
@Ann(s = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION!>["value"]<!>)
|
||||
fun test3() {}
|
||||
|
||||
@JavaAnn(value = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION!>"value"<!>)
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ annotation class Anno1(vararg val s: String)
|
||||
annotation class Anno2(vararg val i: Int)
|
||||
|
||||
@Anno1(s = <!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION_ERROR!>"foo"<!>)
|
||||
@Anno2(i = *<!ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION!>intArrayOf(1)<!>)
|
||||
@Anno2(i = *<!REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION!>intArrayOf(1)<!>)
|
||||
fun f1() {}
|
||||
|
||||
@Anno1(s = ["foo"])
|
||||
|
||||
@@ -549,6 +549,8 @@ class QuickFixRegistrar : QuickFixContributor {
|
||||
ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.registerFactory(SurroundWithArrayOfWithSpreadOperatorInFunctionFix)
|
||||
ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION_ERROR.registerFactory(SurroundWithArrayOfWithSpreadOperatorInFunctionFix)
|
||||
|
||||
REDUNDANT_SPREAD_OPERATOR_IN_NAMED_FORM_IN_ANNOTATION.registerFactory(ReplaceWithArrayCallInAnnotationFix)
|
||||
|
||||
JAVA_MODULE_DOES_NOT_DEPEND_ON_MODULE.registerFactory(KotlinAddRequiredModuleFix)
|
||||
|
||||
JVM_DEFAULT_REQUIRED_FOR_OVERRIDE.registerFactory(AddJvmDefaultAnnotation)
|
||||
|
||||
Reference in New Issue
Block a user