{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module GHC.Hs.Lit
( module Language.Haskell.Syntax.Lit
, module GHC.Hs.Lit
) where
import GHC.Prelude
import {-# SOURCE #-} GHC.Hs.Expr( pprExpr )
import GHC.Types.Basic (PprPrec(..), topPrec )
import GHC.Core.Ppr ( )
import GHC.Types.SourceText
import GHC.Core.Type
import GHC.Utils.Outputable
import GHC.Hs.Extension
import Language.Haskell.Syntax.Expr ( HsExpr )
import Language.Haskell.Syntax.Extension
import Language.Haskell.Syntax.Lit
type instance XHsChar (GhcPass _) = SourceText
type instance XHsCharPrim (GhcPass _) = SourceText
type instance XHsString (GhcPass _) = SourceText
type instance XHsStringPrim (GhcPass _) = SourceText
type instance XHsInt (GhcPass _) = NoExtField
type instance XHsIntPrim (GhcPass _) = SourceText
type instance XHsWordPrim (GhcPass _) = SourceText
type instance XHsInt64Prim (GhcPass _) = SourceText
type instance XHsWord64Prim (GhcPass _) = SourceText
type instance XHsInteger (GhcPass _) = SourceText
type instance XHsRat (GhcPass _) = NoExtField
type instance XHsFloatPrim (GhcPass _) = NoExtField
type instance XHsDoublePrim (GhcPass _) = NoExtField
type instance XXLit (GhcPass _) = DataConCantHappen
data OverLitRn
= OverLitRn {
OverLitRn -> Bool
ol_rebindable :: Bool,
OverLitRn -> LIdP GhcRn
ol_from_fun :: LIdP GhcRn
}
data OverLitTc
= OverLitTc {
OverLitTc -> Bool
ol_rebindable :: Bool,
OverLitTc -> HsExpr GhcTc
ol_witness :: HsExpr GhcTc,
OverLitTc -> Type
ol_type :: Type }
type instance XOverLit GhcPs = NoExtField
type instance XOverLit GhcRn = OverLitRn
type instance XOverLit GhcTc = OverLitTc
pprXOverLit :: GhcPass p -> XOverLit (GhcPass p) -> SDoc
pprXOverLit :: forall (p :: Pass). GhcPass p -> XOverLit (GhcPass p) -> SDoc
pprXOverLit GhcPass p
GhcPs XOverLit (GhcPass p)
noExt = NoExtField -> SDoc
forall a. Outputable a => a -> SDoc
ppr XOverLit (GhcPass p)
NoExtField
noExt
pprXOverLit GhcPass p
GhcRn OverLitRn{ $sel:ol_from_fun:OverLitRn :: OverLitRn -> LIdP GhcRn
ol_from_fun = LIdP GhcRn
from_fun } = GenLocated SrcSpanAnnN Name -> SDoc
forall a. Outputable a => a -> SDoc
ppr LIdP GhcRn
GenLocated SrcSpanAnnN Name
from_fun
pprXOverLit GhcPass p
GhcTc OverLitTc{ $sel:ol_witness:OverLitTc :: OverLitTc -> HsExpr GhcTc
ol_witness = HsExpr GhcTc
witness } = HsExpr GhcTc -> SDoc
forall (p :: Pass).
OutputableBndrId p =>
HsExpr (GhcPass p) -> SDoc
pprExpr HsExpr GhcTc
witness
type instance XXOverLit (GhcPass _) = DataConCantHappen
overLitType :: HsOverLit GhcTc -> Type
overLitType :: HsOverLit GhcTc -> Type
overLitType (OverLit OverLitTc{ $sel:ol_type:OverLitTc :: OverLitTc -> Type
ol_type = Type
ty } OverLitVal
_) = Type
ty
hsOverLitNeedsParens :: PprPrec -> HsOverLit x -> Bool
hsOverLitNeedsParens :: forall x. PprPrec -> HsOverLit x -> Bool
hsOverLitNeedsParens PprPrec
p (OverLit { ol_val :: forall p. HsOverLit p -> OverLitVal
ol_val = OverLitVal
olv }) = OverLitVal -> Bool
go OverLitVal
olv
where
go :: OverLitVal -> Bool
go :: OverLitVal -> Bool
go (HsIntegral IntegralLit
x) = PprPrec
p PprPrec -> PprPrec -> Bool
forall a. Ord a => a -> a -> Bool
> PprPrec
topPrec Bool -> Bool -> Bool
&& IntegralLit -> Bool
il_neg IntegralLit
x
go (HsFractional FractionalLit
x) = PprPrec
p PprPrec -> PprPrec -> Bool
forall a. Ord a => a -> a -> Bool
> PprPrec
topPrec Bool -> Bool -> Bool
&& FractionalLit -> Bool
fl_neg FractionalLit
x
go (HsIsString {}) = Bool
False
hsOverLitNeedsParens PprPrec
_ (XOverLit { }) = Bool
False
hsLitNeedsParens :: PprPrec -> HsLit x -> Bool
hsLitNeedsParens :: forall x. PprPrec -> HsLit x -> Bool
hsLitNeedsParens PprPrec
p = HsLit x -> Bool
go
where
go :: HsLit x -> Bool
go (HsChar {}) = Bool
False
go (HsCharPrim {}) = Bool
False
go (HsString {}) = Bool
False
go (HsStringPrim {}) = Bool
False
go (HsInt XHsInt x
_ IntegralLit
x) = PprPrec
p PprPrec -> PprPrec -> Bool
forall a. Ord a => a -> a -> Bool
> PprPrec
topPrec Bool -> Bool -> Bool
&& IntegralLit -> Bool
il_neg IntegralLit
x
go (HsIntPrim {}) = Bool
False
go (HsWordPrim {}) = Bool
False
go (HsInt64Prim {}) = Bool
False
go (HsWord64Prim {}) = Bool
False
go (HsInteger XHsInteger x
_ Integer
x Type
_) = PprPrec
p PprPrec -> PprPrec -> Bool
forall a. Ord a => a -> a -> Bool
> PprPrec
topPrec Bool -> Bool -> Bool
&& Integer
x Integer -> Integer -> Bool
forall a. Ord a => a -> a -> Bool
< Integer
0
go (HsRat XHsRat x
_ FractionalLit
x Type
_) = PprPrec
p PprPrec -> PprPrec -> Bool
forall a. Ord a => a -> a -> Bool
> PprPrec
topPrec Bool -> Bool -> Bool
&& FractionalLit -> Bool
fl_neg FractionalLit
x
go (HsFloatPrim {}) = Bool
False
go (HsDoublePrim {}) = Bool
False
go (XLit XXLit x
_) = Bool
False
convertLit :: HsLit (GhcPass p1) -> HsLit (GhcPass p2)
convertLit :: forall (p1 :: Pass) (p2 :: Pass).
HsLit (GhcPass p1) -> HsLit (GhcPass p2)
convertLit (HsChar XHsChar (GhcPass p1)
a Char
x) = XHsChar (GhcPass p2) -> Char -> HsLit (GhcPass p2)
forall x. XHsChar x -> Char -> HsLit x
HsChar XHsChar (GhcPass p1)
XHsChar (GhcPass p2)
a Char
x
convertLit (HsCharPrim XHsCharPrim (GhcPass p1)
a Char
x) = XHsCharPrim (GhcPass p2) -> Char -> HsLit (GhcPass p2)
forall x. XHsCharPrim x -> Char -> HsLit x
HsCharPrim XHsCharPrim (GhcPass p1)
XHsCharPrim (GhcPass p2)
a Char
x
convertLit (HsString XHsString (GhcPass p1)
a FastString
x) = XHsString (GhcPass p2) -> FastString -> HsLit (GhcPass p2)
forall x. XHsString x -> FastString -> HsLit x
HsString XHsString (GhcPass p1)
XHsString (GhcPass p2)
a FastString
x
convertLit (HsStringPrim XHsStringPrim (GhcPass p1)
a ByteString
x) = XHsStringPrim (GhcPass p2) -> ByteString -> HsLit (GhcPass p2)
forall x. XHsStringPrim x -> ByteString -> HsLit x
HsStringPrim XHsStringPrim (GhcPass p1)
XHsStringPrim (GhcPass p2)
a ByteString
x
convertLit (HsInt XHsInt (GhcPass p1)
a IntegralLit
x) = XHsInt (GhcPass p2) -> IntegralLit -> HsLit (GhcPass p2)
forall x. XHsInt x -> IntegralLit -> HsLit x
HsInt XHsInt (GhcPass p1)
XHsInt (GhcPass p2)
a IntegralLit
x
convertLit (HsIntPrim XHsIntPrim (GhcPass p1)
a Integer
x) = XHsIntPrim (GhcPass p2) -> Integer -> HsLit (GhcPass p2)
forall x. XHsIntPrim x -> Integer -> HsLit x
HsIntPrim XHsIntPrim (GhcPass p1)
XHsIntPrim (GhcPass p2)
a Integer
x
convertLit (HsWordPrim XHsWordPrim (GhcPass p1)
a Integer
x) = XHsWordPrim (GhcPass p2) -> Integer -> HsLit (GhcPass p2)
forall x. XHsWordPrim x -> Integer -> HsLit x
HsWordPrim XHsWordPrim (GhcPass p1)
XHsWordPrim (GhcPass p2)
a Integer
x
convertLit (HsInt64Prim XHsInt64Prim (GhcPass p1)
a Integer
x) = XHsInt64Prim (GhcPass p2) -> Integer -> HsLit (GhcPass p2)
forall x. XHsInt64Prim x -> Integer -> HsLit x
HsInt64Prim XHsInt64Prim (GhcPass p1)
XHsInt64Prim (GhcPass p2)
a Integer
x
convertLit (HsWord64Prim XHsWord64Prim (GhcPass p1)
a Integer
x) = XHsWord64Prim (GhcPass p2) -> Integer -> HsLit (GhcPass p2)
forall x. XHsWord64Prim x -> Integer -> HsLit x
HsWord64Prim XHsWord64Prim (GhcPass p1)
XHsWord64Prim (GhcPass p2)
a Integer
x
convertLit (HsInteger XHsInteger (GhcPass p1)
a Integer
x Type
b) = XHsInteger (GhcPass p2) -> Integer -> Type -> HsLit (GhcPass p2)
forall x. XHsInteger x -> Integer -> Type -> HsLit x
HsInteger XHsInteger (GhcPass p1)
XHsInteger (GhcPass p2)
a Integer
x Type
b
convertLit (HsRat XHsRat (GhcPass p1)
a FractionalLit
x Type
b) = XHsRat (GhcPass p2) -> FractionalLit -> Type -> HsLit (GhcPass p2)
forall x. XHsRat x -> FractionalLit -> Type -> HsLit x
HsRat XHsRat (GhcPass p1)
XHsRat (GhcPass p2)
a FractionalLit
x Type
b
convertLit (HsFloatPrim XHsFloatPrim (GhcPass p1)
a FractionalLit
x) = XHsFloatPrim (GhcPass p2) -> FractionalLit -> HsLit (GhcPass p2)
forall x. XHsFloatPrim x -> FractionalLit -> HsLit x
HsFloatPrim XHsFloatPrim (GhcPass p1)
XHsFloatPrim (GhcPass p2)
a FractionalLit
x
convertLit (HsDoublePrim XHsDoublePrim (GhcPass p1)
a FractionalLit
x) = XHsDoublePrim (GhcPass p2) -> FractionalLit -> HsLit (GhcPass p2)
forall x. XHsDoublePrim x -> FractionalLit -> HsLit x
HsDoublePrim XHsDoublePrim (GhcPass p1)
XHsDoublePrim (GhcPass p2)
a FractionalLit
x
instance Outputable (HsLit (GhcPass p)) where
ppr :: HsLit (GhcPass p) -> SDoc
ppr (HsChar XHsChar (GhcPass p)
st Char
c) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsChar (GhcPass p)
SourceText
st (Char -> SDoc
pprHsChar Char
c)
ppr (HsCharPrim XHsCharPrim (GhcPass p)
st Char
c) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsCharPrim (GhcPass p)
SourceText
st (Char -> SDoc
pprPrimChar Char
c)
ppr (HsString XHsString (GhcPass p)
st FastString
s) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsString (GhcPass p)
SourceText
st (FastString -> SDoc
pprHsString FastString
s)
ppr (HsStringPrim XHsStringPrim (GhcPass p)
st ByteString
s) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsStringPrim (GhcPass p)
SourceText
st (ByteString -> SDoc
pprHsBytes ByteString
s)
ppr (HsInt XHsInt (GhcPass p)
_ IntegralLit
i)
= SourceText -> SDoc -> SDoc
pprWithSourceText (IntegralLit -> SourceText
il_text IntegralLit
i) (Integer -> SDoc
forall doc. IsLine doc => Integer -> doc
integer (IntegralLit -> Integer
il_value IntegralLit
i))
ppr (HsInteger XHsInteger (GhcPass p)
st Integer
i Type
_) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsInteger (GhcPass p)
SourceText
st (Integer -> SDoc
forall doc. IsLine doc => Integer -> doc
integer Integer
i)
ppr (HsRat XHsRat (GhcPass p)
_ FractionalLit
f Type
_) = FractionalLit -> SDoc
forall a. Outputable a => a -> SDoc
ppr FractionalLit
f
ppr (HsFloatPrim XHsFloatPrim (GhcPass p)
_ FractionalLit
f) = FractionalLit -> SDoc
forall a. Outputable a => a -> SDoc
ppr FractionalLit
f SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
primFloatSuffix
ppr (HsDoublePrim XHsDoublePrim (GhcPass p)
_ FractionalLit
d) = FractionalLit -> SDoc
forall a. Outputable a => a -> SDoc
ppr FractionalLit
d SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<> SDoc
primDoubleSuffix
ppr (HsIntPrim XHsIntPrim (GhcPass p)
st Integer
i) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsIntPrim (GhcPass p)
SourceText
st (Integer -> SDoc
pprPrimInt Integer
i)
ppr (HsWordPrim XHsWordPrim (GhcPass p)
st Integer
w) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsWordPrim (GhcPass p)
SourceText
st (Integer -> SDoc
pprPrimWord Integer
w)
ppr (HsInt64Prim XHsInt64Prim (GhcPass p)
st Integer
i) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsInt64Prim (GhcPass p)
SourceText
st (Integer -> SDoc
pprPrimInt64 Integer
i)
ppr (HsWord64Prim XHsWord64Prim (GhcPass p)
st Integer
w) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsWord64Prim (GhcPass p)
SourceText
st (Integer -> SDoc
pprPrimWord64 Integer
w)
instance OutputableBndrId p
=> Outputable (HsOverLit (GhcPass p)) where
ppr :: HsOverLit (GhcPass p) -> SDoc
ppr (OverLit {ol_val :: forall p. HsOverLit p -> OverLitVal
ol_val=OverLitVal
val, ol_ext :: forall p. HsOverLit p -> XOverLit p
ol_ext=XOverLit (GhcPass p)
ext})
= OverLitVal -> SDoc
forall a. Outputable a => a -> SDoc
ppr OverLitVal
val SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> (SDoc -> SDoc
forall doc. IsOutput doc => doc -> doc
whenPprDebug (SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
parens (GhcPass p -> XOverLit (GhcPass p) -> SDoc
forall (p :: Pass). GhcPass p -> XOverLit (GhcPass p) -> SDoc
pprXOverLit (forall (p :: Pass). IsPass p => GhcPass p
ghcPass @p) XOverLit (GhcPass p)
ext)))
instance Outputable OverLitVal where
ppr :: OverLitVal -> SDoc
ppr (HsIntegral IntegralLit
i) = SourceText -> SDoc -> SDoc
pprWithSourceText (IntegralLit -> SourceText
il_text IntegralLit
i) (Integer -> SDoc
forall doc. IsLine doc => Integer -> doc
integer (IntegralLit -> Integer
il_value IntegralLit
i))
ppr (HsFractional FractionalLit
f) = FractionalLit -> SDoc
forall a. Outputable a => a -> SDoc
ppr FractionalLit
f
ppr (HsIsString SourceText
st FastString
s) = SourceText -> SDoc -> SDoc
pprWithSourceText SourceText
st (FastString -> SDoc
pprHsString FastString
s)
pmPprHsLit :: HsLit (GhcPass x) -> SDoc
pmPprHsLit :: forall (p :: Pass). HsLit (GhcPass p) -> SDoc
pmPprHsLit (HsChar XHsChar (GhcPass x)
_ Char
c) = Char -> SDoc
pprHsChar Char
c
pmPprHsLit (HsCharPrim XHsCharPrim (GhcPass x)
_ Char
c) = Char -> SDoc
pprHsChar Char
c
pmPprHsLit (HsString XHsString (GhcPass x)
st FastString
s) = SourceText -> SDoc -> SDoc
pprWithSourceText XHsString (GhcPass x)
SourceText
st (FastString -> SDoc
pprHsString FastString
s)
pmPprHsLit (HsStringPrim XHsStringPrim (GhcPass x)
_ ByteString
s) = ByteString -> SDoc
pprHsBytes ByteString
s
pmPprHsLit (HsInt XHsInt (GhcPass x)
_ IntegralLit
i) = Integer -> SDoc
forall doc. IsLine doc => Integer -> doc
integer (IntegralLit -> Integer
il_value IntegralLit
i)
pmPprHsLit (HsIntPrim XHsIntPrim (GhcPass x)
_ Integer
i) = Integer -> SDoc
forall doc. IsLine doc => Integer -> doc
integer Integer
i
pmPprHsLit (HsWordPrim XHsWordPrim (GhcPass x)
_ Integer
w) = Integer -> SDoc
forall doc. IsLine doc => Integer -> doc
integer Integer
w
pmPprHsLit (HsInt64Prim XHsInt64Prim (GhcPass x)
_ Integer
i) = Integer -> SDoc
forall doc. IsLine doc => Integer -> doc
integer Integer
i
pmPprHsLit (HsWord64Prim XHsWord64Prim (GhcPass x)
_ Integer
w) = Integer -> SDoc
forall doc. IsLine doc => Integer -> doc
integer Integer
w
pmPprHsLit (HsInteger XHsInteger (GhcPass x)
_ Integer
i Type
_) = Integer -> SDoc
forall doc. IsLine doc => Integer -> doc
integer Integer
i
pmPprHsLit (HsRat XHsRat (GhcPass x)
_ FractionalLit
f Type
_) = FractionalLit -> SDoc
forall a. Outputable a => a -> SDoc
ppr FractionalLit
f
pmPprHsLit (HsFloatPrim XHsFloatPrim (GhcPass x)
_ FractionalLit
f) = FractionalLit -> SDoc
forall a. Outputable a => a -> SDoc
ppr FractionalLit
f
pmPprHsLit (HsDoublePrim XHsDoublePrim (GhcPass x)
_ FractionalLit
d) = FractionalLit -> SDoc
forall a. Outputable a => a -> SDoc
ppr FractionalLit
d