/*
 * Copyright 2008 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.template.soy.exprtree;

import com.google.template.soy.basetree.CopyState;
import com.google.template.soy.basetree.Node;
import com.google.template.soy.basetree.ParentNode;
import com.google.template.soy.types.SoyType;

/**
 * This class defines the base interface for a node in the Soy expression parse tree, as well as a
 * number of subinterfaces that extend the base interface in various aspects. Every concrete node
 * implements some subset of these interfaces.
 *
 * <p>The top level definition is the base ExprNode interface.
 *
 * <p>Important: Do not use outside of Soy code (treat as superpackage-private).
 *
 */
public interface ExprNode extends Node {

  /**
   * Enum of specific node kinds (coresponding to specific node types).
   *
   * <p>Important: Do not use outside of Soy code (treat as superpackage-private).
   */
  public static enum Kind {
    EXPR_ROOT_NODE,

    NULL_NODE,
    BOOLEAN_NODE,
    INTEGER_NODE,
    FLOAT_NODE,
    STRING_NODE,

    LIST_LITERAL_NODE,
    MAP_LITERAL_NODE,
    LEGACY_OBJECT_MAP_LITERAL_NODE,

    VAR_NODE,

    VAR_REF_NODE,
    FIELD_ACCESS_NODE,
    ITEM_ACCESS_NODE,

    GLOBAL_NODE,

    NEGATIVE_OP_NODE,
    NOT_OP_NODE,
    TIMES_OP_NODE,
    DIVIDE_BY_OP_NODE,
    MOD_OP_NODE,
    PLUS_OP_NODE,
    MINUS_OP_NODE,
    LESS_THAN_OP_NODE,
    GREATER_THAN_OP_NODE,
    LESS_THAN_OR_EQUAL_OP_NODE,
    GREATER_THAN_OR_EQUAL_OP_NODE,
    EQUAL_OP_NODE,
    NOT_EQUAL_OP_NODE,
    AND_OP_NODE,
    OR_OP_NODE,
    NULL_COALESCING_OP_NODE,
    CONDITIONAL_OP_NODE,

    FUNCTION_NODE,
    PROTO_INIT_NODE,
  }

  /**
   * Gets this node's kind (corresponding to this node's specific type).
   *
   * @return This node's kind (corresponding to this node's specific type).
   */
  public Kind getKind();

  /** Gets the data type of this node. */
  public SoyType getType();

  @Override
  public ParentExprNode getParent();

  /** See {@link Node#copy(CopyState)} for a description of the copy contract. */
  @Override
  public ExprNode copy(CopyState copyState);

  // -----------------------------------------------------------------------------------------------

  /** A node in an expression parse tree that may be a parent. */
  public static interface ParentExprNode extends ExprNode, ParentNode<ExprNode> {}

  // -----------------------------------------------------------------------------------------------

  /** A node representing an operator (with operands as children). */
  public static interface OperatorNode extends ParentExprNode {

    public Operator getOperator();
  }

  // -----------------------------------------------------------------------------------------------

  /** A node representing a primitive literal. */
  public static interface PrimitiveNode extends ExprNode {}
}

@@ -1667,23 +1667,8 @@
 E,%0A%0A
-    VAR_NODE,%0A%0A
     

Delete a dead ExprNode kind