Skip to content
This repository was archived by the owner on Aug 3, 2024. It is now read-only.

Commit 29edbb9

Browse files
harpocratessjakobi
authored andcommitted
Use 'hiDecl' in 'extractDecl'
This makes Haddock not crash on Bug294, or html-test in general.
1 parent 4681d7f commit 29edbb9

File tree

1 file changed

+35
-28
lines changed

1 file changed

+35
-28
lines changed

haddock-api/src/Haddock/Interface/Create.hs

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -451,9 +451,10 @@ availExportItem is_sig modMap thisMod semMod warnings exportedNames
451451
, Just f <- [M.lookup n fixMap]
452452
]
453453

454+
extracted <- extractDecl (availName avail) decl
455+
454456
return [ ExportDecl {
455-
expItemDecl = restrictTo (fmap fst subs)
456-
(extractDecl declMap (availName avail) decl)
457+
expItemDecl = restrictTo (fmap fst subs) extracted
457458
, expItemPats = bundledPatSyns
458459
, expItemMbDoc = doc
459460
, expItemSubDocs = subs
@@ -464,17 +465,18 @@ availExportItem is_sig modMap thisMod semMod warnings exportedNames
464465
]
465466

466467
| otherwise =
467-
return [ ExportDecl {
468-
expItemDecl = extractDecl declMap sub decl
469-
, expItemPats = []
470-
, expItemMbDoc = sub_doc
471-
, expItemSubDocs = []
472-
, expItemInstances = []
473-
, expItemFixities = [ (sub, f) | Just f <- [M.lookup sub fixMap] ]
474-
, expItemSpliced = False
475-
}
476-
| (sub, sub_doc) <- subs
477-
]
468+
let extractSub (sub, sub_doc) = do
469+
extracted <- extractDecl sub decl
470+
pure (ExportDecl {
471+
expItemDecl = extracted
472+
, expItemPats = []
473+
, expItemMbDoc = sub_doc
474+
, expItemSubDocs = []
475+
, expItemInstances = []
476+
, expItemFixities = [ (sub, f) | Just f <- [M.lookup sub fixMap] ]
477+
, expItemSpliced = False
478+
})
479+
in traverse extractSub subs
478480

479481
exportedNameSet = mkNameSet exportedNames
480482
isExported n = elemNameSet n exportedNameSet
@@ -620,9 +622,9 @@ lookupDocs avail warnings docMap argMap =
620622
-- it might be an individual record selector or a class method. In these
621623
-- cases we have to extract the required declaration (and somehow cobble
622624
-- together a type signature for it...).
623-
extractDecl :: DeclMap -> Name -> LHsDecl GhcRn -> LHsDecl GhcRn
624-
extractDecl declMap name decl
625-
| name `elem` getMainDeclBinder (unLoc decl) = decl
625+
extractDecl :: Name -> LHsDecl GhcRn -> ErrMsgGhc (LHsDecl GhcRn)
626+
extractDecl name decl
627+
| name `elem` getMainDeclBinder (unLoc decl) = pure decl
626628
| otherwise =
627629
case unLoc decl of
628630
TyClD _ d@ClassDecl {} ->
@@ -645,29 +647,34 @@ extractDecl declMap name decl
645647
in case (matchesMethod, matchesAssociatedType) of
646648
([s0], _) -> let (n, tyvar_names) = (tcdName d, tyClDeclTyVars d)
647649
L pos sig = addClassContext n tyvar_names s0
648-
in L pos (SigD noExt sig)
649-
(_, [L pos fam_decl]) -> L pos (TyClD noExt (FamDecl noExt fam_decl))
650-
651-
([], [])
652-
| Just (famInstDecl:_) <- M.lookup name declMap
653-
-> extractDecl declMap name famInstDecl
650+
in pure (L pos (SigD noExt sig))
651+
(_, [L pos fam_decl]) -> pure (L pos (TyClD noExt (FamDecl noExt fam_decl)))
652+
653+
([], []) -> do
654+
famInstDeclOpt <- hiDecl name
655+
case famInstDeclOpt of
656+
Nothing -> O.pprPanic "extractDecl" (O.text "Failed to find decl for" O.<+> O.ppr name)
657+
Just famInstDecl -> extractDecl name famInstDecl
654658
_ -> O.pprPanic "extractDecl" (O.text "Ambiguous decl for" O.<+> O.ppr name O.<+> O.text "in class:"
655659
O.$$ O.nest 4 (O.ppr d)
656660
O.$$ O.text "Matches:"
657661
O.$$ O.nest 4 (O.ppr matchesMethod O.<+> O.ppr matchesAssociatedType))
658-
TyClD _ d@DataDecl {} ->
662+
TyClD _ d@DataDecl {} -> pure $
659663
let (n, tyvar_tys) = (tcdName d, lHsQTyVarsToTypes (tyClDeclTyVars d))
660664
in if isDataConName name
661665
then SigD noExt <$> extractPatternSyn name n tyvar_tys (dd_cons (tcdDataDefn d))
662666
else SigD noExt <$> extractRecSel name n tyvar_tys (dd_cons (tcdDataDefn d))
663667
TyClD _ FamDecl {}
664668
| isValName name
665-
, Just (famInst:_) <- M.lookup name declMap
666-
-> extractDecl declMap name famInst
669+
-> do
670+
famInstOpt <- hiDecl name
671+
case famInstOpt of
672+
Nothing -> O.pprPanic "extractDecl" (O.text "Failed to find decl for" O.<+> O.ppr name)
673+
Just famInst -> extractDecl name famInst
667674
InstD _ (DataFamInstD _ (DataFamInstDecl (HsIB { hsib_body =
668675
FamEqn { feqn_tycon = L _ n
669676
, feqn_pats = tys
670-
, feqn_rhs = defn }}))) ->
677+
, feqn_rhs = defn }}))) -> pure $
671678
if isDataConName name
672679
then SigD noExt <$> extractPatternSyn name n tys (dd_cons defn)
673680
else SigD noExt <$> extractRecSel name n tys (dd_cons defn)
@@ -680,7 +687,7 @@ extractDecl declMap name decl
680687
, name `elem` map unLoc (concatMap (getConNames . unLoc) (dd_cons dd))
681688
]
682689
in case matches of
683-
[d0] -> extractDecl declMap name (noLoc (InstD noExt (DataFamInstD noExt d0)))
690+
[d0] -> extractDecl name (noLoc (InstD noExt (DataFamInstD noExt d0)))
684691
_ -> error "internal: extractDecl (ClsInstD)"
685692
| otherwise ->
686693
let matches = [ d' | L _ d'@(DataFamInstDecl (HsIB { hsib_body = d }))
@@ -692,7 +699,7 @@ extractDecl declMap name decl
692699
, extFieldOcc n == name
693700
]
694701
in case matches of
695-
[d0] -> extractDecl declMap name (noLoc . InstD noExt $ DataFamInstD noExt d0)
702+
[d0] -> extractDecl name (noLoc . InstD noExt $ DataFamInstD noExt d0)
696703
_ -> error "internal: extractDecl (ClsInstD)"
697704
x -> O.pprPanic "extractDecl" (O.ppr x)
698705

0 commit comments

Comments
 (0)