예제 #1
0
  private argumentsType makeArguments(DefaultArg[] def, NameTok varg, NameTok kwarg)
      throws Exception {
    exprType fpargs[] = new exprType[def.length];
    exprType defaults[] = new exprType[def.length];
    int startofdefaults = 0;
    boolean defaultsSet = false;
    for (int i = 0; i < def.length; i++) {
      DefaultArg node = def[i];
      exprType parameter = node.parameter;
      fpargs[i] = parameter;

      if (node.specialsBefore != null && node.specialsBefore.size() > 0) {
        parameter.getSpecialsBefore().addAll(node.specialsBefore);
      }
      if (node.specialsAfter != null && node.specialsAfter.size() > 0) {
        parameter.getSpecialsAfter().addAll(node.specialsAfter);
      }

      ctx.setParam(fpargs[i]);
      defaults[i] = node.value;
      if (node.value != null && defaultsSet == false) {
        defaultsSet = true;
        startofdefaults = i;
      }
    }

    // System.out.println("start "+ startofdefaults + " " + l);
    exprType[] newdefs = new exprType[def.length - startofdefaults];
    System.arraycopy(defaults, startofdefaults, newdefs, 0, newdefs.length);
    return new argumentsType(fpargs, varg, kwarg, newdefs, null, null, null, null, null, null);
  }
  protected final SimpleNode makeDecorator(java.util.List<SimpleNode> nodes) {
    exprType starargs = null;
    exprType kwargs = null;

    exprType func = null;
    ArrayList<SimpleNode> keywordsl = new ArrayList<SimpleNode>();
    ArrayList<SimpleNode> argsl = new ArrayList<SimpleNode>();
    for (Iterator<SimpleNode> iter = nodes.iterator(); iter.hasNext(); ) {
      SimpleNode node = iter.next();

      if (node.getId() == JJTEXTRAKEYWORDVALUELIST) {
        final ExtraArgValue extraArg = (ExtraArgValue) node;
        kwargs = (extraArg).value;
        this.addSpecialsAndClearOriginal(extraArg, kwargs);
        extraArg.specialsBefore = kwargs.getSpecialsBefore();
        extraArg.specialsAfter = kwargs.getSpecialsAfter();

      } else if (node.getId() == JJTEXTRAARGVALUELIST) {
        final ExtraArgValue extraArg = (ExtraArgValue) node;
        starargs = extraArg.value;
        this.addSpecialsAndClearOriginal(extraArg, starargs);
        extraArg.specialsBefore = starargs.getSpecialsBefore();
        extraArg.specialsAfter = starargs.getSpecialsAfter();

      } else if (node instanceof keywordType) {
        // keyword
        keywordsl.add(node);

      } else if (isArg(node)) {
        // default
        argsl.add(node);

      } else if (node instanceof Comprehension) {
        argsl.add(
            new ListComp(
                (exprType) iter.next(), new comprehensionType[] {(comprehensionType) node}));

      } else if (node instanceof ComprehensionCollection) {
        // list comp (2 nodes: comp type and the elt -- what does elt mean by the way?)
        argsl.add(
            new ListComp((exprType) iter.next(), ((ComprehensionCollection) node).getGenerators()));

      } else if (node instanceof decoratorsType) {
        func = (exprType) stack.popNode(); // the func is the last thing in the stack
        decoratorsType d = (decoratorsType) node;
        d.func = func;
        d.args = (exprType[]) argsl.toArray(new exprType[0]);
        d.keywords = (keywordType[]) keywordsl.toArray(new keywordType[0]);
        d.starargs = starargs;
        d.kwargs = kwargs;
        return d;

      } else {
        argsl.add(node);
      }
    }
    throw new RuntimeException("Something wrong happened while making the decorators...");
  }