From c204ae2da145202c692f31d9200dbb342486a9ac Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Thu, 8 May 2014 15:35:16 +0400 Subject: [PATCH] Record argument to parameter map at the beginning (separately from argument match status) --- .../lang/resolve/calls/CandidateResolver.java | 2 +- .../ValueArgumentsToParametersMapper.java | 5 ++- .../resolve/calls/model/ArgumentMapping.kt | 18 ++++++++++- .../calls/model/MutableResolvedCall.java | 2 +- .../resolve/calls/model/ResolvedCallImpl.java | 32 ++++++++++--------- 5 files changed, 40 insertions(+), 19 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 20d3baddce0..1768f1be66c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -478,7 +478,7 @@ public class CandidateResolver { } } argumentTypes.add(resultingType); - candidateCall.recordArgumentMatch(argument, parameterDescriptor, matchStatus); + candidateCall.recordArgumentMatchStatus(argument, matchStatus); } } return new ValueArgumentsCheckingResult(resultStatus, argumentTypes); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java index f4381952b5c..9c8b9c00587 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/ValueArgumentsToParametersMapper.java @@ -203,6 +203,10 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap } } + for (Map.Entry entry : varargs.entrySet()) { + candidateCall.recordValueArgument(entry.getKey(), entry.getValue()); + } + processFunctionLiteralArguments(); reportUnmappedParameters(); checkReceiverArgument(); @@ -296,7 +300,6 @@ import static org.jetbrains.jet.lang.resolve.calls.ValueArgumentsToParametersMap if (vararg == null) { vararg = new VarargValueArgument(); varargs.put(valueParameterDescriptor, vararg); - candidateCall.recordValueArgument(valueParameterDescriptor, vararg); } vararg.addArgument(valueArgument); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ArgumentMapping.kt b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ArgumentMapping.kt index cb79c2f5980..3b9e7252e74 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ArgumentMapping.kt +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ArgumentMapping.kt @@ -36,6 +36,22 @@ enum class ArgumentMatchStatus(val isError: Boolean = true) { MATCH_MODULO_UNINFERRED_TYPES : ArgumentMatchStatus() } -class ArgumentMatch(val valueParameter: ValueParameterDescriptor, val status: ArgumentMatchStatus): ArgumentMapping { +trait ArgumentMatch : ArgumentMapping { + val valueParameter: ValueParameterDescriptor + val status: ArgumentMatchStatus + override fun isError(): Boolean = status.isError } + +class ArgumentMatchImpl(override val valueParameter: ValueParameterDescriptor): ArgumentMatch { + private var _status: ArgumentMatchStatus? = null + override val status: ArgumentMatchStatus get() = _status!! + fun recordMatchStatus(status: ArgumentMatchStatus) { + _status = status + } + fun replaceValueParameter(newValueParameter: ValueParameterDescriptor): ArgumentMatchImpl { + val newArgumentMatch = ArgumentMatchImpl(newValueParameter) + newArgumentMatch._status = _status + return newArgumentMatch + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/MutableResolvedCall.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/MutableResolvedCall.java index 7cbcd157eb1..e22ce09f54c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/MutableResolvedCall.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/MutableResolvedCall.java @@ -47,7 +47,7 @@ public interface MutableResolvedCall extends Resol void recordValueArgument(@NotNull ValueParameterDescriptor valueParameter, @NotNull ResolvedValueArgument valueArgument); - void recordArgumentMatch(@NotNull ValueArgument valueArgument, @NotNull ValueParameterDescriptor parameter, @NotNull ArgumentMatchStatus matchStatus); + void recordArgumentMatchStatus(@NotNull ValueArgument valueArgument, @NotNull ArgumentMatchStatus matchStatus); @Override @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallImpl.java index 3493e06d771..7098fb4a239 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/model/ResolvedCallImpl.java @@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.psi.Call; import org.jetbrains.jet.lang.psi.ValueArgument; import org.jetbrains.jet.lang.resolve.DelegatingBindingTrace; import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil; -import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintSystem; import org.jetbrains.jet.lang.resolve.calls.results.ResolutionStatus; import org.jetbrains.jet.lang.resolve.calls.tasks.ExplicitReceiverKind; @@ -80,7 +79,7 @@ public class ResolvedCallImpl implements MutableRe private final Map typeArguments = Maps.newLinkedHashMap(); private final Map valueArguments = Maps.newLinkedHashMap(); private final MutableDataFlowInfoForArguments dataFlowInfoForArguments; - private final Map argumentToParameterMap = Maps.newHashMap(); + private final Map argumentToParameterMap = Maps.newHashMap(); private DelegatingBindingTrace trace; private TracingStrategy tracing; @@ -166,26 +165,27 @@ public class ResolvedCallImpl implements MutableRe } } - Map parameterMap = Maps.newHashMap(); + Map substitutedParametersMap = Maps.newHashMap(); for (ValueParameterDescriptor valueParameterDescriptor : resultingDescriptor.getValueParameters()) { - parameterMap.put(valueParameterDescriptor.getOriginal(), valueParameterDescriptor); + substitutedParametersMap.put(valueParameterDescriptor.getOriginal(), valueParameterDescriptor); } Map originalValueArguments = Maps.newLinkedHashMap(valueArguments); valueArguments.clear(); for (Map.Entry entry : originalValueArguments.entrySet()) { - ValueParameterDescriptor substitutedVersion = parameterMap.get(entry.getKey().getOriginal()); + ValueParameterDescriptor substitutedVersion = substitutedParametersMap.get(entry.getKey().getOriginal()); assert substitutedVersion != null : entry.getKey(); valueArguments.put(substitutedVersion, entry.getValue()); } - Map originalArgumentToParameterMap = Maps.newLinkedHashMap(argumentToParameterMap); + Map originalArgumentToParameterMap = Maps.newLinkedHashMap(argumentToParameterMap); argumentToParameterMap.clear(); - for (Map.Entry entry : originalArgumentToParameterMap.entrySet()) { - ArgumentMatch argumentMatch = entry.getValue(); - ValueParameterDescriptor substitutedVersion = parameterMap.get(argumentMatch.getValueParameter().getOriginal()); - assert substitutedVersion != null : argumentMatch.getValueParameter(); - argumentToParameterMap.put(entry.getKey(), new ArgumentMatch(substitutedVersion, argumentMatch.getStatus())); + for (Map.Entry entry : originalArgumentToParameterMap.entrySet()) { + ArgumentMatchImpl argumentMatch = entry.getValue(); + ValueParameterDescriptor valueParameterDescriptor = argumentMatch.getValueParameter(); + ValueParameterDescriptor substitutedVersion = substitutedParametersMap.get(valueParameterDescriptor.getOriginal()); + assert substitutedVersion != null : valueParameterDescriptor; + argumentToParameterMap.put(entry.getKey(), argumentMatch.replaceValueParameter(substitutedVersion)); } } @@ -205,6 +205,9 @@ public class ResolvedCallImpl implements MutableRe public void recordValueArgument(@NotNull ValueParameterDescriptor valueParameter, @NotNull ResolvedValueArgument valueArgument) { assert !valueArguments.containsKey(valueParameter) : valueParameter + " -> " + valueArgument; valueArguments.put(valueParameter, valueArgument); + for (ValueArgument argument : valueArgument.getArguments()) { + argumentToParameterMap.put(argument, new ArgumentMatchImpl(valueParameter)); + } } @Override @@ -259,10 +262,9 @@ public class ResolvedCallImpl implements MutableRe } @Override - public void recordArgumentMatch( - @NotNull ValueArgument valueArgument, @NotNull ValueParameterDescriptor parameter, @NotNull ArgumentMatchStatus matchStatus - ) { - argumentToParameterMap.put(valueArgument, new ArgumentMatch(parameter, matchStatus)); + public void recordArgumentMatchStatus(@NotNull ValueArgument valueArgument, @NotNull ArgumentMatchStatus matchStatus) { + ArgumentMatchImpl argumentMatch = argumentToParameterMap.get(valueArgument); + argumentMatch.recordMatchStatus(matchStatus); } @NotNull