summaryrefslogtreecommitdiff
path: root/src/compiler/GF/Infra
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/GF/Infra')
-rw-r--r--src/compiler/GF/Infra/Location.hs31
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)