in meta/src/main/java/org/arend/lib/util/NamedParameter.java [47:106]
public ConcreteExpression resolve(ExpressionResolver resolver, ConcreteExpression expression, boolean allowExpression, boolean allowMultiple) {
assert !allRefs.isEmpty();
if (allowMultiple && expression instanceof ConcreteTupleExpression) {
List<ConcreteExpression> newFields = new ArrayList<>();
for (ConcreteExpression field : ((ConcreteTupleExpression) expression).getFields()) {
ConcreteExpression newField = resolve(resolver, field, allowExpression, false);
if (newField != null) newFields.add(newField);
}
return factory.withData(expression.getData()).tuple(newFields);
}
if (!nonFlagRefs.isEmpty()) {
List<ConcreteArgument> sequence = expression.getArgumentsSequence();
if (sequence.size() >= 2 && sequence.get(0).getExpression() instanceof ConcreteReferenceExpression && sequence.get(1).isExplicit() && (!allowExpression || sequence.get(1).getExpression() instanceof ConcreteReferenceExpression && ((ConcreteReferenceExpression) sequence.get(1).getExpression()).getReferent().getRefName().equals("="))) {
ConcreteExpression resolved = resolver.useRefs(nonFlagRefs, allowExpression).resolve(sequence.get(0).getExpression());
ArendRef resolvedRef = resolved instanceof ConcreteReferenceExpression ? ((ConcreteReferenceExpression) resolved).getReferent() : null;
if (resolvedRef != null && nonFlagRefs.contains(resolvedRef)) {
if (sequence.size() == 2) {
resolver.getErrorReporter().report(new NameResolverError(sequence.get(1).getExpression() instanceof ConcreteReferenceExpression && ((ConcreteReferenceExpression) sequence.get(1).getExpression()).getReferent().getRefName().equals("=") ? "Expected a value after '='" : "Expected '='", sequence.get(1).getExpression()));
return null;
}
var handler = handlers.get(resolvedRef);
List<ConcreteArgument> subList = sequence.subList(2, sequence.size());
ConcreteExpression result = handler != null ? handler.apply(resolver, subList) : resolver.resolve(expression.getData(), subList);
return result == null ? null : factory.withData(expression.getData()).app(factory.withData(resolved.getData()).ref(resolvedRef), true, Collections.singletonList(result));
}
}
}
if (expression instanceof ConcreteReferenceExpression) {
ConcreteExpression result = resolver.useRefs(allRefs, allowExpression).resolve(expression);
if (result instanceof ConcreteReferenceExpression && nonFlagRefs.contains(((ConcreteReferenceExpression) result).getReferent())) {
resolver.getErrorReporter().report(new NameResolverError("Expected '=' after '" + ((ConcreteReferenceExpression) result).getReferent().getRefName() + "'", expression));
return null;
}
return result;
}
if (allowExpression) {
return resolver.resolve(expression);
}
String message;
if (allRefs.size() > 1) {
StringBuilder builder = new StringBuilder();
builder.append("Expected one of the following parameters: ");
for (int i = 0; i < allRefs.size(); i++) {
if (i > 0) {
builder.append(", ");
}
builder.append(allRefs.get(i).getRefName());
}
message = builder.toString();
} else {
message = "Expected '" + allRefs.get(0).getRefName() + "'";
}
resolver.getErrorReporter().report(new NameResolverError(message, expression));
return null;
}