diff options
Diffstat (limited to 'src/compiler/GF/Infra')
| -rw-r--r-- | src/compiler/GF/Infra/Location.hs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/src/compiler/GF/Infra/Location.hs b/src/compiler/GF/Infra/Location.hs new file mode 100644 index 000000000..b38482ff9 --- /dev/null +++ b/src/compiler/GF/Infra/Location.hs @@ -0,0 +1,31 @@ +module GF.Infra.Location where +import GF.Text.Pretty + +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) + | b == e = fpath <> ":" <> b + | otherwise = fpath <> ":" <> b <> "-" <> e + + +ppL (L loc x) msg = hang (ppLocation "" loc<>":") 4 + ("In"<+>x<>":"<+>msg) |
