[Git][ghc/ghc][master] Make the parser module less dependent on DynFlags

Marge Bot gitlab at gitlab.haskell.org
Wed Sep 30 06:48:01 UTC 2020



 Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC


Commits:
8e3f00dd by Sylvain Henry at 2020-09-29T17:24:03+02:00
Make the parser module less dependent on DynFlags

Bump haddock submodule

- - - - -


15 changed files:

- compiler/GHC.hs
- compiler/GHC/Cmm/Parser.y
- compiler/GHC/Driver/Backpack.hs
- compiler/GHC/Driver/Config.hs
- compiler/GHC/Driver/Main.hs
- compiler/GHC/Parser.y
- compiler/GHC/Parser/Header.hs
- compiler/GHC/Parser/Lexer.x
- compiler/GHC/Parser/PostProcess.hs
- compiler/GHC/Runtime/Eval.hs
- ghc/GHCi/UI.hs
- testsuite/tests/ghc-api/T11579.hs
- testsuite/tests/ghc-api/T9015.hs
- testsuite/tests/parser/should_run/CountParserDeps.hs
- utils/haddock


Changes:

=====================================
compiler/GHC.hs
=====================================
@@ -303,6 +303,7 @@ import GHCi.RemoteTypes
 
 import GHC.Core.Ppr.TyThing  ( pprFamInst )
 import GHC.Driver.Backend
+import GHC.Driver.Config
 import GHC.Driver.Main
 import GHC.Driver.Make
 import GHC.Driver.Hooks
@@ -1426,9 +1427,9 @@ getModuleSourceAndFlags mod = do
 -- Throws a 'GHC.Driver.Types.SourceError' on parse error.
 getTokenStream :: GhcMonad m => Module -> m [Located Token]
 getTokenStream mod = do
-  (sourceFile, source, flags) <- getModuleSourceAndFlags mod
+  (sourceFile, source, dflags) <- getModuleSourceAndFlags mod
   let startLoc = mkRealSrcLoc (mkFastString sourceFile) 1 1
-  case lexTokenStream source startLoc flags of
+  case lexTokenStream (initParserOpts dflags) source startLoc of
     POk _ ts  -> return ts
     PFailed pst ->
         do dflags <- getDynFlags
@@ -1439,9 +1440,9 @@ getTokenStream mod = do
 -- 'showRichTokenStream'.
 getRichTokenStream :: GhcMonad m => Module -> m [(Located Token, String)]
 getRichTokenStream mod = do
-  (sourceFile, source, flags) <- getModuleSourceAndFlags mod
+  (sourceFile, source, dflags) <- getModuleSourceAndFlags mod
   let startLoc = mkRealSrcLoc (mkFastString sourceFile) 1 1
-  case lexTokenStream source startLoc flags of
+  case lexTokenStream (initParserOpts dflags) source startLoc of
     POk _ ts -> return $ addSourceToTokens startLoc source ts
     PFailed pst ->
         do dflags <- getDynFlags
@@ -1616,7 +1617,7 @@ parser str dflags filename =
        loc  = mkRealSrcLoc (mkFastString filename) 1 1
        buf  = stringToStringBuffer str
    in
-   case unP Parser.parseModule (mkPState dflags buf loc) of
+   case unP Parser.parseModule (initParserState (initParserOpts dflags) buf loc) of
 
      PFailed pst ->
          let (warns,errs) = getMessages pst dflags in


=====================================
compiler/GHC/Cmm/Parser.y
=====================================
@@ -249,6 +249,7 @@ import GHC.Types.Unique.FM
 import GHC.Types.SrcLoc
 import GHC.Driver.Session
 import GHC.Driver.Ppr
+import GHC.Driver.Config
 import GHC.Utils.Error
 import GHC.Data.StringBuffer
 import GHC.Data.FastString
@@ -1432,7 +1433,8 @@ parseCmmFile dflags filename = withTiming dflags (text "ParseCmm"<+>brackets (te
   buf <- hGetStringBuffer filename
   let
         init_loc = mkRealSrcLoc (mkFastString filename) 1 1
-        init_state = (mkPState dflags buf init_loc) { lex_state = [0] }
+        opts       = initParserOpts dflags
+        init_state = (initParserState opts buf init_loc) { lex_state = [0] }
                 -- reset the lex_state: the Lexer monad leaves some stuff
                 -- in there we don't want.
   case unPD cmmParse dflags init_state of


=====================================
compiler/GHC/Driver/Backpack.hs
=====================================
@@ -27,6 +27,7 @@ import GHC.Parser.Annotation
 import GHC hiding (Failed, Succeeded)
 import GHC.Parser
 import GHC.Parser.Lexer
+import GHC.Driver.Config
 import GHC.Driver.Monad
 import GHC.Driver.Session
 import GHC.Driver.Ppr
@@ -83,7 +84,7 @@ doBackpack [src_filename] = do
 
     buf <- liftIO $ hGetStringBuffer src_filename
     let loc = mkRealSrcLoc (mkFastString src_filename) 1 1 -- TODO: not great
-    case unP parseBackpack (mkPState dflags buf loc) of
+    case unP parseBackpack (initParserState (initParserOpts dflags) buf loc) of
         PFailed pst -> throwErrors (getErrorMessages pst dflags)
         POk _ pkgname_bkp -> do
             -- OK, so we have an LHsUnit PackageName, but we want an


=====================================
compiler/GHC/Driver/Config.hs
=====================================
@@ -2,6 +2,7 @@
 module GHC.Driver.Config
    ( initOptCoercionOpts
    , initSimpleOpts
+   , initParserOpts
    )
 where
 
@@ -10,6 +11,7 @@ import GHC.Prelude
 import GHC.Driver.Session
 import GHC.Core.SimpleOpt
 import GHC.Core.Coercion.Opt
+import GHC.Parser.Lexer
 
 -- | Initialise coercion optimiser configuration from DynFlags
 initOptCoercionOpts :: DynFlags -> OptCoercionOpts
@@ -23,3 +25,15 @@ initSimpleOpts dflags = SimpleOpts
    { so_uf_opts = unfoldingOpts dflags
    , so_co_opts = initOptCoercionOpts dflags
    }
+
+-- | Extracts the flag information needed for parsing
+initParserOpts :: DynFlags -> ParserOpts
+initParserOpts =
+  mkParserOpts
+    <$> warningFlags
+    <*> extensionFlags
+    <*> homeUnitId_
+    <*> safeImportsOn
+    <*> gopt Opt_Haddock
+    <*> gopt Opt_KeepRawTokenStream
+    <*> const True


=====================================
compiler/GHC/Driver/Main.hs
=====================================
@@ -138,6 +138,7 @@ import GHC.Cmm.Info.Build
 import GHC.Cmm.Pipeline
 import GHC.Cmm.Info
 import GHC.Driver.CodeOutput
+import GHC.Driver.Config
 import GHC.Core.InstEnv
 import GHC.Core.FamInstEnv
 import GHC.Utils.Fingerprint ( Fingerprint )
@@ -353,7 +354,7 @@ hscParse' mod_summary
                  = parseSignature
                  | otherwise = parseModule
 
-    case unP parseMod (mkPState dflags buf loc) of
+    case unP parseMod (initParserState (initParserOpts dflags) buf loc) of
         PFailed pst ->
             handleWarningsThrowErrors (getMessages pst dflags)
         POk pst rdr_module -> do
@@ -1875,7 +1876,7 @@ hscParseThingWithLocation source linenumber parser str
     let buf = stringToStringBuffer str
         loc = mkRealSrcLoc (fsLit source) linenumber 1
 
-    case unP parser (mkPState dflags buf loc) of
+    case unP parser (initParserState (initParserOpts dflags) buf loc) of
         PFailed pst -> do
             handleWarningsThrowErrors (getMessages pst dflags)
 


=====================================
compiler/GHC/Parser.y
=====================================
@@ -21,13 +21,13 @@
 -- and then parse that string:
 --
 -- @
---     runParser :: DynFlags -> String -> P a -> ParseResult a
---     runParser flags str parser = unP parser parseState
+--     runParser :: ParserOpts -> String -> P a -> ParseResult a
+--     runParser opts str parser = unP parser parseState
 --     where
 --       filename = "\<interactive\>"
 --       location = mkRealSrcLoc (mkFastString filename) 1 1
 --       buffer = stringToStringBuffer str
---       parseState = mkPState flags buffer location
+--       parseState = initParserState opts buffer location
 -- @
 module GHC.Parser
    ( parseModule, parseSignature, parseImport, parseStatement, parseBackpack


=====================================
compiler/GHC/Parser/Header.hs
=====================================
@@ -37,6 +37,7 @@ import GHC.Builtin.Names
 import GHC.Data.StringBuffer
 import GHC.Types.SrcLoc
 import GHC.Driver.Session
+import GHC.Driver.Config
 import GHC.Utils.Error
 import GHC.Utils.Misc
 import GHC.Utils.Outputable as Outputable
@@ -73,7 +74,7 @@ getImports :: DynFlags
               -- names from -XPackageImports), and the module name.
 getImports dflags buf filename source_filename = do
   let loc  = mkRealSrcLoc (mkFastString filename) 1 1
-  case unP parseHeader (mkPState dflags buf loc) of
+  case unP parseHeader (initParserState (initParserOpts dflags) buf loc) of
     PFailed pst ->
         -- assuming we're not logging warnings here as per below
       return $ Left $ getErrorMessages pst dflags
@@ -178,7 +179,8 @@ blockSize = 1024
 lazyGetToks :: DynFlags -> FilePath -> Handle -> IO [Located Token]
 lazyGetToks dflags filename handle = do
   buf <- hGetStringBufferBlock handle blockSize
-  unsafeInterleaveIO $ lazyLexBuf handle (pragState dflags buf loc) False blockSize
+  let prag_state = initPragState (initParserOpts dflags) buf loc
+  unsafeInterleaveIO $ lazyLexBuf handle prag_state False blockSize
  where
   loc  = mkRealSrcLoc (mkFastString filename) 1 1
 
@@ -214,8 +216,9 @@ lazyGetToks dflags filename handle = do
 
 
 getToks :: DynFlags -> FilePath -> StringBuffer -> [Located Token]
-getToks dflags filename buf = lexAll (pragState dflags buf loc)
+getToks dflags filename buf = lexAll pstate
  where
+  pstate = initPragState (initParserOpts dflags) buf loc
   loc  = mkRealSrcLoc (mkFastString filename) 1 1
 
   lexAll state = case unP (lexer False return) state of


=====================================
compiler/GHC/Parser/Lexer.x
=====================================
@@ -49,8 +49,10 @@
 {-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
 
 module GHC.Parser.Lexer (
-   Token(..), lexer, lexerDbg, pragState, mkPState, mkPStatePure, PState(..),
-   P(..), ParseResult(..), mkParserFlags, mkParserFlags', ParserFlags(..),
+   Token(..), lexer, lexerDbg,
+   ParserOpts(..), mkParserOpts,
+   PState (..), initParserState, initPragState,
+   P(..), ParseResult(..),
    appendWarning,
    appendError,
    allocateComments,
@@ -62,7 +64,7 @@ module GHC.Parser.Lexer (
    activeContext, nextIsEOF,
    getLexState, popLexState, pushLexState,
    ExtBits(..),
-   xtest,
+   xtest, xunset, xset,
    lexTokenStream,
    AddAnn(..),mkParensApiAnn,
    addAnnsAt,
@@ -2207,12 +2209,13 @@ data ParseResult a
              --   a non-empty bag of errors.
 
 -- | Test whether a 'WarningFlag' is set
-warnopt :: WarningFlag -> ParserFlags -> Bool
+warnopt :: WarningFlag -> ParserOpts -> Bool
 warnopt f options = f `EnumSet.member` pWarningFlags options
 
--- | The subset of the 'DynFlags' used by the parser.
--- See 'mkParserFlags' or 'mkParserFlags'' for ways to construct this.
-data ParserFlags = ParserFlags {
+-- | Parser options.
+--
+-- See 'mkParserOpts' to construct this.
+data ParserOpts = ParserOpts {
     pWarningFlags   :: EnumSet WarningFlag
   , pHomeUnitId     :: UnitId      -- ^ id of the unit currently being compiled
                                    -- (only used in Cmm parser)
@@ -2230,7 +2233,7 @@ data HdkComment
 
 data PState = PState {
         buffer     :: StringBuffer,
-        options    :: ParserFlags,
+        options    :: ParserOpts,
         -- This needs to take DynFlags as an argument until
         -- we have a fix for #10143
         messages   :: DynFlags -> Messages,
@@ -2570,6 +2573,12 @@ xbit = bit . fromEnum
 xtest :: ExtBits -> ExtsBitmap -> Bool
 xtest ext xmap = testBit xmap (fromEnum ext)
 
+xset :: ExtBits -> ExtsBitmap -> ExtsBitmap
+xset ext xmap = setBit xmap (fromEnum ext)
+
+xunset :: ExtBits -> ExtsBitmap -> ExtsBitmap
+xunset ext xmap = clearBit xmap (fromEnum ext)
+
 -- | Various boolean flags, mostly language extensions, that impact lexing and
 -- parsing. Note that a handful of these can change during lexing/parsing.
 data ExtBits
@@ -2630,19 +2639,8 @@ data ExtBits
     -- tokens of their own.
   deriving Enum
 
-
-
-
-
--- PState for parsing options pragmas
---
-pragState :: DynFlags -> StringBuffer -> RealSrcLoc -> PState
-pragState dynflags buf loc = (mkPState dynflags buf loc) {
-                                 lex_state = [bol, option_prags, 0]
-                             }
-
-{-# INLINE mkParserFlags' #-}
-mkParserFlags'
+{-# INLINE mkParserOpts #-}
+mkParserOpts
   :: EnumSet WarningFlag        -- ^ warnings flags enabled
   -> EnumSet LangExt.Extension  -- ^ permitted language extensions enabled
   -> UnitId                     -- ^ id of the unit currently being compiled
@@ -2656,11 +2654,11 @@ mkParserFlags'
   -- the internal position kept by the parser. Otherwise, those pragmas are
   -- lexed as 'ITline_prag' and 'ITcolumn_prag' tokens.
 
-  -> ParserFlags
--- ^ Given exactly the information needed, set up the 'ParserFlags'
-mkParserFlags' warningFlags extensionFlags homeUnitId
+  -> ParserOpts
+-- ^ Given exactly the information needed, set up the 'ParserOpts'
+mkParserOpts warningFlags extensionFlags homeUnitId
   safeImports isHaddock rawTokStream usePosPrags =
-    ParserFlags {
+    ParserOpts {
       pWarningFlags = warningFlags
     , pHomeUnitId   = homeUnitId
     , pExtsBitmap   = safeHaskellBit .|. langExtBits .|. optBits
@@ -2722,25 +2720,15 @@ mkParserFlags' warningFlags extensionFlags homeUnitId
     b `setBitIf` cond | cond      = xbit b
                       | otherwise = 0
 
--- | Extracts the flag information needed for parsing
-mkParserFlags :: DynFlags -> ParserFlags
-mkParserFlags =
-  mkParserFlags'
-    <$> DynFlags.warningFlags
-    <*> DynFlags.extensionFlags
-    <*> DynFlags.homeUnitId_
-    <*> safeImportsOn
-    <*> gopt Opt_Haddock
-    <*> gopt Opt_KeepRawTokenStream
-    <*> const True
-
--- | Creates a parse state from a 'DynFlags' value
-mkPState :: DynFlags -> StringBuffer -> RealSrcLoc -> PState
-mkPState flags = mkPStatePure (mkParserFlags flags)
-
--- | Creates a parse state from a 'ParserFlags' value
-mkPStatePure :: ParserFlags -> StringBuffer -> RealSrcLoc -> PState
-mkPStatePure options buf loc =
+-- | Set parser options for parsing OPTIONS pragmas
+initPragState :: ParserOpts -> StringBuffer -> RealSrcLoc -> PState
+initPragState options buf loc = (initParserState options buf loc)
+   { lex_state = [bol, option_prags, 0]
+   }
+
+-- | Creates a parse state from a 'ParserOpts' value
+initParserState :: ParserOpts -> StringBuffer -> RealSrcLoc -> PState
+initParserState options buf loc =
   PState {
       buffer        = buf,
       options       = options,
@@ -2818,7 +2806,7 @@ appendError srcspan msg m =
     in (ws, es')
 
 appendWarning
-  :: ParserFlags
+  :: ParserOpts
   -> WarningFlag
   -> SrcSpan
   -> SDoc
@@ -2928,7 +2916,7 @@ getOffside = P $ \s at PState{last_loc=loc, context=stk} ->
 -- Construct a parse error
 
 srcParseErr
-  :: ParserFlags
+  :: ParserOpts
   -> StringBuffer       -- current buffer (placed just after the last token)
   -> Int                -- length of the previous token
   -> MsgDoc
@@ -3248,16 +3236,20 @@ reportLexError loc1 loc2 buf str
      then failLocMsgP loc2 loc2 (str ++ " (UTF-8 decoding error)")
      else failLocMsgP loc1 loc2 (str ++ " at character " ++ show c)
 
-lexTokenStream :: StringBuffer -> RealSrcLoc -> DynFlags -> ParseResult [Located Token]
-lexTokenStream buf loc dflags = unP go initState{ options = opts' }
-    where dflags' = gopt_set (gopt_unset dflags Opt_Haddock) Opt_KeepRawTokenStream
-          initState at PState{ options = opts } = mkPState dflags' buf loc
-          opts' = opts{ pExtsBitmap = complement (xbit UsePosPragsBit) .&. pExtsBitmap opts }
-          go = do
-            ltok <- lexer False return
-            case ltok of
-              L _ ITeof -> return []
-              _ -> liftM (ltok:) go
+lexTokenStream :: ParserOpts -> StringBuffer -> RealSrcLoc -> ParseResult [Located Token]
+lexTokenStream opts buf loc = unP go initState{ options = opts' }
+    where
+    new_exts  = xunset HaddockBit        -- disable Haddock
+                $ xunset UsePosPragsBit  -- parse LINE/COLUMN pragmas as tokens
+                $ xset RawTokenStreamBit -- include comments
+                $ pExtsBitmap opts
+    opts'     = opts { pExtsBitmap = new_exts }
+    initState = initParserState opts' buf loc
+    go = do
+      ltok <- lexer False return
+      case ltok of
+        L _ ITeof -> return []
+        _ -> liftM (ltok:) go
 
 linePrags = Map.singleton "line" linePrag
 


=====================================
compiler/GHC/Parser/PostProcess.hs
=====================================
@@ -2660,7 +2660,7 @@ failOpFewArgs (L loc op) =
 
 data PV_Context =
   PV_Context
-    { pv_options :: ParserFlags
+    { pv_options :: ParserOpts
     , pv_hint :: SDoc  -- See Note [Parser-Validator Hint]
     }
 


=====================================
compiler/GHC/Runtime/Eval.hs
=====================================
@@ -96,8 +96,8 @@ import GHC.Utils.Outputable
 import GHC.Data.FastString
 import GHC.Data.Bag
 import GHC.Utils.Misc
-import qualified GHC.Parser.Lexer as Lexer (P (..), ParseResult(..), unP, mkPStatePure)
-import GHC.Parser.Lexer (ParserFlags)
+import qualified GHC.Parser.Lexer as Lexer (P (..), ParseResult(..), unP, initParserState)
+import GHC.Parser.Lexer (ParserOpts)
 import qualified GHC.Parser       as Parser (parseStmt, parseModule, parseDeclaration, parseImport)
 
 import System.Directory
@@ -877,14 +877,14 @@ parseName str = withSession $ \hsc_env -> liftIO $
       ; hscTcRnLookupRdrName hsc_env lrdr_name }
 
 -- | Returns @True@ if passed string is a statement.
-isStmt :: ParserFlags -> String -> Bool
+isStmt :: ParserOpts -> String -> Bool
 isStmt pflags stmt =
   case parseThing Parser.parseStmt pflags stmt of
     Lexer.POk _ _ -> True
     Lexer.PFailed _ -> False
 
 -- | Returns @True@ if passed string has an import declaration.
-hasImport :: ParserFlags -> String -> Bool
+hasImport :: ParserOpts -> String -> Bool
 hasImport pflags stmt =
   case parseThing Parser.parseModule pflags stmt of
     Lexer.POk _ thing -> hasImports thing
@@ -893,14 +893,14 @@ hasImport pflags stmt =
     hasImports = not . null . hsmodImports . unLoc
 
 -- | Returns @True@ if passed string is an import declaration.
-isImport :: ParserFlags -> String -> Bool
+isImport :: ParserOpts -> String -> Bool
 isImport pflags stmt =
   case parseThing Parser.parseImport pflags stmt of
     Lexer.POk _ _ -> True
     Lexer.PFailed _ -> False
 
 -- | Returns @True@ if passed string is a declaration but __/not a splice/__.
-isDecl :: ParserFlags -> String -> Bool
+isDecl :: ParserOpts -> String -> Bool
 isDecl pflags stmt = do
   case parseThing Parser.parseDeclaration pflags stmt of
     Lexer.POk _ thing ->
@@ -909,12 +909,12 @@ isDecl pflags stmt = do
         _ -> True
     Lexer.PFailed _ -> False
 
-parseThing :: Lexer.P thing -> ParserFlags -> String -> Lexer.ParseResult thing
-parseThing parser pflags stmt = do
+parseThing :: Lexer.P thing -> ParserOpts -> String -> Lexer.ParseResult thing
+parseThing parser opts stmt = do
   let buf = stringToStringBuffer stmt
       loc = mkRealSrcLoc (fsLit "<interactive>") 1 1
 
-  Lexer.unP parser (Lexer.mkPStatePure pflags buf loc)
+  Lexer.unP parser (Lexer.initParserState opts buf loc)
 
 getDocs :: GhcMonad m
         => Name


=====================================
ghc/GHCi/UI.hs
=====================================
@@ -50,6 +50,7 @@ import GHC.Driver.Ppr hiding (printForUser)
 import GHC.Utils.Error hiding (traceCmd)
 import GHC.Driver.Finder as Finder
 import GHC.Driver.Monad ( modifySession )
+import GHC.Driver.Config
 import qualified GHC
 import GHC ( LoadHowMuch(..), Target(..),  TargetId(..), InteractiveImport(..),
              TyThing(..), Phase, BreakIndex, Resume, SingleStep, Ghc,
@@ -1133,7 +1134,7 @@ checkInputForLayout stmt getStmt = do
    st0 <- getGHCiState
    let buf'   =  stringToStringBuffer stmt
        loc    = mkRealSrcLoc (fsLit (progname st0)) (line_number st0) 1
-       pstate = Lexer.mkPState dflags buf' loc
+       pstate = Lexer.initParserState (initParserOpts dflags) buf' loc
    case Lexer.unP goToEnd pstate of
      (Lexer.POk _ False) -> return $ Just stmt
      _other              -> do
@@ -1175,7 +1176,7 @@ enqueueCommands cmds = do
 -- The return value True indicates success, as in `runOneCommand`.
 runStmt :: GhciMonad m => String -> SingleStep -> m (Maybe GHC.ExecResult)
 runStmt input step = do
-  pflags <- Lexer.mkParserFlags <$> GHC.getInteractiveDynFlags
+  pflags <- initParserOpts <$> GHC.getInteractiveDynFlags
   -- In GHCi, we disable `-fdefer-type-errors`, as well as `-fdefer-type-holes`
   -- and `-fdefer-out-of-scope-variables` for **naked expressions**. The
   -- declarations and statements are not affected.


=====================================
testsuite/tests/ghc-api/T11579.hs
=====================================
@@ -1,5 +1,6 @@
 import System.Environment
 import GHC.Driver.Session
+import GHC.Driver.Config
 import GHC.Data.FastString
 import GHC
 import GHC.Data.StringBuffer
@@ -16,7 +17,8 @@ main = do
 
     hdk_comments <- runGhc (Just libdir) $ do
         dflags <- getSessionDynFlags
-        let pstate = mkPState (dflags `gopt_set` Opt_Haddock) stringBuffer loc
+        let opts   = initParserOpts (dflags `gopt_set` Opt_Haddock)
+            pstate = initParserState opts stringBuffer loc
         case unP (lexer False return) pstate of
             POk s (L _ ITeof) -> return (map unLoc (toList (hdk_comments s)))
             _                 -> error "No token"


=====================================
testsuite/tests/ghc-api/T9015.hs
=====================================
@@ -3,7 +3,7 @@ module Main where
 import GHC
 import GHC.Driver.Session
 import GHC.Driver.Monad
-import GHC.Parser.Lexer (mkParserFlags)
+import GHC.Driver.Config
 import System.Environment
 
 testStrings = [
@@ -53,7 +53,7 @@ main = do
   where
     testWithParser parser = do
       dflags <- getSessionDynFlags
-      let pflags = mkParserFlags dflags
+      let pflags = initParserOpts dflags
       liftIO . putStrLn . unlines $ map (testExpr (parser pflags)) testStrings
 
     testExpr parser expr = do


=====================================
testsuite/tests/parser/should_run/CountParserDeps.hs
=====================================
@@ -28,9 +28,12 @@ main = do
   [libdir] <- getArgs
   modules <- parserDeps libdir
   let num = sizeUniqSet modules
---  print num
---  print (map moduleNameString $ nonDetEltsUniqSet modules)
-  unless (num <= 201) $ exitWith (ExitFailure num)
+      max_num = 201
+      min_num = max_num - 10 -- so that we don't forget to change the number
+                             -- when the number of dependencies decreases
+  -- putStrLn $ "Found " ++ show num ++ " parser module dependencies"
+  -- forM_ (map moduleNameString $ nonDetEltsUniqSet modules) putStrLn
+  unless (num <= max_num && num >= min_num) $ exitWith (ExitFailure num)
 
 parserDeps :: FilePath -> IO (UniqSet ModuleName)
 parserDeps libdir =


=====================================
utils/haddock
=====================================
@@ -1 +1 @@
-Subproject commit 37c47822d390b553ce24fe256c9700d5fd83bf9f
+Subproject commit a18c3af7f983f3b6d3cd84093c9079031da58468



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/8e3f00dd24936b6674d0a2322f8410125968583e

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/8e3f00dd24936b6674d0a2322f8410125968583e
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20200930/6e8e86b2/attachment-0001.html>


More information about the ghc-commits mailing list