package org.eclipse.photran.internal.core.lexer;

import org.eclipse.core.resources.IFile;

/**
 * <code>IToken</code>s are produced by the lexical analyzer and are
 * generated by a <code>TokenFactory</code>.
 * 
 * @author Jeff Overbey
 */
public interface IToken
{
    ///////////////////////////////////////////////////////////////////////////
    // Accessor/Mutator Methods
    ///////////////////////////////////////////////////////////////////////////

    /**
     * Returns the Terminal that this token is an instance of
     */
    public Terminal getTerminal();

    /**
     * Sets the Terminal that this token is an instance of
     */
    public void setTerminal(Terminal value);

    /**
     * Returns the token text
     */
    public String getText();

    /**
     * Sets the token text
     */
    public void setText(String value);

    /**
     * Returns whitespace and whitetext appearing before this token that should be associated with this token
     */
    public String getWhiteBefore();

    /**
     * Sets whitespace and whitetext appearing before this token that should be associated with this token
     */
    public void setWhiteBefore(String value);

    /**
     * Returns whitespace and whitetext appearing after this token that should be associated with this token, not the next
     */
    public String getWhiteAfter();

    /**
     * Sets whitespace and whitetext appearing after this token that should be associated with this token, not the next
     */
    public void setWhiteAfter(String value);
//
//    public String getPreprocessorDirective()
//    {
//        return preprocessorDirective;
//    }
//
//    public void setPreprocessorDirective(String preprocessorDirective)
//    {
//        this.preprocessorDirective = preprocessorDirective;
//    }

    public int getLine();
    public void setLine(int line);
    
    public int getCol();
    public void setCol(int col);

    public IFile getFile();
    public void setFile(IFile file);
    
    public int getFileOffset();
    public void setFileOffset(int fileOffset);

    public int getStreamOffset();
    public void setStreamOffset(int streamOffset);

    public int getLength();
    public void setLength(int length);
    
    public String getPreprocessorDirective();
    public void setPreprocessorDirective(String preprocessorDirective);
    
//    public Object getBinding()
//    {
//        return binding;
//    }
//    
//    public void setBinding(Object binding)
//    {
//        this.binding = binding;
//    }
//    
//    public Object getScope()
//    {
//        return scope;
//    }
//    
//    public void setScope(Object scope)
//    {
//        this.scope = scope;
//    }
//
//    public boolean containsFileOffset(OffsetLength other)
//    {
//        return OffsetLength.contains(fileOffset, length, other);
//    }
//    
//    public boolean isOnOrAfterFileOffset(int targetOffset)
//    {
//        return fileOffset >= targetOffset;
//    }
//
//    public boolean containsStreamOffset(OffsetLength other)
//    {
//        return OffsetLength.contains(streamOffset, length, other);
//    }
//    
//    public boolean isOnOrAfterStreamOffset(int targetOffset)
//    {
//        return streamOffset >= targetOffset;
//    }
//
//    ///////////////////////////////////////////////////////////////////////////
//    // Visitor Support
//    ///////////////////////////////////////////////////////////////////////////
//
//    @Override protected void visitTopDownUsing(ASTVisitor visitor, boolean shouldVisitRoot)
//    {
//        if (shouldVisitRoot)
//            visitor.visitToken(this);
//    }
//
//    @Override protected void visitBottomUpUsing(ASTVisitor visitor, boolean shouldVisitRoot)
//    {
//        if (shouldVisitRoot)
//            visitor.visitToken(this);
//    }
//
//    public void visitUsing(GenericParseTreeVisitor visitor)
//    {
//        visitor.visitToken(this);
//    }
//
//    ///////////////////////////////////////////////////////////////////////////
//    // Debugging Output
//    ///////////////////////////////////////////////////////////////////////////
//    
//    public String toString(int numSpaces) { return indent(numSpaces) + getDescription() + "\n"; }
//
//    /**
//     * Returns a string describing the token
//     */
//    public String getDescription() { return terminal.toString() + ": \"" + text + "\""; }
//    
//    ///////////////////////////////////////////////////////////////////////////
//    // Source Code Reproduction
//    ///////////////////////////////////////////////////////////////////////////
//    
//    public String printOn(PrintStream out, String currentPreprocessorDirective)
//    {
//        if (this.preprocessorDirective != currentPreprocessorDirective)
//        {
//            if (this.preprocessorDirective != null)
//            {
//                out.print(whiteBefore);
//                out.print(this.preprocessorDirective);
//            }
//            currentPreprocessorDirective = this.preprocessorDirective;
//        }
//        
//        if (currentPreprocessorDirective == null && this.preprocessorDirective == null)
//        {
//            out.print(whiteBefore);
//            out.print(text);
//            out.print(whiteAfter);
//        }
//        
//        return currentPreprocessorDirective;
//    }
}
