/**
* 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 102:  AsmFunctionDefAST ::= OptAnnotationsAST asmfunction TypeNameAST ArityOrTypeDeclAST ReturnTypeOptAST InitialValuesOptAST
 *</b>
 */
public class AsmFunctionDefAST extends ASTNode implements IAsmFunctionDefAST
{
    private IOptAnnotationsAST _OptAnnotationsAST;
    private ITypeNameAST _TypeNameAST;
    private IArityOrTypeDeclAST _ArityOrTypeDeclAST;
    private ReturnTypeOptAST _ReturnTypeOptAST;
    private IInitialValuesOptAST _InitialValuesOptAST;

    /**
     * The value returned by <b>getOptAnnotationsAST</b> may be <b>null</b>
     */
    public IOptAnnotationsAST getOptAnnotationsAST() { return _OptAnnotationsAST; }
    public ITypeNameAST getTypeNameAST() { return _TypeNameAST; }
    public IArityOrTypeDeclAST getArityOrTypeDeclAST() { return _ArityOrTypeDeclAST; }
    /**
     * The value returned by <b>getReturnTypeOptAST</b> may be <b>null</b>
     */
    public ReturnTypeOptAST getReturnTypeOptAST() { return _ReturnTypeOptAST; }
    public IInitialValuesOptAST getInitialValuesOptAST() { return _InitialValuesOptAST; }

    public AsmFunctionDefAST(IToken leftIToken, IToken rightIToken,
                             IOptAnnotationsAST _OptAnnotationsAST,
                             ITypeNameAST _TypeNameAST,
                             IArityOrTypeDeclAST _ArityOrTypeDeclAST,
                             ReturnTypeOptAST _ReturnTypeOptAST,
                             IInitialValuesOptAST _InitialValuesOptAST)
    {
        super(leftIToken, rightIToken);

        this._OptAnnotationsAST = _OptAnnotationsAST;
        if (_OptAnnotationsAST != null) ((ASTNode) _OptAnnotationsAST).setParent(this);
        this._TypeNameAST = _TypeNameAST;
        ((ASTNode) _TypeNameAST).setParent(this);
        this._ArityOrTypeDeclAST = _ArityOrTypeDeclAST;
        ((ASTNode) _ArityOrTypeDeclAST).setParent(this);
        this._ReturnTypeOptAST = _ReturnTypeOptAST;
        if (_ReturnTypeOptAST != null) ((ASTNode) _ReturnTypeOptAST).setParent(this);
        this._InitialValuesOptAST = _InitialValuesOptAST;
        ((ASTNode) _InitialValuesOptAST).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 AsmFunctionDefAST)) return false;
        AsmFunctionDefAST other = (AsmFunctionDefAST) o;
        if (_OptAnnotationsAST == null && other.getOptAnnotationsAST() != null) return false;
        else if (! _OptAnnotationsAST.equals(other.getOptAnnotationsAST())) return false;
        if (! _TypeNameAST.equals(other.getTypeNameAST())) return false;
        if (! _ArityOrTypeDeclAST.equals(other.getArityOrTypeDeclAST())) return false;
        if (_ReturnTypeOptAST == null && other.getReturnTypeOptAST() != null) return false;
        else if (! _ReturnTypeOptAST.equals(other.getReturnTypeOptAST())) return false;
        if (! _InitialValuesOptAST.equals(other.getInitialValuesOptAST())) return false;
        return true;
    }

    public int hashCode()
    {
        int hash = 7;
        hash = hash * 31 + (getOptAnnotationsAST() == null ? 0 : getOptAnnotationsAST().hashCode());
        hash = hash * 31 + (getTypeNameAST().hashCode());
        hash = hash * 31 + (getArityOrTypeDeclAST().hashCode());
        hash = hash * 31 + (getReturnTypeOptAST() == null ? 0 : getReturnTypeOptAST().hashCode());
        hash = hash * 31 + (getInitialValuesOptAST().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); }
}


