// ===========================================================================
// This file has been generated by
// xtc Factory Factory, version 1.13.0,
// (C) 2004-2007 Robert Grimm,
// on Wednesday, September 5, 2007 at 3:03:08 PM.
// Edit at your own risk.
// ===========================================================================

package xtc.lang.jeannie;

import java.util.List;

import xtc.tree.Node;
import xtc.tree.GNode;

/**
 * Node factory <code>xtc.lang.jeannie.JeannieJavaFactory</code>.
 *
 * <p />This class has been generated by
 * the xtc Factory Factory, version 1.13.0,
 * (C) 2004-2007 Robert Grimm.
 */
public class JeannieJavaFactory {

  /** Create a new node factory. */
  public JeannieJavaFactory() {
    // Nothing to do.
  }

  /**
   * Create a block.
   *
   * @param statements The statements.
   * @return The generic node.
   */
  public Node block(List<Node> statements) {
    Node v$1 = GNode.create("Block", statements.size()).
      addAll(statements);
    return v$1;
  }

  /**
   * Create a call expression.
   *
   * @param nativeMethod The nativeMethod.
   * @return The generic node.
   */
  public Node cInJavaExpressionWithCEnv(String nativeMethod) {
    Node v$1 = GNode.create("ThisExpression", null);
    Node v$2 = GNode.create("PrimaryIdentifier", "cEnv");
    Node v$3 = GNode.create("Arguments", v$2);
    Node v$4 = GNode.create("CallExpression", v$1, null, nativeMethod, v$3);
    return v$4;
  }

  /**
   * Create a call expression.
   *
   * @param nativeMethod The nativeMethod.
   * @return The generic node.
   */
  public Node cInJavaExpressionWithoutCEnv(String nativeMethod) {
    Node v$1 = GNode.create("ThisExpression", null);
    Node v$2 = GNode.create("Arguments", false);
    Node v$3 = GNode.create("CallExpression", v$1, null, nativeMethod, v$2);
    return v$3;
  }

  /**
   * Create a block.
   *
   * @param nativeMethod The nativeMethod.
   * @param returnAbrupt The returnAbrupt.
   * @return The generic node.
   */
  public Node cInJavaStatementWithCEnv(String nativeMethod, 
                                       String returnAbrupt) {
    Node v$1 = GNode.create("ThisExpression", null);
    Node v$2 = GNode.create("PrimaryIdentifier", "cEnv");
    Node v$3 = GNode.create("Arguments", v$2);
    Node v$4 = GNode.create("CallExpression", v$1, null, nativeMethod, v$3);
    Node v$5 = GNode.create("ExpressionStatement", v$4);
    Node v$6 = GNode.create("ThisExpression", null);
    Node v$7 = GNode.create("SelectionExpression", v$6, returnAbrupt);
    Node v$8 = GNode.create("ReturnStatement", null);
    Node v$9 = GNode.create("ConditionalStatement", v$7, v$8, null);
    Node v$10 = GNode.create("Block", v$5, v$9);
    return v$10;
  }

  /**
   * Create a block.
   *
   * @param nativeMethod The nativeMethod.
   * @param returnAbrupt The returnAbrupt.
   * @return The generic node.
   */
  public Node cInJavaStatementWithoutCEnv(String nativeMethod, 
                                          String returnAbrupt) {
    Node v$1 = GNode.create("ThisExpression", null);
    Node v$2 = GNode.create("Arguments", false);
    Node v$3 = GNode.create("CallExpression", v$1, null, nativeMethod, v$2);
    Node v$4 = GNode.create("ExpressionStatement", v$3);
    Node v$5 = GNode.create("ThisExpression", null);
    Node v$6 = GNode.create("SelectionExpression", v$5, returnAbrupt);
    Node v$7 = GNode.create("ReturnStatement", null);
    Node v$8 = GNode.create("ConditionalStatement", v$6, v$7, null);
    Node v$9 = GNode.create("Block", v$4, v$8);
    return v$9;
  }

  /**
   * Create a method declaration.
   *
   * @param returnType The returnType.
   * @param name The name.
   * @param envType The envType.
   * @return The generic node.
   */
  public Node cInJavaCodeWithCEnv(Node returnType, String name, Node envType) {
    Node v$1 = GNode.create("Modifier", "private");
    Node v$2 = GNode.create("Modifier", "native");
    Node v$3 = GNode.create("Modifiers", v$1, v$2);
    Node v$4 = GNode.create("Type", returnType, null);
    Node v$5 = GNode.create("Modifier", "final");
    Node v$6 = GNode.create("Modifiers", v$5);
    Node v$7 = GNode.create("Type", envType, null);
    Node v$8 = GNode.create("FormalParameter", v$6, v$7, null, "cEnv", null);
    Node v$9 = GNode.create("FormalParameters", v$8);
    Node v$10 = GNode.create("MethodDeclaration", v$3, null, v$4, name, v$9, 
      null, null, null);
    return v$10;
  }

  /**
   * Create a method declaration.
   *
   * @param returnType The returnType.
   * @param name The name.
   * @return The generic node.
   */
  public Node cInJavaCodeWithoutCEnv(Node returnType, String name) {
    Node v$1 = GNode.create("Modifier", "private");
    Node v$2 = GNode.create("Modifier", "native");
    Node v$3 = GNode.create("Modifiers", v$1, v$2);
    Node v$4 = GNode.create("Type", returnType, null);
    Node v$5 = GNode.create("FormalParameters", false);
    Node v$6 = GNode.create("MethodDeclaration", v$3, null, v$4, name, v$5, 
      null, null, null);
    return v$6;
  }

  /**
   * Create a block.
   *
   * @param clazz The clazz.
   * @param actuals The actuals.
   * @param result The result.
   * @return The generic node.
   */
  public Node closureExpression(Node clazz, List<Node> actuals, String result) {
    Node v$1 = GNode.create("Modifiers", false);
    Node v$2 = GNode.create("Type", clazz, null);
    Node v$3 = GNode.create("Arguments", actuals.size()).
      addAll(actuals);
    Node v$4 = GNode.create("NewClassExpression", null, null, clazz, v$3, 
      null);
    Node v$5 = GNode.create("Declarator", "jEnv", null, v$4);
    Node v$6 = GNode.create("Declarators", v$5);
    Node v$7 = GNode.create("FieldDeclaration", v$1, v$2, v$6);
    Node v$8 = GNode.create("PrimaryIdentifier", "jEnv");
    Node v$9 = GNode.create("SelectionExpression", v$8, result);
    Node v$10 = GNode.create("ReturnStatement", v$9);
    Node v$11 = GNode.create("Block", v$7, v$10);
    return v$11;
  }

  /**
   * Create a block.
   *
   * @param clazz The clazz.
   * @param actuals The actuals.
   * @return The generic node.
   */
  public Node closureStatement(Node clazz, List<Node> actuals) {
    Node v$1 = GNode.create("Modifiers", false);
    Node v$2 = GNode.create("Type", clazz, null);
    Node v$3 = GNode.create("Arguments", actuals.size()).
      addAll(actuals);
    Node v$4 = GNode.create("NewClassExpression", null, null, clazz, v$3, 
      null);
    Node v$5 = GNode.create("Declarator", "jEnv", null, v$4);
    Node v$6 = GNode.create("Declarators", v$5);
    Node v$7 = GNode.create("FieldDeclaration", v$1, v$2, v$6);
    Node v$8 = GNode.create("Block", v$7);
    return v$8;
  }

  /**
   * Create a field declaration.
   *
   * @param type The type.
   * @param name The name.
   * @return The generic node.
   */
  public Node declareField(Node type, String name) {
    Node v$1 = GNode.create("Modifiers", false);
    Node v$2 = GNode.create("Type", type, null);
    Node v$3 = GNode.create("Declarator", name, null, null);
    Node v$4 = GNode.create("Declarators", v$3);
    Node v$5 = GNode.create("FieldDeclaration", v$1, v$2, v$4);
    return v$5;
  }

  /**
   * Create a selection expression.
   *
   * @param name The name.
   * @return The generic node.
   */
  public Node getThisDotField(String name) {
    Node v$1 = GNode.create("ThisExpression", null);
    Node v$2 = GNode.create("SelectionExpression", v$1, name);
    return v$2;
  }

  /**
   * Create a method declaration.
   *
   * @param returnType The returnType.
   * @param name The name.
   * @param envType The envType.
   * @param expr The expr.
   * @return The generic node.
   */
  public Node javaInCExpression(Node returnType, String name, Node envType, 
                                Node expr) {
    Node v$1 = GNode.create("Modifier", "private");
    Node v$2 = GNode.create("Modifiers", v$1);
    Node v$3 = GNode.create("Type", returnType, null);
    Node v$4 = GNode.create("Modifier", "final");
    Node v$5 = GNode.create("Modifiers", v$4);
    Node v$6 = GNode.create("Type", envType, null);
    Node v$7 = GNode.create("FormalParameter", v$5, v$6, null, "cEnv", null);
    Node v$8 = GNode.create("FormalParameters", v$7);
    Node v$9 = GNode.create("QualifiedIdentifier", "Exception");
    Node v$10 = GNode.create("ThrowsClause", v$9);
    Node v$11 = GNode.create("ReturnStatement", expr);
    Node v$12 = GNode.create("Block", v$11);
    Node v$13 = GNode.create("MethodDeclaration", v$2, null, v$3, name, v$8, 
      null, v$10, v$12);
    return v$13;
  }

  /**
   * Create a method declaration.
   *
   * @param name The name.
   * @param envType The envType.
   * @param expr The expr.
   * @return The generic node.
   */
  public Node javaInCExpressionVoid(String name, Node envType, Node expr) {
    Node v$1 = GNode.create("Modifier", "private");
    Node v$2 = GNode.create("Modifiers", v$1);
    Node v$3 = GNode.create("VoidType", false);
    Node v$4 = GNode.create("Modifier", "final");
    Node v$5 = GNode.create("Modifiers", v$4);
    Node v$6 = GNode.create("Type", envType, null);
    Node v$7 = GNode.create("FormalParameter", v$5, v$6, null, "cEnv", null);
    Node v$8 = GNode.create("FormalParameters", v$7);
    Node v$9 = GNode.create("QualifiedIdentifier", "Exception");
    Node v$10 = GNode.create("ThrowsClause", v$9);
    Node v$11 = GNode.create("ExpressionStatement", expr);
    Node v$12 = GNode.create("Block", v$11);
    Node v$13 = GNode.create("MethodDeclaration", v$2, null, v$3, name, v$8, 
      null, v$10, v$12);
    return v$13;
  }

  /**
   * Create a method declaration.
   *
   * @param name The name.
   * @param envType The envType.
   * @param stmt The stmt.
   * @return The generic node.
   */
  public Node javaInCStatement(String name, Node envType, Node stmt) {
    Node v$1 = GNode.create("Modifier", "private");
    Node v$2 = GNode.create("Modifiers", v$1);
    Node v$3 = GNode.create("VoidType", false);
    Node v$4 = GNode.create("Modifier", "final");
    Node v$5 = GNode.create("Modifiers", v$4);
    Node v$6 = GNode.create("Type", envType, null);
    Node v$7 = GNode.create("FormalParameter", v$5, v$6, null, "cEnv", null);
    Node v$8 = GNode.create("FormalParameters", v$7);
    Node v$9 = GNode.create("QualifiedIdentifier", "Exception");
    Node v$10 = GNode.create("ThrowsClause", v$9);
    Node v$11 = GNode.create("Block", stmt);
    Node v$12 = GNode.create("MethodDeclaration", v$2, null, v$3, name, v$8, 
      null, v$10, v$11);
    return v$12;
  }

  /**
   * Create a block.
   *
   * @param name The name.
   * @return The generic node.
   */
  public Node loadLibrary(Node name) {
    Node v$1 = GNode.create("PrimaryIdentifier", "System");
    Node v$2 = GNode.create("Arguments", name);
    Node v$3 = GNode.create("CallExpression", v$1, null, "loadLibrary", v$2);
    Node v$4 = GNode.create("ExpressionStatement", v$3);
    Node v$5 = GNode.create("Block", v$4);
    return v$5;
  }

  /**
   * Create a block.
   *
   * @param result The result.
   * @param value The value.
   * @param abrupt The abrupt.
   * @return The generic node.
   */
  public Node returnResult(String result, Node value, String abrupt) {
    Node v$1 = GNode.create("ThisExpression", null);
    Node v$2 = GNode.create("SelectionExpression", v$1, result);
    Node v$3 = GNode.create("Expression", v$2, "=", value);
    Node v$4 = GNode.create("ExpressionStatement", v$3);
    Node v$5 = GNode.create("ThisExpression", null);
    Node v$6 = GNode.create("SelectionExpression", v$5, abrupt);
    Node v$7 = GNode.create("BooleanLiteral", "true");
    Node v$8 = GNode.create("Expression", v$6, "=", v$7);
    Node v$9 = GNode.create("ExpressionStatement", v$8);
    Node v$10 = GNode.create("ReturnStatement", null);
    Node v$11 = GNode.create("Block", v$4, v$9, v$10);
    return v$11;
  }

  /**
   * Create a block.
   *
   * @param abrupt The abrupt.
   * @return The generic node.
   */
  public Node returnVoid(String abrupt) {
    Node v$1 = GNode.create("ThisExpression", null);
    Node v$2 = GNode.create("SelectionExpression", v$1, abrupt);
    Node v$3 = GNode.create("BooleanLiteral", "true");
    Node v$4 = GNode.create("Expression", v$2, "=", v$3);
    Node v$5 = GNode.create("ExpressionStatement", v$4);
    Node v$6 = GNode.create("ReturnStatement", null);
    Node v$7 = GNode.create("Block", v$5, v$6);
    return v$7;
  }

  /**
   * Create an expression.
   *
   * @param name The name.
   * @param value The value.
   * @return The generic node.
   */
  public Node setThisDotField(String name, Node value) {
    Node v$1 = GNode.create("ThisExpression", null);
    Node v$2 = GNode.create("SelectionExpression", v$1, name);
    Node v$3 = GNode.create("Expression", v$2, "=", value);
    return v$3;
  }

}
