/* 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 TLinclude extends Token
{
    public TLinclude()
    {
        super.setText("linclude");
    }

    public TLinclude(int line, int pos)
    {
        super.setText("linclude");
        setLine(line);
        setPos(pos);
    }

    @Override
    public Object clone()
    {
      return new TLinclude(getLine(), getPos());
    }

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

    @Override
    public void setText(@SuppressWarnings("unused") String text)
    {
        throw new RuntimeException("Cannot change TLinclude text.");
    }
}
