Exemplo n.º 1
0
  private static ArgumentsList parseArguments(
      Method m, Environment environment, List<LispObject> args) {
    Type[] parametersTypes = m.getGenericParameterTypes();
    Annotation[][] parametersAnnotations = m.getParameterAnnotations();
    if (parametersAnnotations.length != parametersTypes.length) {
      throw new InternalException(JelispBundle.message("subroutine.args.properties.mismatch"));
    }
    ArgumentsList arguments = new ArgumentsList();
    setOptional(arguments, parametersAnnotations, parametersTypes);

    int nActual = args.size();
    if (parametersTypes.length != 0) {
      if (parametersTypes[0].equals(Environment.class)) {
        ++nActual;
        arguments.setValue(0, environment);
      }
    }

    if ((nActual < arguments.getRequiredSize())
        || (nActual > parametersTypes.length && !m.isVarArgs()))
      throw new WrongNumberOfArgumentsException(m.getAnnotation(Subroutine.class).value(), nActual);

    return arguments;
  }