forked from GitHub/gf-core
* In GHC 8.4.1, the operator <> has become a method of the Semigroup class
and is exported from the Prelude. This is unfortunate, since <> is also
exported from the standard library module Text.PrettyPrint, so in any
module that defines a pretty printer, there is likely to be an ambiguity.
This affects ~18 modules in GF. Solution:
import Prelude hiding (<>)
This works also in older versions of GHC, since GHC does't complain if
you hide something that doesn't exists.
* In GHC 8.4.1, Semigroup has become a superclass of Monoid. This means
that anywhere you define an instance of the Monoid class you also have to
define an instance in the Semigroup class.
This affects Data.Binary.Builder in GF. Solution: conditionally define
a Semigroup instance if compiling with base>=4.11 (ghc>=8.4.1)
42 lines
976 B
Haskell
42 lines
976 B
Haskell
-- | Source locations
|
|
module GF.Infra.Location where
|
|
import Prelude hiding ((<>)) -- GHC 8.4.1 clash with Text.PrettyPrint
|
|
import GF.Text.Pretty
|
|
|
|
-- ** Source locations
|
|
|
|
class HasSourcePath a where sourcePath :: a -> FilePath
|
|
|
|
data Location
|
|
= NoLoc
|
|
| Local Int Int
|
|
| External FilePath Location
|
|
deriving (Show,Eq,Ord)
|
|
|
|
-- | Attaching location information
|
|
data L a = L Location a deriving Show
|
|
|
|
instance Functor L where fmap f (L loc x) = L loc (f x)
|
|
|
|
unLoc :: L a -> a
|
|
unLoc (L _ x) = x
|
|
|
|
noLoc = L NoLoc
|
|
|
|
ppLocation :: FilePath -> Location -> Doc
|
|
ppLocation fpath NoLoc = pp fpath
|
|
ppLocation fpath (External p l) = ppLocation p l
|
|
ppLocation fpath (Local b e) =
|
|
opt (fpath/="") (fpath <> ":") <> b <> opt (b/=e) ("-" <> e)
|
|
where
|
|
opt False x = empty
|
|
opt True x = x
|
|
|
|
ppL (L loc x) msg = hang (loc<>":") 4 ("In"<+>x<>":"<+>msg)
|
|
|
|
|
|
instance Pretty Location where pp = ppLocation ""
|
|
|
|
instance Pretty a => Pretty (L a) where pp (L loc x) = loc<>":"<>x
|
|
|