@@ -6,8 +6,11 @@ module Obelisk.Command.Preprocessor where
66
77import qualified Data.ByteString.Lazy as BL
88import Data.Foldable (for_ )
9- import Data.List (intersperse , isPrefixOf , sortOn )
9+ import Data.List (foldl' , intersperse , isPrefixOf , sortOn )
1010import 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
1114import qualified Data.Text.Lazy.Builder as TL
1215import qualified Data.Text.Lazy.Encoding as TL
1316import 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.
79104data GenHeaderError
0 commit comments