Minor, save parameters to field in ValueArgumentsToParametersMapper
This commit is contained in:
+32
-40
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user