/* This file was generated by SableCC (http://www.sablecc.org/). */

package com.google.clearsilver.jsilver.syntax.node;

import com.google.clearsilver.jsilver.syntax.analysis.*;

@SuppressWarnings("nls")
public final class ADecNumberVariable extends PVariable
{
    private TDecNumber _decNumber_;

    public ADecNumberVariable()
    {
        // Constructor
    }

    public ADecNumberVariable(
        @SuppressWarnings("hiding") TDecNumber _decNumber_)
    {
        // Constructor
        setDecNumber(_decNumber_);

    }

    @Override
    public Object clone()
    {
        return new ADecNumberVariable(
            cloneNode(this._decNumber_));
    }

    public void apply(Switch sw)
    {
        ((Analysis) sw).caseADecNumberVariable(this);
    }

    public TDecNumber getDecNumber()
    {
        return this._decNumber_;
    }

    public void setDecNumber(TDecNumber node)
    {
        if(this._decNumber_ != null)
        {
            this._decNumber_.parent(null);
        }

        if(node != null)
        {
            if(node.parent() != null)
            {
                node.parent().removeChild(node);
            }

            node.parent(this);
        }

        this._decNumber_ = node;
    }

    @Override
    public String toString()
    {
        return ""
            + toString(this._decNumber_);
    }

    @Override
    void removeChild(@SuppressWarnings("unused") Node child)
    {
        // Remove child
        if(this._decNumber_ == child)
        {
            this._decNumber_ = null;
            return;
        }

        throw new RuntimeException("Not a child.");
    }

    @Override
    void replaceChild(@SuppressWarnings("unused") Node oldChild, @SuppressWarnings("unused") Node newChild)
    {
        // Replace child
        if(this._decNumber_ == oldChild)
        {
            setDecNumber((TDecNumber) newChild);
            return;
        }

        throw new RuntimeException("Not a child.");
    }
}
