{-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} -- | This module allows embedding source modules -- Example: -- -- example1 :: IO ParseResult -- example1 = [tsrc| -- mod ule Main where -- a=1 -- |] -- -- Filename and line where error happens will be correctly reported by Haskell parser. module Test.Utils(tsrc) where import Language.Haskell.TH import Language.Haskell.TH.Quote import Language.Haskell.Homplexity.Parse(parseTest) -- | QuasiQuoter for a non-interpolating String tsrc :: QuasiQuoter tsrc = QuasiQuoter embedSource (error "Cannot use tsrc as a pattern") (error "Cannot use tsrc as a type" ) (error "Cannot use tsrc as a dec" ) embedSource :: String -> Q Exp embedSource aString = do loc <- location let theString = linePragma loc ++ aString -- ^ Passes the information about correct location to the source let testNote = "Test line " ++ showLine loc -- ^ Shown in case that LINE pragma is not parsed [|parseTest testNote|] `appE` [| theString |] -- parseTest :: FilePath -> String -> IO ParseResult linePragma :: Loc -> String linePragma loc = concat ["{-# LINE ", showLine loc, " \"", loc_filename loc, "\" #-}\n"] showLine :: Loc -> String showLine = show . fst . loc_start