diff options
-rw-r--r-- | ghc/InteractiveUI.hs | 45 |
1 files changed, 17 insertions, 28 deletions
diff --git a/ghc/InteractiveUI.hs b/ghc/InteractiveUI.hs index 8d0205d846..45bac2c9ef 100644 --- a/ghc/InteractiveUI.hs +++ b/ghc/InteractiveUI.hs @@ -1645,13 +1645,16 @@ addImportToContext str = do st { remembered_ctx = addNotSubsumed (IIDecl idecl) (remembered_ctx st) } setGHCContextFromGHCiState --- TODO: ARGH! This is a mess! 'checkAdd' is called from many places and we --- have about 4 different variants of setGHCContext. All this import code needs --- to be refactored to something saner. We should do the sanity check on an --- import in 'checkAdd' and checkAdd only and only need to call checkAdd from --- one place ('setGHCContetFromGHCiState'). The code isn't even logically --- ordered! -checkAdd :: Bool -> String -> GHCi (InteractiveImport) +setContext :: [String] -> [String] -> GHCi () +setContext starred not_starred = do + is1 <- mapM (checkAdd True) starred + is2 <- mapM (checkAdd False) not_starred + let iss = foldr addNotSubsumed [] (is1++is2) + modifyGHCiState $ \st -> st { remembered_ctx = iss, transient_ctx = [] } + -- delete the transient context + setGHCContextFromGHCiState + +checkAdd :: Bool -> String -> GHCi InteractiveImport checkAdd star mstr = do dflags <- getDynFlags case safeLanguageOn dflags of @@ -1661,8 +1664,8 @@ checkAdd star mstr = do s <- GHC.isModuleTrusted m case s of True -> return $ IIDecl (simpleImportDecl $ moduleName m) - False -> ghcError $ CmdLineError $ - "can't import " ++ mstr ++ " as it isn't trusted." + False -> ghcError $ CmdLineError $ "can't import " ++ mstr + ++ " as it isn't trusted." False | star -> do m <- wantInterpretedModule mstr return $ IIModule m @@ -1684,26 +1687,12 @@ checkAdd star mstr = do -- setGHCContextFromGHCiState :: GHCi () setGHCContextFromGHCiState = do + let ok (IIModule m) = checkAdd True (moduleNameString (moduleName m)) + ok (IIDecl d) = checkAdd False (moduleNameString (unLoc (ideclName d))) st <- getGHCiState - goodTran <- filterM (tryBool . ok) $ transient_ctx st - goodRemb <- filterM (tryBool . ok) $ remembered_ctx st - -- drop bad imports so we don't keep replaying it to the user! - modifyGHCiState $ \s -> s { transient_ctx = goodTran } - modifyGHCiState $ \s -> s { remembered_ctx = goodRemb } - setGHCContext (goodTran ++ goodRemb) + iidecls <- filterM (tryBool . ok) (transient_ctx st ++ remembered_ctx st) + setGHCContext iidecls - where - ok (IIModule m) = checkAdd True (moduleNameString (moduleName m)) - ok (IIDecl d) = checkAdd False (moduleNameString (unLoc (ideclName d))) - -setContext :: [String] -> [String] -> GHCi () -setContext starred not_starred = do - is1 <- mapM (checkAdd True) starred - is2 <- mapM (checkAdd False) not_starred - let iss = foldr addNotSubsumed [] (is1++is2) - modifyGHCiState $ \st -> st { remembered_ctx = iss, transient_ctx = [] } - -- delete the transient context - setGHCContextFromGHCiState -- | Sets the GHC contexts to the given set of imports, adding a Prelude -- import if there isn't an explicit one already. @@ -2756,7 +2745,7 @@ tryBool :: GHCi a -> GHCi Bool tryBool m = do r <- ghciTry m case r of - Left e -> showException e >> return False + Left _ -> return False Right _ -> return True -- ---------------------------------------------------------------------------- |