Skip to content

Commit 210df22

Browse files
committed
Use PackageName from Cabal-syntax for PkgName instead of plain Str
Now that we depend on Cabal-syntax anyway, why not use a proper type to represent package names?
1 parent feda8bf commit 210df22

File tree

7 files changed

+58
-45
lines changed

7 files changed

+58
-45
lines changed

src/Action/Generate.hs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import General.Str
3636
import Action.CmdLine
3737
import General.Conduit
3838
import Control.DeepSeq
39+
import Distribution.Package (mkPackageName, unPackageName)
3940

4041
{-
4142
@@ -101,12 +102,12 @@ readHaskellOnline timing settings download = do
101102
hoogles <- download "haskell-hoogle.tar.gz" "https://hackage.haskell.org/packages/hoogle.tar.gz"
102103

103104
-- peakMegabytesAllocated = 2
104-
setStackage <- Set.map strPack <$> (Set.union <$> setStackage stackageLts <*> setStackage stackageNightly)
105-
setPlatform <- Set.map strPack <$> setPlatform platform
106-
setGHC <- Set.map strPack <$> setGHC platform
105+
setStackage <- Set.map mkPackageName <$> (Set.union <$> setStackage stackageLts <*> setStackage stackageNightly)
106+
setPlatform <- Set.map mkPackageName <$> setPlatform platform
107+
setGHC <- Set.map mkPackageName <$> setGHC platform
107108

108109
cbl <- timed timing "Reading Cabal" $ parseCabalTarball settings cabals
109-
let want = Set.insert (strPack "ghc") $ Set.unions [setStackage, setPlatform, setGHC]
110+
let want = Set.insert (mkPackageName "ghc") $ Set.unions [setStackage, setPlatform, setGHC]
110111
cbl <- pure $ flip Map.mapWithKey cbl $ \name p ->
111112
p{packageTags =
112113
[(strPack "set",strPack "included-with-ghc") | name `Set.member` setGHC] ++
@@ -116,7 +117,7 @@ readHaskellOnline timing settings download = do
116117

117118
let source = do
118119
tar <- liftIO $ tarballReadFiles hoogles
119-
forM_ tar $ \(strPack . takeBaseName -> name, src) ->
120+
forM_ tar $ \(mkPackageName . takeBaseName -> name, src) ->
120121
yield (name, hackagePackageURL name, src)
121122
pure (cbl, want, source)
122123

@@ -129,13 +130,13 @@ readHaskellDirs timing settings dirs = do
129130
-- We never distinguish on versions, so they are considered equal when reordering
130131
-- So put 2.0 first in the list and rely on stable sorting. A bit of a hack.
131132
let order a = second Down $ parseTrailingVersion a
132-
let packages = map (strPack . takeBaseName &&& id) $ sortOn (map order . splitDirectories) $ filter ((==) ".txt" . takeExtension) files
133+
let packages = map (mkPackageName . takeBaseName &&& id) $ sortOn (map order . splitDirectories) $ filter ((==) ".txt" . takeExtension) files
133134
cabals <- mapM parseCabal $ filter ((==) ".cabal" . takeExtension) files
134135
let source = forM_ packages $ \(name, file) -> do
135136
src <- liftIO $ bstrReadFile file
136137
dir <- liftIO $ canonicalizePath $ takeDirectory file
137138
let url = "file://" ++ ['/' | not $ "/" `isPrefixOf` dir] ++ replace "\\" "/" dir ++ "/"
138-
when (isJust $ bstrSplitInfix (bstrPack "@package " <> bstrPack (strUnpack name)) src) $
139+
when (isJust $ bstrSplitInfix (bstrPack "@package " <> bstrPack (unPackageName name)) src) $
139140
yield (name, url, lbstrFromChunks [src])
140141
pure (Map.union
141142
(Map.fromList cabals)
@@ -145,7 +146,7 @@ readHaskellDirs timing settings dirs = do
145146
parseCabal fp = do
146147
src <- bstrReadFile fp
147148
let pkg = readCabal settings src
148-
pure (strPack $ takeBaseName fp, pkg)
149+
pure (mkPackageName $ takeBaseName fp, pkg)
149150

150151
generateBarePackage (name, file) =
151152
(name, mempty{packageTags = (strPack "set", strPack "all") : sets})
@@ -158,16 +159,16 @@ readFregeOnline timing download = do
158159
frege <- download "frege-frege.txt" "http://try.frege-lang.org/hoogle-frege.txt"
159160
let source = do
160161
src <- liftIO $ bstrReadFile frege
161-
yield (strPack "frege", "http://google.com/", lbstrFromChunks [src])
162-
pure (Map.empty, Set.singleton $ strPack "frege", source)
162+
yield (mkPackageName "frege", "http://google.com/", lbstrFromChunks [src])
163+
pure (Map.empty, Set.singleton $ mkPackageName "frege", source)
163164

164165

165166
readHaskellGhcpkg :: Timing -> Settings -> IO (Map.Map PkgName Package, Set.Set PkgName, ConduitT () (PkgName, URL, LBStr) IO ())
166167
readHaskellGhcpkg timing settings = do
167168
cbl <- timed timing "Reading ghc-pkg" $ readGhcPkg settings
168169
let source =
169170
forM_ (Map.toList cbl) $ \(name,Package{..}) -> whenJust packageDocs $ \docs -> do
170-
let file = docs </> strUnpack name <.> "txt"
171+
let file = docs </> unPackageName name <.> "txt"
171172
whenM (liftIO $ doesFileExist file) $ do
172173
src <- liftIO $ bstrReadFile file
173174
docs <- liftIO $ canonicalizePath docs
@@ -204,8 +205,8 @@ readHaskellHaddock timing settings docBaseDir = do
204205
cbl <- timed timing "Reading ghc-pkg" $ readGhcPkg settings
205206
let source =
206207
forM_ (Map.toList cbl) $ \(name, p@Package{..}) -> do
207-
let docs = docDir (strUnpack name) p
208-
file = docBaseDir </> docs </> (strUnpack name) <.> "txt"
208+
let docs = docDir (unPackageName name) p
209+
file = docBaseDir </> docs </> unPackageName name <.> "txt"
209210
whenM (liftIO $ doesFileExist file) $ do
210211
src <- liftIO $ bstrReadFile file
211212
let url = ['/' | not $ all isPathSeparator $ take 1 docs] ++
@@ -250,7 +251,7 @@ actionGenerate g@Generate{..} = withTiming (if debug then Just $ replaceExtensio
250251
cbl <- evaluate $ Map.map (\p -> p{packageDepends=[]}) cbl -- clear the memory, since the information is no longer used
251252
evaluate popularity
252253

253-
want <- pure $ if include /= [] then Set.fromList $ map strPack include else want
254+
want <- pure $ if include /= [] then Set.fromList $ map mkPackageName include else want
254255
want <- pure $ case count of Nothing -> want; Just count -> Set.fromList $ take count $ Set.toList want
255256

256257
(stats, _) <- storeWriteFile database $ \store -> do
@@ -263,7 +264,7 @@ actionGenerate g@Generate{..} = withTiming (if debug then Just $ replaceExtensio
263264
let warning msg = do modifyIORef itemWarn succ; hPutStrLn warnings msg
264265

265266
let consume :: ConduitM (Int, (PkgName, URL, LBStr)) (Maybe Target, [Item]) IO ()
266-
consume = awaitForever $ \(i, (strUnpack -> pkg, url, body)) -> do
267+
consume = awaitForever $ \(i, (unPackageName -> pkg, url, body)) -> do
267268
timedOverwrite timing ("[" ++ show i ++ "/" ++ show (Set.size want) ++ "] " ++ pkg) $
268269
parseHoogle (\msg -> warning $ pkg ++ ":" ++ msg) url body
269270

@@ -273,12 +274,12 @@ actionGenerate g@Generate{..} = withTiming (if debug then Just $ replaceExtensio
273274
filterC (flip Set.member want . fst3) .|
274275
void ((|$|)
275276
(zipFromC 1 .| consume)
276-
(do seen <- fmap Set.fromList $ mapMC (evaluate . force . strCopy . fst3) .| sinkList
277+
(do seen <- fmap Set.fromList $ mapMC (evaluate . force . fst3) .| sinkList
277278
let missing = [x | x <- Set.toList $ want `Set.difference` seen
278279
, fmap packageLibrary (Map.lookup x cbl) /= Just False]
279280
liftIO $ putStrLn ""
280281
liftIO $ whenNormal $ when (missing /= []) $ do
281-
putStrLn $ "Packages missing documentation: " ++ unwords (sortOn lower $ map strUnpack missing)
282+
putStrLn $ "Packages missing documentation: " ++ unwords (sortOn lower $ map unPackageName missing)
282283
liftIO $ when (Set.null seen) $
283284
exitFail "No packages were found, aborting (use no arguments to index all of Stackage)"
284285
-- synthesise things for Cabal packages that are not documented

src/General/Util.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,10 @@ import General.Str
5656
import Prelude
5757
import qualified Network.HTTP.Types.URI as URI
5858
import qualified Data.ByteString.UTF8 as UTF8
59+
import Distribution.Types.PackageName (PackageName, unPackageName)
5960

6061

61-
type PkgName = Str
62+
type PkgName = PackageName
6263
type ModName = Str
6364

6465
-- | A URL, complete with a @https:@ prefix.
@@ -320,7 +321,7 @@ minimum' = minimumBy' compare
320321

321322

322323
hackagePackageURL :: PkgName -> URL
323-
hackagePackageURL x = "https://hackage.haskell.org/package/" ++ strUnpack x
324+
hackagePackageURL x = "https://hackage.haskell.org/package/" ++ unPackageName x
324325

325326
hackageModuleURL :: ModName -> URL
326327
hackageModuleURL x = "/docs/" ++ ghcModuleURL x

src/Input/Cabal.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import Distribution.Compat.Lens (toListOf)
3434
import qualified Distribution.PackageDescription as PD
3535
import qualified Distribution.PackageDescription.Parsec as PD
3636
import qualified Distribution.Types.BuildInfo.Lens as Lens
37-
import Distribution.Types.PackageName (unPackageName)
37+
import Distribution.Types.PackageName (mkPackageName, unPackageName)
3838
import Hackage.RevDeps (lastVersionsOfPackages)
3939

4040
---------------------------------------------------------------------
@@ -72,7 +72,7 @@ packagePopularity :: Map.Map PkgName Package -> ([String], Map.Map PkgName Int)
7272
packagePopularity cbl = mp `seq` (errs, mp)
7373
where
7474
mp = Map.map length good
75-
errs = [ strUnpack user ++ ".cabal: Import of non-existant package " ++ strUnpack name ++
75+
errs = [ unPackageName user ++ ".cabal: Import of non-existant package " ++ unPackageName name ++
7676
(if null rest then "" else ", also imported by " ++ show (length rest) ++ " others")
7777
| (name, user:rest) <- Map.toList bad]
7878
(good, bad) = Map.partitionWithKey (\k _ -> k `Map.member` cbl) $
@@ -111,7 +111,7 @@ readGhcPkg settings = do
111111
-- ^ Backwards compatibility with GHC < 9.0
112112
g x = x
113113
let fixer p = p{packageLibrary = True, packageDocs = g <$> packageDocs p}
114-
let f ((stripPrefix "name: " -> Just x):xs) = Just (strPack $ trimStart x, fixer $ readCabal settings $ bstrPack $ unlines xs)
114+
let f ((stripPrefix "name: " -> Just x):xs) = Just (mkPackageName $ trimStart x, fixer $ readCabal settings $ bstrPack $ unlines xs)
115115
f _ = Nothing
116116
pure $ Map.fromList $ mapMaybe f $ splitOn ["---"] $ lines $ filter (/= '\r') $ UTF8.toString stdout
117117

@@ -120,7 +120,7 @@ readGhcPkg settings = do
120120
parseCabalTarball :: Settings -> FilePath -> IO (Map.Map PkgName Package)
121121
parseCabalTarball settings tarfile = do
122122
lastVersions <- lastVersionsOfPackages (const True) tarfile Nothing
123-
pure $ Map.mapKeys (strPack . unPackageName) $ Map.map (readCabal settings) lastVersions
123+
pure $ Map.map (readCabal settings) lastVersions
124124

125125

126126
---------------------------------------------------------------------
@@ -141,7 +141,7 @@ readCabal settings src = case PD.parseGenericPackageDescriptionMaybe src of
141141
readCabal' :: Settings -> PD.GenericPackageDescription -> String -> Package
142142
readCabal' Settings{..} gpd src = Package{..}
143143
where
144-
packageDepends = nubOrd $ foldMap (map (\(PD.Dependency pkg _ _) -> strPack $ unPackageName pkg) . PD.targetBuildDepends) $ toListOf Lens.traverseBuildInfos gpd
144+
packageDepends = nubOrd $ foldMap (map (\(PD.Dependency pkg _ _) -> pkg) . PD.targetBuildDepends) $ toListOf Lens.traverseBuildInfos gpd
145145

146146
mp = Map.fromListWith (++) $ lexCabal src
147147
ask x = Map.findWithDefault [] x mp

src/Input/Haddock.hs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import Control.Exception.Extra
1818
import Data.Generics.Uniplate.Data
1919
import General.Str
2020
import Safe
21+
import Distribution.Types.PackageName (unPackageName, mkPackageName)
2122

2223

2324
-- | An entry in the Hoogle DB
@@ -76,7 +77,7 @@ reformat = unlines . map bstrUnpack
7677
hierarchyC :: Monad m => URL -> ConduitM (Target, Entry) (Maybe Target, [Item]) m ()
7778
hierarchyC packageUrl = void $ mapAccumC f (Nothing, Nothing)
7879
where
79-
f (pkg, mod) (t, EPackage x) = ((Just (strUnpack x, url), Nothing), (Just t{targetURL=url}, [IPackage x]))
80+
f (pkg, mod) (t, EPackage x) = ((Just (unPackageName x, url), Nothing), (Just t{targetURL=url}, [IPackage x]))
8081
where url = targetURL t `orIfNull` packageUrl
8182
f (pkg, mod) (t, EModule x) = ((pkg, Just (strUnpack x, url)), (Just t{targetPackage=pkg, targetURL=url}, [IModule x]))
8283
where url = targetURL t `orIfNull` (if isGhc then ghcModuleURL x else hackageModuleURL x)
@@ -92,8 +93,8 @@ hierarchyC packageUrl = void $ mapAccumC f (Nothing, Nothing)
9293
infix 1 `orIfNull`
9394
orIfNull x y = if null x then y else x
9495

95-
96-
renderPackage x = "<b>package</b> <span class=name><s0>" ++ escapeHTML (strUnpack x) ++ "</s0></span>"
96+
renderPackage :: PkgName -> [Char]
97+
renderPackage x = "<b>package</b> <span class=name><s0>" ++ escapeHTML (unPackageName x) ++ "</s0></span>"
9798
renderModule (breakEnd (== '.') . strUnpack -> (pre,post)) = "<b>module</b> " ++ escapeHTML pre ++ "<span class=name><s0>" ++ escapeHTML post ++ "</s0></span>"
9899

99100

@@ -122,7 +123,7 @@ renderItem = keyword . focus
122123

123124
parseLine :: String -> Either String [Entry]
124125
parseLine x@('@':str) = case a of
125-
"package" | [b] <- words b, b /= "" -> Right [EPackage $ strPack b]
126+
"package" | [b] <- words b, b /= "" -> Right [EPackage $ mkPackageName b]
126127
"version" -> Right []
127128
_ -> Left $ "unknown attribute: " ++ x
128129
where (a,b) = word1 str
@@ -174,7 +175,7 @@ unGADT (GDataDecl a b c d _ [] e) = DataDecl a b c d [] e
174175
unGADT x = x
175176

176177
prettyItem :: Entry -> String
177-
prettyItem (EPackage x) = "package " ++ strUnpack x
178+
prettyItem (EPackage x) = "package " ++ unPackageName x
178179
prettyItem (EModule x) = "module " ++ strUnpack x
179180
prettyItem (EDecl x) = pretty x
180181

src/Input/Item.hs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import Prelude
3030
import qualified Data.Aeson as J
3131
import Data.Aeson.Types
3232
import Test.QuickCheck
33+
import Distribution.Types.PackageName (unPackageName, mkPackageName)
34+
3335
---------------------------------------------------------------------
3436
-- TYPES
3537

@@ -90,7 +92,7 @@ instance NFData Item where
9092
rnf (IInstance a) = rnf a
9193

9294
itemName :: Item -> Maybe Str
93-
itemName (IPackage x) = Just x
95+
itemName (IPackage x) = Just $ strPack $ unPackageName x
9496
itemName (IModule x) = Just x
9597
itemName (IName x) = Just x
9698
itemName (ISignature _) = Nothing
@@ -174,14 +176,20 @@ targetExpandURL t@Target{..} = t{targetURL = url, targetModule = second (const m
174176
unHTMLTarget :: Target -> Target
175177
unHTMLTarget t@Target {..} = t{targetItem=unHTML targetItem, targetDocs=unHTML targetDocs}
176178

177-
splitIPackage, splitIModule :: [(a, Item)] -> [(Str, [(a, Item)])]
178-
splitIPackage = splitUsing $ \x -> case snd x of IPackage x -> Just x; _ -> Nothing
179-
splitIModule = splitUsing $ \x -> case snd x of IModule x -> Just x; _ -> Nothing
179+
splitIPackage :: [(a, Item)] -> [(PkgName, [(a, Item)])]
180+
splitIPackage = splitUsing (mkPackageName "") $ \x -> case snd x of
181+
IPackage x -> Just x
182+
_ -> Nothing
183+
184+
splitIModule :: [(a, Item)] -> [(Str, [(a, Item)])]
185+
splitIModule = splitUsing mempty $ \x -> case snd x of
186+
IModule x -> Just x
187+
_ -> Nothing
180188

181-
splitUsing :: (a -> Maybe Str) -> [a] -> [(Str, [a])]
182-
splitUsing f = repeatedly $ \(x:xs) ->
189+
splitUsing :: b -> (a -> Maybe b) -> [a] -> [(b, [a])]
190+
splitUsing def f = repeatedly $ \(x:xs) ->
183191
let (a,b) = break (isJust . f) xs
184-
in ((fromMaybe mempty $ f x, x:a), b)
192+
in ((fromMaybe def $ f x, x:a), b)
185193

186194
item_test :: IO ()
187195
item_test = testing "Input.Item.Target JSON (encode . decode = id) " $ do

src/Input/Reorder.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,16 @@ import Data.List.Extra
88
import Data.Tuple.Extra
99
import General.Util
1010
import General.Str
11+
import Distribution.Types.PackageName (mkPackageName, unPackageName)
1112

1213

1314
pkgGhc :: PkgName
14-
pkgGhc = strPack "ghc"
15+
pkgGhc = mkPackageName "ghc"
1516

1617
packageOrderHacks :: (PkgName -> Int) -> PkgName -> Int
1718
-- 'ghc' is the canonical module that both 'ghc-lib-parser' and 'ghc-lib' copy from, so better to pick that
1819
-- even though ghc-lib-* are used more on Stackage (but a lot less on Hackage)
19-
packageOrderHacks f x | x == pkgGhc = min (f x) $ min (f $ strPack "ghc-lib-parser") (f $ strPack "ghc-lib") - 1
20+
packageOrderHacks f x | x == pkgGhc = min (f x) $ min (f $ mkPackageName "ghc-lib-parser") (f $ mkPackageName "ghc-lib") - 1
2021
packageOrderHacks f x = f x
2122

2223

@@ -28,4 +29,4 @@ reorderItems Settings{..} packageOrder xs =
2829
where
2930
refunc = map $ second $ \(x:xs) -> x : sortOn (itemName . snd) xs
3031
rebase (x, xs) = (x, concatMap snd $ sortOn (((negate . f . strUnpack) &&& id) . fst) $ refunc $ splitIModule xs)
31-
where f = reorderModule (strUnpack x)
32+
where f = reorderModule (unPackageName x)

src/Output/Tags.hs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import Query
1818
import General.Util
1919
import General.Store
2020
import General.Str
21+
import Distribution.Types.PackageName (unPackageName, mkPackageName)
2122

2223
---------------------------------------------------------------------
2324
-- DATA TYPE
@@ -43,23 +44,23 @@ data Completions a where Completions :: Completions BStr0 deriving Typeable
4344
writeTags :: StoreWrite -> (PkgName -> Bool) -> (PkgName -> [(String,String)]) -> [(Maybe TargetId, Item)] -> IO ()
4445
writeTags store keep extra xs = do
4546
let splitPkg = splitIPackage xs
46-
let packages = addRange splitPkg
47-
storeWrite store Packages (bstr0Join $ map (strUnpack . fst) packages, V.fromList $ map snd packages)
47+
let packages = addRange (== mkPackageName "") splitPkg
48+
storeWrite store Packages (bstr0Join $ map (unPackageName . fst) packages, V.fromList $ map snd packages)
4849

4950
let categories = map (bimap snd reverse) $ Map.toList $ Map.fromListWith (++)
5051
[(((weightTag ex, both lower ex), joinPair ":" ex),[rng]) | (p,rng) <- packages, ex <- extra p]
5152
storeWrite store Categories (bstr0Join $ map fst categories, jaggedFromList $ map snd categories)
5253

53-
let modules = addRange $ concatMap (splitIModule . snd) splitPkg
54+
let modules = addRange strNull $ concatMap (splitIModule . snd) splitPkg
5455
storeWrite store Modules (bstr0Join $ map (lower . strUnpack . fst) modules, V.fromList $ map snd modules)
5556

5657
storeWrite store Completions $ bstr0Join $
5758
takeWhile ("set:" `isPrefixOf`) (map fst categories) ++
58-
map ("package:"++) (sortOn lower $ map strUnpack $ nubOrd $ filter keep $ map fst packages) ++
59+
map ("package:"++) (sortOn lower $ map unPackageName $ nubOrd $ filter keep $ map fst packages) ++
5960
map (joinPair ":") (sortOn (weightTag &&& both lower) $ nubOrd [ex | (p,_) <- packages, keep p, ex <- extra p, fst ex /= "set"])
6061
where
61-
addRange :: [(Str, [(Maybe TargetId,a)])] -> [(Str, (TargetId, TargetId))]
62-
addRange xs = [(a, (minimum' is, maximum' is)) | (a,b) <- xs, let is = mapMaybe fst b, not $ strNull a, is /= []]
62+
addRange :: (str -> Bool) -> [(str, [(Maybe TargetId,a)])] -> [(str, (TargetId, TargetId))]
63+
addRange isNull xs = [(a, (minimum' is, maximum' is)) | (a,b) <- xs, let is = mapMaybe fst b, not (isNull a), is /= []]
6364

6465
weightTag ("set",x) = fromMaybe 0.9 $ lookup x [("stackage",0.0),("haskell-platform",0.1)]
6566
weightTag ("package",x) = 1

0 commit comments

Comments
 (0)