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

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

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

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

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