Minor, save parameters to field in ValueArgumentsToParametersMapper

This commit is contained in:
Alexander Udalov
2016-01-20 19:47:12 +03:00
parent 8fe964f269
commit d2d0f399db
@@ -86,6 +86,7 @@ public class ValueArgumentsToParametersMapper {
private final Call call; private final Call call;
private final TracingStrategy tracing; private final TracingStrategy tracing;
private final MutableResolvedCall<D> candidateCall; private final MutableResolvedCall<D> candidateCall;
private final List<ValueParameterDescriptor> parameters;
private final Map<Name,ValueParameterDescriptor> parameterByName; private final Map<Name,ValueParameterDescriptor> parameterByName;
private Map<Name,ValueParameterDescriptor> parameterByNameInOverriddenMethods; private Map<Name,ValueParameterDescriptor> parameterByNameInOverriddenMethods;
@@ -99,9 +100,10 @@ public class ValueArgumentsToParametersMapper {
this.call = call; this.call = call;
this.tracing = tracing; this.tracing = tracing;
this.candidateCall = candidateCall; this.candidateCall = candidateCall;
this.parameters = candidateCall.getCandidateDescriptor().getValueParameters();
this.parameterByName = Maps.newHashMap(); this.parameterByName = Maps.newHashMap();
for (ValueParameterDescriptor valueParameter : candidateCall.getCandidateDescriptor().getValueParameters()) { for (ValueParameterDescriptor valueParameter : parameters) {
parameterByName.put(valueParameter.getName(), valueParameter); parameterByName.put(valueParameter.getName(), valueParameter);
} }
} }
@@ -110,7 +112,7 @@ public class ValueArgumentsToParametersMapper {
private ValueParameterDescriptor getParameterByNameInOverriddenMethods(Name name) { private ValueParameterDescriptor getParameterByNameInOverriddenMethods(Name name) {
if (parameterByNameInOverriddenMethods == null) { if (parameterByNameInOverriddenMethods == null) {
parameterByNameInOverriddenMethods = Maps.newHashMap(); parameterByNameInOverriddenMethods = Maps.newHashMap();
for (ValueParameterDescriptor valueParameter : candidateCall.getCandidateDescriptor().getValueParameters()) { for (ValueParameterDescriptor valueParameter : parameters) {
for (ValueParameterDescriptor parameterDescriptor : valueParameter.getOverriddenDescriptors()) { for (ValueParameterDescriptor parameterDescriptor : valueParameter.getOverriddenDescriptors()) {
parameterByNameInOverriddenMethods.put(parameterDescriptor.getName(), valueParameter); parameterByNameInOverriddenMethods.put(parameterDescriptor.getName(), valueParameter);
} }
@@ -125,15 +127,14 @@ public class ValueArgumentsToParametersMapper {
private int currentParameter = 0; private int currentParameter = 0;
private int numberOfParametersForPositionedArguments() { private int numberOfParametersForPositionedArguments() {
int size = candidateCall.getCandidateDescriptor().getValueParameters().size(); return call.getCallType() == Call.CallType.ARRAY_SET_METHOD ? parameters.size() - 1 : parameters.size();
return call.getCallType() == Call.CallType.ARRAY_SET_METHOD ? size - 1 : size;
} }
@Nullable @Nullable
public ValueParameterDescriptor nextValueParameter() { public ValueParameterDescriptor nextValueParameter() {
if (currentParameter >= numberOfParametersForPositionedArguments()) return null; if (currentParameter >= numberOfParametersForPositionedArguments()) return null;
ValueParameterDescriptor head = candidateCall.getCandidateDescriptor().getValueParameters().get(currentParameter); ValueParameterDescriptor head = parameters.get(currentParameter);
// If we found a vararg parameter, we are stuck with it forever // If we found a vararg parameter, we are stuck with it forever
if (head.getVarargElementType() == null) { if (head.getVarargElementType() == null) {
@@ -156,7 +157,7 @@ public class ValueArgumentsToParametersMapper {
@Override @Override
public ProcessorState processArraySetRHS(@NotNull ValueArgument argument) { public ProcessorState processArraySetRHS(@NotNull ValueArgument argument) {
processArgument(argument, CollectionsKt.lastOrNull(candidateCall.getCandidateDescriptor().getValueParameters())); processArgument(argument, CollectionsKt.lastOrNull(parameters));
return positionedOnly; return positionedOnly;
} }
@@ -274,46 +275,40 @@ public class ValueArgumentsToParametersMapper {
} }
private void processFunctionLiteralArguments() { private void processFunctionLiteralArguments() {
D candidate = candidateCall.getCandidateDescriptor();
List<ValueParameterDescriptor> valueParameters = candidate.getValueParameters();
List<? extends LambdaArgument> functionLiteralArguments = call.getFunctionLiteralArguments(); List<? extends LambdaArgument> functionLiteralArguments = call.getFunctionLiteralArguments();
if (!functionLiteralArguments.isEmpty()) { if (functionLiteralArguments.isEmpty()) return;
LambdaArgument lambdaArgument = functionLiteralArguments.get(0);
KtExpression possiblyLabeledFunctionLiteral = lambdaArgument.getArgumentExpression();
if (valueParameters.isEmpty()) { LambdaArgument lambdaArgument = functionLiteralArguments.get(0);
report(TOO_MANY_ARGUMENTS.on(possiblyLabeledFunctionLiteral, candidate)); KtExpression possiblyLabeledFunctionLiteral = lambdaArgument.getArgumentExpression();
if (parameters.isEmpty()) {
report(TOO_MANY_ARGUMENTS.on(possiblyLabeledFunctionLiteral, candidateCall.getCandidateDescriptor()));
setStatus(ERROR);
}
else {
ValueParameterDescriptor lastParameter = CollectionsKt.last(parameters);
if (lastParameter.getVarargElementType() != null) {
report(VARARG_OUTSIDE_PARENTHESES.on(possiblyLabeledFunctionLiteral));
setStatus(ERROR); setStatus(ERROR);
} }
else { else if (!usedParameters.add(lastParameter)) {
ValueParameterDescriptor valueParameterDescriptor = valueParameters.get(valueParameters.size() - 1); report(TOO_MANY_ARGUMENTS.on(possiblyLabeledFunctionLiteral, candidateCall.getCandidateDescriptor()));
if (valueParameterDescriptor.getVarargElementType() != null) {
report(VARARG_OUTSIDE_PARENTHESES.on(possiblyLabeledFunctionLiteral));
setStatus(ERROR);
}
else {
if (!usedParameters.add(valueParameterDescriptor)) {
report(TOO_MANY_ARGUMENTS.on(possiblyLabeledFunctionLiteral, candidate));
setStatus(WEAK_ERROR);
}
else {
putVararg(valueParameterDescriptor, lambdaArgument);
}
}
}
for (int i = 1; i < functionLiteralArguments.size(); i++) {
KtExpression argument = functionLiteralArguments.get(i).getArgumentExpression();
report(MANY_LAMBDA_EXPRESSION_ARGUMENTS.on(argument));
setStatus(WEAK_ERROR); setStatus(WEAK_ERROR);
} }
else {
putVararg(lastParameter, lambdaArgument);
}
}
for (int i = 1; i < functionLiteralArguments.size(); i++) {
KtExpression argument = functionLiteralArguments.get(i).getArgumentExpression();
report(MANY_LAMBDA_EXPRESSION_ARGUMENTS.on(argument));
setStatus(WEAK_ERROR);
} }
} }
private void reportUnmappedParameters() { private void reportUnmappedParameters() {
List<ValueParameterDescriptor> valueParameters = candidateCall.getCandidateDescriptor().getValueParameters(); for (ValueParameterDescriptor valueParameter : parameters) {
for (ValueParameterDescriptor valueParameter : valueParameters) {
if (!usedParameters.contains(valueParameter)) { if (!usedParameters.contains(valueParameter)) {
if (DescriptorUtilsKt.hasDefaultValue(valueParameter)) { if (DescriptorUtilsKt.hasDefaultValue(valueParameter)) {
candidateCall.recordValueArgument(valueParameter, DefaultValueArgument.DEFAULT); candidateCall.recordValueArgument(valueParameter, DefaultValueArgument.DEFAULT);
@@ -329,10 +324,7 @@ public class ValueArgumentsToParametersMapper {
} }
} }
private void putVararg( private void putVararg(ValueParameterDescriptor valueParameterDescriptor, ValueArgument valueArgument) {
ValueParameterDescriptor valueParameterDescriptor,
ValueArgument valueArgument
) {
if (valueParameterDescriptor.getVarargElementType() != null) { if (valueParameterDescriptor.getVarargElementType() != null) {
VarargValueArgument vararg = varargs.get(valueParameterDescriptor); VarargValueArgument vararg = varargs.get(valueParameterDescriptor);
if (vararg == null) { if (vararg == null) {