-- | Functions that convert the literals of the GHC AST to corresponding elements in the Haskell-tools AST representation
module Language.Haskell.Tools.AST.FromGHC.Literals where

import qualified Data.ByteString.Char8 as BS

import SrcLoc as GHC
import ApiAnnotation as GHC
import FastString as GHC
import BasicTypes as GHC
import HsLit as GHC
import HsTypes as GHC

import Language.Haskell.Tools.AST.FromGHC.Base
import Language.Haskell.Tools.AST.FromGHC.Monad
import Language.Haskell.Tools.AST.FromGHC.Utils

import Language.Haskell.Tools.AST (Dom, RangeStage)
import qualified Language.Haskell.Tools.AST as AST

trfLiteral' :: HsLit -> Trf (AST.Literal (Dom r) RangeStage)
trfLiteral' (HsChar _ ch) = pure $ AST.CharLit ch
trfLiteral' (HsCharPrim _ ch) = pure $ AST.PrimCharLit ch
trfLiteral' (HsString _ str) = pure $ AST.StringLit (unpackFS str)
trfLiteral' (HsStringPrim _ str) = pure $ AST.PrimStringLit (BS.foldr (:) "" str)
trfLiteral' (HsInt _ i) = pure $ AST.IntLit i
trfLiteral' (HsIntPrim _ i) = pure $ AST.PrimIntLit i
trfLiteral' (HsWordPrim _ i) = pure $ AST.PrimWordLit i
trfLiteral' (HsInt64Prim _ i) = pure $ AST.PrimIntLit i
trfLiteral' (HsWord64Prim _ i) = pure $ AST.PrimWordLit i
trfLiteral' (HsInteger _ i _) = pure $ AST.PrimIntLit i
trfLiteral' (HsRat frac _) = pure $ AST.FracLit (fl_value frac)
trfLiteral' (HsFloatPrim frac) = pure $ AST.PrimFloatLit (fl_value frac)
trfLiteral' (HsDoublePrim frac) = pure $ AST.PrimDoubleLit (fl_value frac)
  
trfOverloadedLit :: OverLitVal -> Trf (AST.Literal (Dom r) RangeStage)
trfOverloadedLit (HsIntegral _ i) = pure $ AST.IntLit i
trfOverloadedLit (HsFractional frac) = pure $ AST.FracLit (fl_value frac)
trfOverloadedLit (HsIsString _ str) = pure $ AST.StringLit (unpackFS str)