diff options
author | M Farkas-Dyck <strake888@proton.me> | 2022-09-29 01:03:13 -0800 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-10-19 10:46:29 -0400 |
commit | 83638dce4e20097b9b7073534e488a92dce6e88f (patch) | |
tree | e18b4b2484354c8875914a4b35a37d0377258eb4 /compiler/GHC/Parser | |
parent | f7b7a3122185222d5059e37315991afcf319e43c (diff) | |
download | haskell-83638dce4e20097b9b7073534e488a92dce6e88f.tar.gz |
Scrub various partiality involving lists (again).
Lets us avoid some use of `head` and `tail`, and some panics.
Diffstat (limited to 'compiler/GHC/Parser')
-rw-r--r-- | compiler/GHC/Parser/PostProcess/Haddock.hs | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/compiler/GHC/Parser/PostProcess/Haddock.hs b/compiler/GHC/Parser/PostProcess/Haddock.hs index 2194739373..2675921b04 100644 --- a/compiler/GHC/Parser/PostProcess/Haddock.hs +++ b/compiler/GHC/Parser/PostProcess/Haddock.hs @@ -48,7 +48,7 @@ Alternative approaches that did not work properly: -} module GHC.Parser.PostProcess.Haddock (addHaddockToModule) where -import GHC.Prelude hiding (head, mod) +import GHC.Prelude hiding (head, init, last, mod, tail) import GHC.Hs @@ -60,7 +60,8 @@ import Data.Semigroup import Data.Foldable import Data.Traversable import Data.Maybe -import Data.List.NonEmpty (head) +import Data.List.NonEmpty (nonEmpty) +import qualified Data.List.NonEmpty as NE import Control.Monad import Control.Monad.Trans.State.Strict import Control.Monad.Trans.Reader @@ -699,7 +700,7 @@ instance HasHaddock (LocatedA (ConDecl GhcPs)) where case con_decl of ConDeclGADT { con_g_ext, con_names, con_dcolon, con_bndrs, con_mb_cxt, con_g_args, con_res_ty } -> do -- discardHasInnerDocs is ok because we don't need this info for GADTs. - con_doc' <- discardHasInnerDocs $ getConDoc (getLocA (head con_names)) + con_doc' <- discardHasInnerDocs $ getConDoc (getLocA (NE.head con_names)) con_g_args' <- case con_g_args of PrefixConGADT ts -> PrefixConGADT <$> addHaddock ts @@ -873,13 +874,13 @@ addConTrailingDoc l_sep = doc <- selectDocString trailingDocs return $ L l' (con_fld { cd_fld_doc = fmap lexLHsDocString doc }) con_args' <- case con_args con_decl of - x@(PrefixCon _ []) -> x <$ reportExtraDocs trailingDocs - x@(RecCon (L _ [])) -> x <$ reportExtraDocs trailingDocs - PrefixCon _ ts -> PrefixCon noTypeArgs <$> mapLastM mk_doc_ty ts + x@(PrefixCon _ ts) -> case nonEmpty ts of + Nothing -> x <$ reportExtraDocs trailingDocs + Just ts -> PrefixCon noTypeArgs . toList <$> mapLastM mk_doc_ty ts + x@(RecCon (L l_rec flds)) -> case nonEmpty flds of + Nothing -> x <$ reportExtraDocs trailingDocs + Just flds -> RecCon . L l_rec . toList <$> mapLastM mk_doc_fld flds InfixCon t1 t2 -> InfixCon t1 <$> mk_doc_ty t2 - RecCon (L l_rec flds) -> do - flds' <- mapLastM mk_doc_fld flds - return (RecCon (L l_rec flds')) return $ L l (con_decl{ con_args = con_args' }) else do con_doc' <- selectDoc (con_doc con_decl `mcons` (map lexLHsDocString trailingDocs)) |