/**
* 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 59:  InstantiationAST ::= instanceOf RelationshipBodyAST
 *</b>
 */
public class InstantiationAST1 extends ASTNode implements IInstantiationAST
{
    private RelationshipBodyAST _RelationshipBodyAST;

    public RelationshipBodyAST getRelationshipBodyAST() { return _RelationshipBodyAST; }

    public InstantiationAST1(IToken leftIToken, IToken rightIToken,
                             RelationshipBodyAST _RelationshipBodyAST)
    {
        super(leftIToken, rightIToken);

        this._RelationshipBodyAST = _RelationshipBodyAST;
        ((ASTNode) _RelationshipBodyAST).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 InstantiationAST1)) return false;
        InstantiationAST1 other = (InstantiationAST1) o;
        if (! _RelationshipBodyAST.equals(other.getRelationshipBodyAST())) return false;
        return true;
    }

    public int hashCode()
    {
        int hash = 7;
        hash = hash * 31 + (getRelationshipBodyAST().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); }
}


