{-# LANGUAGE RecordWildCards #-}

module GHC.Rename.Lit where

import GHC.Prelude

import GHC.Builtin.Names
import GHC.Hs
import GHC.Rename.Env (lookupNameWithQualifier)
import GHC.Rename.Utils (genHsApps, genLHsLit)
import GHC.Tc.Utils.Monad (RnM)
import GHC.Types.Name.Set (FreeVars)
import GHC.Types.SrcLoc (GenLocated(..))

rnQualLit :: HsQualLit GhcPs -> RnM ((HsQualLit GhcRn, HsExpr GhcRn), FreeVars)
rnQualLit :: HsQualLit GhcPs -> RnM ((HsQualLit GhcRn, HsExpr GhcRn), FreeVars)
rnQualLit QualLit{XQualLit GhcPs
ModuleName
QualLitVal
ql_ext :: XQualLit GhcPs
ql_mod :: ModuleName
ql_val :: QualLitVal
ql_val :: forall p. HsQualLit p -> QualLitVal
ql_mod :: forall p. HsQualLit p -> ModuleName
ql_ext :: forall p. HsQualLit p -> XQualLit p
..} = do
  let (Name
funNameBase, HsLit GhcRn
hsLit) =
        case QualLitVal
ql_val of
          -- See Note [Implementation of QualifiedStrings]
          HsQualString SourceText
st FastString
s -> (Name
fromStringName, XHsString GhcRn -> FastString -> HsLit GhcRn
forall x. XHsString x -> FastString -> HsLit x
HsString XHsString GhcRn
SourceText
st FastString
s)
  (funName, fvs) <- Name -> ModuleName -> RnM (Name, FreeVars)
lookupNameWithQualifier Name
funNameBase ModuleName
ql_mod
  let lit = QualLit{ql_ext :: XQualLit GhcRn
ql_ext = SrcSpanAnnN -> Name -> GenLocated SrcSpanAnnN Name
forall l e. l -> e -> GenLocated l e
L SrcSpanAnnN
forall a. NoAnn a => a
noAnn Name
funName, ModuleName
QualLitVal
ql_mod :: ModuleName
ql_val :: QualLitVal
ql_val :: QualLitVal
ql_mod :: ModuleName
..}
  let expr = Name -> [LHsExpr GhcRn] -> HsExpr GhcRn
genHsApps Name
funName [HsLit GhcRn -> LocatedAn AnnListItem (HsExpr GhcRn)
forall an. NoAnn an => HsLit GhcRn -> LocatedAn an (HsExpr GhcRn)
genLHsLit HsLit GhcRn
hsLit]
  pure ((lit, expr), fvs)