/**
* 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 25:  PatternBodyContentDefAST ::= neg GraphPatternDefAST
 *</b>
 */
public class PatternBodyContentDefAST1 extends ASTNode implements IPatternBodyContentDefAST
{
    private GraphPatternDefAST _GraphPatternDefAST;

    public GraphPatternDefAST getGraphPatternDefAST() { return _GraphPatternDefAST; }

    public PatternBodyContentDefAST1(IToken leftIToken, IToken rightIToken,
                                     GraphPatternDefAST _GraphPatternDefAST)
    {
        super(leftIToken, rightIToken);

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

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


