public ConcreteExpression resolve()

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;
  }