/**
* 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 68:  PostconditionOptAST ::= postcondition PatternCompositionAST
 *</b>
 */
public class PostconditionOptAST1 extends ASTNode implements IPostconditionOptAST
{
    private PatternCompositionAST _PatternCompositionAST;

    public PatternCompositionAST getPatternCompositionAST() { return _PatternCompositionAST; }

    public PostconditionOptAST1(IToken leftIToken, IToken rightIToken,
                                PatternCompositionAST _PatternCompositionAST)
    {
        super(leftIToken, rightIToken);

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

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


