Skip to content

Commit 5827ee7

Browse files
committed
strip local package qualifiers for ghci
1 parent acc395b commit 5827ee7

1 file changed

Lines changed: 30 additions & 5 deletions

File tree

lib/command/src/Obelisk/Command/Preprocessor.hs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ module Obelisk.Command.Preprocessor where
66

77
import qualified Data.ByteString.Lazy as BL
88
import Data.Foldable (for_)
9-
import Data.List (intersperse, isPrefixOf, sortOn)
9+
import Data.List (foldl', intersperse, isPrefixOf, sortOn)
1010
import Data.Maybe (fromMaybe)
11+
import qualified Data.Set as Set
12+
import qualified Data.Text as T
13+
import qualified Data.Text.Lazy as L
1114
import qualified Data.Text.Lazy.Builder as TL
1215
import qualified Data.Text.Lazy.Encoding as TL
1316
import Distribution.Compiler (CompilerFlavor (..), perCompilerFlavorToList)
@@ -39,6 +42,12 @@ applyPackages origPath inPath outPath packagePaths' = do
3942
origPathCanonical <- canonicalizePath origPath
4043
packagePaths <- traverse canonicalizePath packagePaths'
4144

45+
parsedPackages <- traverse parseCabalPackage' packagePaths
46+
let localPackageNames = Set.fromList
47+
[ _cabalPackageInfo_packageName info
48+
| Right (Just (_, info)) <- parsedPackages
49+
]
50+
4251
let
4352
takeDirs = takeWhile hasTrailingPathSeparator
4453
packageDirs = sortOn (negate . length . takeDirs) $ map splitPath packagePaths
@@ -59,21 +68,37 @@ applyPackages origPath inPath outPath packagePaths' = do
5968
Right (Just (_, packageInfo)) -> pure $ Just packageInfo
6069
Right Nothing -> pure Nothing
6170

62-
writeOutput packageInfo' inPath outPath
71+
writeOutput localPackageNames packageInfo' inPath outPath
6372

64-
writeOutput :: Maybe CabalPackageInfo -> FilePath -> FilePath -> IO ()
65-
writeOutput packageInfo' origPath outPath = withFile outPath WriteMode $ \hOut -> do
73+
writeOutput :: Set.Set T.Text -> Maybe CabalPackageInfo -> FilePath -> FilePath -> IO ()
74+
writeOutput localPackageNames packageInfo' origPath outPath = withFile outPath WriteMode $ \hOut -> do
6675
for_ packageInfo' $ \packageInfo ->
6776
case generateHeader origPath packageInfo of
6877
Left e -> do
6978
hPutStrLn stderr (prettyGenHeaderError origPath e)
7079
giveUp
7180
Right header -> hPutTextBuilder hOut header
72-
BL.readFile origPath >>= BL.hPut hOut
81+
contents <- BL.readFile origPath
82+
let rewritten = stripLocalPackageQualifiers localPackageNames (TL.decodeUtf8 contents)
83+
BL.hPut hOut (TL.encodeUtf8 rewritten)
7384
where
7485
hPutTextBuilder h = BU.hPutBuilder h . TL.encodeUtf8Builder . TL.toLazyText
7586
giveUp = exitWith (ExitFailure 1)
7687

88+
stripLocalPackageQualifiers :: Set.Set T.Text -> L.Text -> L.Text
89+
stripLocalPackageQualifiers packageNames input =
90+
let packages = map L.fromStrict $ Set.toList packageNames
91+
in L.unlines $ fmap (stripLine packages) (L.lines input)
92+
where
93+
stripLine packages line =
94+
foldl'
95+
(\acc pkgName ->
96+
L.replace ("import \"" <> pkgName <> "\" ") "import "
97+
$ L.replace ("import qualified \"" <> pkgName <> "\" ") "import qualified " acc
98+
)
99+
line
100+
packages
101+
77102
-- | Represents an error which may happen when turning a
78103
-- 'CabalPackageInfo' into a set of GHC pragmas.
79104
data GenHeaderError

0 commit comments

Comments
 (0)