{-# LANGUAGE DeriveDataTypeable #-}
module Language.Haskell.Preprocessor.Token (
  Token(..), Tag(..), newToken
) where

import Language.Haskell.Preprocessor.Loc
import Data.Typeable ()
import Data.Generics

data Token = Token { tag :: Tag,
                     com :: [Token],
                     loc :: Loc,
                     val :: String }
  deriving (Eq, Typeable, Data)

newToken :: Token
newToken = Token {
             tag = Other,
             com = [],
             loc = bogus,
             val = ""
           }

data Tag =
    CPragma
  | Variable
  | Constructor
  | Operator
  | Other
  | CharLit
  | StringLit
  | IntLit
  | FloatLit
  | VIndent
  | VDedent
  | VSemi
  | Comment
  | Error
  deriving (Eq, Show, Typeable, Data)

instance Show Token where
  showsPrec _ t = shows (tag t) . ('(':) . shows (val t) . (')':)

instance Locatable Token where
  getLoc     = loc
  setLoc t l = t { loc = l }