/**
* 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.*;

/**
 *<em>
 *<li>Rule 249:  ValueQualifiedNameAST ::= ValueLocalNameAST
 *</em>
 *<p>
 *<b>
 *<li>Rule 250:  ValueQualifiedNameAST ::= QualifiedTypeNameAST DOT TypeNameAST
 *</b>
 */
public class ValueQualifiedNameAST extends ASTNode implements IValueQualifiedNameAST
{
    private IQualifiedTypeNameAST _QualifiedTypeNameAST;
    private ITypeNameAST _TypeNameAST;

    public IQualifiedTypeNameAST getQualifiedTypeNameAST() { return _QualifiedTypeNameAST; }
    public ITypeNameAST getTypeNameAST() { return _TypeNameAST; }

    public ValueQualifiedNameAST(IToken leftIToken, IToken rightIToken,
                                 IQualifiedTypeNameAST _QualifiedTypeNameAST,
                                 ITypeNameAST _TypeNameAST)
    {
        super(leftIToken, rightIToken);

        this._QualifiedTypeNameAST = _QualifiedTypeNameAST;
        ((ASTNode) _QualifiedTypeNameAST).setParent(this);
        this._TypeNameAST = _TypeNameAST;
        ((ASTNode) _TypeNameAST).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 ValueQualifiedNameAST)) return false;
        ValueQualifiedNameAST other = (ValueQualifiedNameAST) o;
        if (! _QualifiedTypeNameAST.equals(other.getQualifiedTypeNameAST())) return false;
        if (! _TypeNameAST.equals(other.getTypeNameAST())) return false;
        return true;
    }

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


