/**
* Copyright (c) 2007 - 2009 OptXware Research and Development LLC.
* All rights reserved.   This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*   Daniel Varro - Initial API and implementation
*
* This file was generated automatically based upon the VTCL LPG Parser
* VTCLParser.g 
*/

package org.eclipse.viatra2.lpgparser.ast;

import lpg.lpgjavaruntime.*;

/**
 *<b>
 *<li>Rule 179:  VariableDefinitionAST ::= VariableDefAST TypeOptAST EQUAL ArithmeticTermAST
 *</b>
 */
public class VariableDefinitionAST extends ASTNode implements IVariableDefinitionAST
{
    private VariableDefAST _VariableDefAST;
    private TypeOptAST _TypeOptAST;
    private IArithmeticTermAST _ArithmeticTermAST;

    public VariableDefAST getVariableDefAST() { return _VariableDefAST; }
    /**
     * The value returned by <b>getTypeOptAST</b> may be <b>null</b>
     */
    public TypeOptAST getTypeOptAST() { return _TypeOptAST; }
    public IArithmeticTermAST getArithmeticTermAST() { return _ArithmeticTermAST; }

    public VariableDefinitionAST(IToken leftIToken, IToken rightIToken,
                                 VariableDefAST _VariableDefAST,
                                 TypeOptAST _TypeOptAST,
                                 IArithmeticTermAST _ArithmeticTermAST)
    {
        super(leftIToken, rightIToken);

        this._VariableDefAST = _VariableDefAST;
        ((ASTNode) _VariableDefAST).setParent(this);
        this._TypeOptAST = _TypeOptAST;
        if (_TypeOptAST != null) ((ASTNode) _TypeOptAST).setParent(this);
        this._ArithmeticTermAST = _ArithmeticTermAST;
        ((ASTNode) _ArithmeticTermAST).setParent(this);
        initialize();
    }

    public boolean equals(Object o)
    {
        if (o == this) return true;
        //
        // The supers call is not required for now because Ast nodes
        // can only extend the root Ast, AstToken and AstList and none
        // of these nodes contain children.
        //
        // if (! super.equals(o)) return false;
        //
        if (! (o instanceof VariableDefinitionAST)) return false;
        VariableDefinitionAST other = (VariableDefinitionAST) o;
        if (! _VariableDefAST.equals(other.getVariableDefAST())) return false;
        if (_TypeOptAST == null && other.getTypeOptAST() != null) return false;
        else if (! _TypeOptAST.equals(other.getTypeOptAST())) return false;
        if (! _ArithmeticTermAST.equals(other.getArithmeticTermAST())) return false;
        return true;
    }

    public int hashCode()
    {
        int hash = 7;
        hash = hash * 31 + (getVariableDefAST().hashCode());
        hash = hash * 31 + (getTypeOptAST() == null ? 0 : getTypeOptAST().hashCode());
        hash = hash * 31 + (getArithmeticTermAST().hashCode());
        return hash;
    }

    public void accept(Visitor v) { v.visit(this); }
    public void accept(ArgumentVisitor v, Object o) { v.visit(this, o); }
    public Object accept(ResultVisitor v) { return v.visit(this); }
    public Object accept(ResultArgumentVisitor v, Object o) { return v.visit(this, o); }
}


