Report NON_VARARG_SPREAD on missed cases

^KT-48162 Fixed
This commit is contained in:
Victor Petukhov
2021-09-28 17:50:24 +03:00
parent 71ceffefb5
commit d9c50f0fda
14 changed files with 110 additions and 15 deletions
@@ -755,7 +755,7 @@ public interface Errors {
}
DiagnosticFactory0<KtExpression> VARARG_OUTSIDE_PARENTHESES = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<LeafPsiElement> NON_VARARG_SPREAD = DiagnosticFactory0.create(ERROR);
DiagnosticFactoryForDeprecation0<LeafPsiElement> NON_VARARG_SPREAD = DiagnosticFactoryForDeprecation0.create(LanguageFeature.ReportNonVarargSpreadOnGenericCalls);
DiagnosticFactory0<LeafPsiElement> SPREAD_OF_NULLABLE = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<LeafPsiElement> SPREAD_OF_LAMBDA_OR_CALLABLE_REFERENCE = DiagnosticFactory0.create(ERROR);
@@ -280,9 +280,19 @@ class DiagnosticReporterByTrackingStrategy(
override fun onCallArgumentSpread(callArgument: KotlinCallArgument, diagnostic: KotlinCallDiagnostic) {
when (diagnostic.javaClass) {
NonVarargSpread::class.java -> {
val spreadElement = callArgument.safeAs<ExpressionKotlinCallArgumentImpl>()?.valueArgument?.getSpreadElement()
if (spreadElement != null) {
trace.report(NON_VARARG_SPREAD.on(spreadElement))
val castedPsiCallArgument = callArgument.safeAs<PSIKotlinCallArgument>()
val castedCallArgument = callArgument.safeAs<ExpressionKotlinCallArgumentImpl>()
if (castedCallArgument != null) {
val spreadElement = castedCallArgument.valueArgument.getSpreadElement()
if (spreadElement != null) {
trace.report(NON_VARARG_SPREAD.onError(spreadElement))
}
} else if (castedPsiCallArgument != null) {
val spreadElement = castedPsiCallArgument.valueArgument.getSpreadElement()
if (spreadElement != null) {
trace.report(NON_VARARG_SPREAD.on(context.languageVersionSettings, spreadElement))
}
}
}
}
@@ -349,7 +349,7 @@ public class ValueArgumentsToParametersMapper {
else {
LeafPsiElement spread = valueArgument.getSpreadElement();
if (spread != null) {
candidateCall.getTrace().report(NON_VARARG_SPREAD.on(spread));
candidateCall.getTrace().report(NON_VARARG_SPREAD.onError(spread));
setStatus(WEAK_ERROR);
}
ResolvedValueArgument argument = new ExpressionValueArgument(valueArgument);