/**
* 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 56:  InheritanceAST ::= supertypeOf RelationshipBodyAST
 *</b>
 */
public class InheritanceAST0 extends ASTNode implements IInheritanceAST
{
    private RelationshipBodyAST _RelationshipBodyAST;

    public RelationshipBodyAST getRelationshipBodyAST() { return _RelationshipBodyAST; }

    public InheritanceAST0(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 InheritanceAST0)) return false;
        InheritanceAST0 other = (InheritanceAST0) 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); }
}


