From f3ef961be64b53363dce7a556fdda0f8ba4a5833 Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Tue, 14 Nov 2017 13:00:14 +0300 Subject: [PATCH] [NI] Report error about non-spread parameter from arguments mapper --- .../calls/DiagnosticReporterByTrackingStrategy.kt | 12 ++++++------ .../calls/components/ArgumentsToParametersMapper.kt | 2 +- .../resolve/calls/components/ResolutionParts.kt | 13 ------------- .../resolve/calls/model/KotlinCallDiagnistics.kt | 8 +------- .../resolve/calls/model/KotlinResolverContext.kt | 3 +-- 5 files changed, 9 insertions(+), 29 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt index 45f9242cab7..11f217a42d6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/DiagnosticReporterByTrackingStrategy.kt @@ -113,11 +113,6 @@ class DiagnosticReporterByTrackingStrategy( VarargArgumentOutsideParentheses::class.java -> reportIfNonNull(callArgument.psiExpression) { trace.report(VARARG_OUTSIDE_PARENTHESES.on(it)) } - SpreadArgumentToNonVarargParameter::class.java -> { - val spreadElement = callArgument.safeAs()?.valueArgument?.getSpreadElement() - reportIfNonNull(spreadElement) { trace.report(NON_VARARG_SPREAD.on(it)) } - } - MixingNamedAndPositionArguments::class.java -> trace.report(MIXING_NAMED_AND_POSITIONED_ARGUMENTS.on(callArgument.psiCallArgument.valueArgument.asElement())) } @@ -147,7 +142,12 @@ class DiagnosticReporterByTrackingStrategy( } override fun onCallArgumentSpread(callArgument: KotlinCallArgument, diagnostic: KotlinCallDiagnostic) { - + when (diagnostic.javaClass) { + NonVarargSpread::class.java -> { + val spreadElement = callArgument.safeAs()?.valueArgument?.getSpreadElement() + reportIfNonNull(spreadElement) { trace.report(NON_VARARG_SPREAD.on(it)) } + } + } } private fun reportSmartCast(smartCastDiagnostic: SmartCastDiagnostic) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper.kt index 7b2561aa3a4..ee0f0b2a314 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ArgumentsToParametersMapper.kt @@ -240,7 +240,7 @@ class ArgumentsToParametersMapper { } else { if (resolvedArgument.callArgument.isSpread) { - addDiagnostic(NonVarargSpread(resolvedArgument.callArgument, parameter)) + addDiagnostic(NonVarargSpread(resolvedArgument.callArgument)) } } } diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt index a819a38daf2..a9e2a9b37e3 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/components/ResolutionParts.kt @@ -109,19 +109,6 @@ internal object ArgumentsToCandidateParameterDescriptor : ResolutionPart() { } } -internal object CheckSpreadArgumentToNonVarargParameter : ResolutionPart() { - override fun KotlinResolutionCandidate.process(workIndex: Int) { - for ((_, resolvedCallArgument) in resolvedCall.argumentMappingByOriginal) { - for (argument in resolvedCallArgument.arguments) { - val valueParameter = resolvedCall.argumentToCandidateParameter[argument] ?: continue - if (argument.isSpread && !valueParameter.isVararg) { - addDiagnostic(SpreadArgumentToNonVarargParameter(argument)) - } - } - } - } -} - internal object NoArguments : ResolutionPart() { override fun KotlinResolutionCandidate.process(workIndex: Int) { assert(kotlinCall.argumentsInParenthesis.isEmpty()) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt index 0b2a761c50b..53315745b73 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinCallDiagnistics.kt @@ -33,7 +33,7 @@ abstract class InapplicableArgumentDiagnostic : KotlinCallDiagnostic(INAPPLICABL // ArgumentsToParameterMapper class TooManyArguments(override val argument: KotlinCallArgument, val descriptor: CallableDescriptor) : InapplicableArgumentDiagnostic() -class NonVarargSpread (val argument: KotlinCallArgument, val parameterDescriptor: ValueParameterDescriptor) : KotlinCallDiagnostic(INAPPLICABLE) { +class NonVarargSpread(val argument: KotlinCallArgument) : KotlinCallDiagnostic(INAPPLICABLE) { override fun report(reporter: DiagnosticReporter) = reporter.onCallArgumentSpread(argument, this) } @@ -162,12 +162,6 @@ class SuperAsExtensionReceiver(val receiver: SimpleKotlinCallArgument) : KotlinC } } -class SpreadArgumentToNonVarargParameter(val argument: KotlinCallArgument) : KotlinCallDiagnostic(RUNTIME_ERROR) { - override fun report(reporter: DiagnosticReporter) { - reporter.onCallArgument(argument, this) - } -} - // candidates result class NoneCandidatesCallDiagnostic(val kotlinCall: KotlinCall) : KotlinCallDiagnostic(INAPPLICABLE) { override fun report(reporter: DiagnosticReporter) { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt index 415112d18f1..2d8c64f3580 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/model/KotlinResolverContext.kt @@ -183,8 +183,7 @@ enum class KotlinCallKind(vararg resolutionPart: ResolutionPart) { CheckExplicitReceiverKindConsistency, CheckReceivers, CheckArguments, - CheckExternalArgument, - CheckSpreadArgumentToNonVarargParameter + CheckExternalArgument ), UNSUPPORTED();