protected final suiteType popSuiteAndSuiteType() {
   Suite s = (Suite) stack.popNode();
   suiteType orelseSuite = (suiteType) stack.popNode();
   orelseSuite.body = s.body;
   addSpecialsAndClearOriginal(s, orelseSuite);
   return orelseSuite;
 }
 protected final stmtType[] makeStmts(int l) {
   stmtType[] stmts = new stmtType[l];
   for (int i = l - 1; i >= 0; i--) {
     stmts[i] = (stmtType) stack.popNode();
   }
   return stmts;
 }
 protected final aliasType[] makeAliases(int l) {
   aliasType[] aliases = new aliasType[l];
   for (int i = l - 1; i >= 0; i--) {
     aliases[i] = (aliasType) stack.popNode();
   }
   return aliases;
 }
 protected final exprType[] makeExprs(int l) {
   exprType[] exprs = new exprType[l];
   for (int i = l - 1; i >= 0; i--) {
     lastPop = stack.popNode();
     exprs[i] = (exprType) lastPop;
   }
   return exprs;
 }
  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...");
  }
  /**
   * @param suite
   * @return
   */
  protected final stmtType[] getBodyAndSpecials() {
    Suite suite = (Suite) stack.popNode();
    stmtType[] body;
    body = suite.body;
    if (suite.specialsBefore != null && suite.specialsBefore.size() > 0) {
      body[0].getSpecialsBefore().addAll(suite.specialsBefore);
    }

    if (suite.specialsAfter != null && suite.specialsAfter.size() > 0) {
      body[body.length - 1].getSpecialsAfter().addAll(suite.specialsAfter);
    }
    return body;
  }
 protected final NameTok[] makeIdentifiers(int ctx) {
   int l = stack.nodeArity();
   return makeIdentifiers(ctx, l);
 }
 protected final NameTok makeName(int ctx) {
   Name name = (Name) stack.popNode();
   return makeName(ctx, name);
 }
 protected final exprType[] makeExprs() {
   if (stack.nodeArity() > 0 && stack.peekNode().getId() == JJTCOMMA) stack.popNode();
   return makeExprs(stack.nodeArity());
 }