Cleanup loadTarget logic
This commit is contained in:
		
							parent
							
								
									d25908d3cb
								
							
						
					
					
						commit
						6de02ea470
					
				| @ -25,8 +25,8 @@ setDebugLogger put df = do | |||||||
| -- * Friendly to foreign export | -- * Friendly to foreign export | ||||||
| -- * Not friendly to -XTemplateHaskell and -XPatternSynonyms | -- * Not friendly to -XTemplateHaskell and -XPatternSynonyms | ||||||
| -- * Uses little memory | -- * Uses little memory | ||||||
| setModeSimple :: DynFlags -> DynFlags | setHscNothing :: DynFlags -> DynFlags | ||||||
| setModeSimple df = df { | setHscNothing df = df { | ||||||
|     ghcMode   = CompManager |     ghcMode   = CompManager | ||||||
|   , ghcLink   = NoLink |   , ghcLink   = NoLink | ||||||
|   , hscTarget = HscNothing |   , hscTarget = HscNothing | ||||||
| @ -37,8 +37,8 @@ setModeSimple df = df { | |||||||
| -- * Not friendly to foreign export | -- * Not friendly to foreign export | ||||||
| -- * Friendly to -XTemplateHaskell and -XPatternSynonyms | -- * Friendly to -XTemplateHaskell and -XPatternSynonyms | ||||||
| -- * Uses lots of memory | -- * Uses lots of memory | ||||||
| setModeIntelligent :: DynFlags -> DynFlags | setHscInterpreted :: DynFlags -> DynFlags | ||||||
| setModeIntelligent df = df { | setHscInterpreted df = df { | ||||||
|     ghcMode   = CompManager |     ghcMode   = CompManager | ||||||
|   , ghcLink   = LinkInMemory |   , ghcLink   = LinkInMemory | ||||||
|   , hscTarget = HscInterpreted |   , hscTarget = HscInterpreted | ||||||
|  | |||||||
| @ -17,7 +17,6 @@ module Language.Haskell.GhcMod.Internal ( | |||||||
|   -- * Environment, state and logging |   -- * Environment, state and logging | ||||||
|   , GhcModEnv(..) |   , GhcModEnv(..) | ||||||
|   , GhcModState |   , GhcModState | ||||||
|   , CompilerMode(..) |  | ||||||
|   , GhcModLog |   , GhcModLog | ||||||
|   , GmLog(..) |   , GmLog(..) | ||||||
|   , GmLogLevel(..) |   , GmLogLevel(..) | ||||||
| @ -34,8 +33,6 @@ module Language.Haskell.GhcMod.Internal ( | |||||||
|   -- ** Accessing 'GhcModEnv' and 'GhcModState' |   -- ** Accessing 'GhcModEnv' and 'GhcModState' | ||||||
|   , options |   , options | ||||||
|   , cradle |   , cradle | ||||||
|   , getCompilerMode |  | ||||||
|   , setCompilerMode |  | ||||||
|   , targetGhcOptions |   , targetGhcOptions | ||||||
|   , withOptions |   , withOptions | ||||||
|   -- * 'GhcModError' |   -- * 'GhcModError' | ||||||
|  | |||||||
| @ -36,7 +36,6 @@ module Language.Haskell.GhcMod.Monad.Types ( | |||||||
|   , defaultGhcModState |   , defaultGhcModState | ||||||
|   , GmGhcSession(..) |   , GmGhcSession(..) | ||||||
|   , GmComponent(..) |   , GmComponent(..) | ||||||
|   , CompilerMode(..) |  | ||||||
|   -- * Accessing 'GhcModEnv', 'GhcModState' and 'GhcModLog' |   -- * Accessing 'GhcModEnv', 'GhcModState' and 'GhcModLog' | ||||||
|   , GmLogLevel(..) |   , GmLogLevel(..) | ||||||
|   , GhcModLog(..) |   , GhcModLog(..) | ||||||
| @ -50,8 +49,6 @@ module Language.Haskell.GhcMod.Monad.Types ( | |||||||
|   , options |   , options | ||||||
|   , outputOpts |   , outputOpts | ||||||
|   , withOptions |   , withOptions | ||||||
|   , getCompilerMode |  | ||||||
|   , setCompilerMode |  | ||||||
|   , getMMappedFiles |   , getMMappedFiles | ||||||
|   , setMMappedFiles |   , setMMappedFiles | ||||||
|   , addMMappedFile |   , addMMappedFile | ||||||
| @ -549,12 +546,6 @@ outputOpts = gmoOptions `liftM` gmoAsk | |||||||
| cradle :: GmEnv m => m Cradle | cradle :: GmEnv m => m Cradle | ||||||
| cradle = gmCradle `liftM` gmeAsk | cradle = gmCradle `liftM` gmeAsk | ||||||
| 
 | 
 | ||||||
| getCompilerMode :: GmState m => m CompilerMode |  | ||||||
| getCompilerMode = gmCompilerMode `liftM` gmsGet |  | ||||||
| 
 |  | ||||||
| setCompilerMode :: GmState m => CompilerMode -> m () |  | ||||||
| setCompilerMode mode = (\s -> gmsPut s { gmCompilerMode = mode } ) =<< gmsGet |  | ||||||
| 
 |  | ||||||
| getMMappedFiles :: GmState m => m FileMappingMap | getMMappedFiles :: GmState m => m FileMappingMap | ||||||
| getMMappedFiles = gmMMappedFiles `liftM` gmsGet | getMMappedFiles = gmMMappedFiles `liftM` gmsGet | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -143,7 +143,7 @@ runGmlTWith efnmns' mdf wrapper action = do | |||||||
|                   | otherwise = setEmptyLogger |                   | otherwise = setEmptyLogger | ||||||
| 
 | 
 | ||||||
|     initSession opts' $ |     initSession opts' $ | ||||||
|         setModeSimple >>> setLogger >>> mdf |         setHscNothing >>> setLogger >>> mdf | ||||||
| 
 | 
 | ||||||
|     mappedStrs <- getMMappedFilePaths |     mappedStrs <- getMMappedFilePaths | ||||||
|     let targetStrs = mappedStrs ++ map moduleNameString mns ++ cfns |     let targetStrs = mappedStrs ++ map moduleNameString mns ++ cfns | ||||||
| @ -430,20 +430,24 @@ loadTargets opts targetStrs = do | |||||||
| 
 | 
 | ||||||
|     setTargets targets |     setTargets targets | ||||||
| 
 | 
 | ||||||
|     mode <- getCompilerMode |     mg <- depanal [] False | ||||||
|     if mode == Intelligent | 
 | ||||||
|       then loadTargets' Intelligent |     let interp = needsHscInterpreted mg | ||||||
|       else do |     target <- hscTarget <$> getSessionDynFlags | ||||||
|         mdls <- depanal [] False |     when (interp && target /= HscInterpreted) $ do | ||||||
|         let fallback = needsFallback mdls |  | ||||||
|         if fallback then do |  | ||||||
|       resetTargets targets |       resetTargets targets | ||||||
|             setIntelligent |       _ <- setSessionDynFlags . setHscInterpreted =<< getSessionDynFlags | ||||||
|             gmLog GmInfo "loadTargets" $ |       gmLog GmInfo "loadTargets" $ text "Target needs interpeter, switching to LinkInMemory/HscInterpreted. Perfectly normal if anything is using TemplateHaskell, QuasiQuotes or PatternSynonyms." | ||||||
|                 text "Target needs interpeter, switching to LinkInMemory/HscInterpreted. Perfectly normal if anything is using TemplateHaskell, QuasiQuotes or PatternSynonyms." | 
 | ||||||
|             loadTargets' Intelligent |     target' <- hscTarget <$> getSessionDynFlags | ||||||
|           else | 
 | ||||||
|             loadTargets' Simple |     case target' of | ||||||
|  |       HscNothing -> do | ||||||
|  |         void $ load LoadAllTargets | ||||||
|  |         mapM_ (parseModule >=> typecheckModule >=> desugarModule) mg | ||||||
|  |       HscInterpreted -> do | ||||||
|  |         void $ load LoadAllTargets | ||||||
|  |       _ -> error ("loadTargets: unsupported hscTarget") | ||||||
| 
 | 
 | ||||||
|     gmLog GmDebug "loadTargets" $ text "Loading done" |     gmLog GmDebug "loadTargets" $ text "Loading done" | ||||||
| 
 | 
 | ||||||
| @ -455,30 +459,16 @@ loadTargets opts targetStrs = do | |||||||
|       return $ Target tid taoc src |       return $ Target tid taoc src | ||||||
|     relativize tgt = return tgt |     relativize tgt = return tgt | ||||||
| 
 | 
 | ||||||
|     loadTargets' Simple = do |  | ||||||
|         void $ load LoadAllTargets |  | ||||||
|         mapM_ (parseModule >=> typecheckModule >=> desugarModule) =<< getModuleGraph |  | ||||||
| 
 |  | ||||||
|     loadTargets' Intelligent = do |  | ||||||
|         df <- getSessionDynFlags |  | ||||||
|         void $ setSessionDynFlags (setModeIntelligent df) |  | ||||||
|         void $ load LoadAllTargets |  | ||||||
| 
 |  | ||||||
|     resetTargets targets' = do |     resetTargets targets' = do | ||||||
|         setTargets [] |         setTargets [] | ||||||
|         void $ load LoadAllTargets |         void $ load LoadAllTargets | ||||||
|         setTargets targets' |         setTargets targets' | ||||||
| 
 | 
 | ||||||
|     setIntelligent = do |  | ||||||
|         newdf <- setModeIntelligent <$> getSessionDynFlags |  | ||||||
|         void $ setSessionDynFlags newdf |  | ||||||
|         setCompilerMode Intelligent |  | ||||||
| 
 |  | ||||||
|     showTargetId (Target (TargetModule s) _ _) = moduleNameString s |     showTargetId (Target (TargetModule s) _ _) = moduleNameString s | ||||||
|     showTargetId (Target (TargetFile s _) _ _) = s |     showTargetId (Target (TargetFile s _) _ _) = s | ||||||
| 
 | 
 | ||||||
| needsFallback :: ModuleGraph -> Bool | needsHscInterpreted :: ModuleGraph -> Bool | ||||||
| needsFallback = any $ \ms -> | needsHscInterpreted = any $ \ms -> | ||||||
|                 let df = ms_hspp_opts ms in |                 let df = ms_hspp_opts ms in | ||||||
|                    Opt_TemplateHaskell `xopt` df |                    Opt_TemplateHaskell `xopt` df | ||||||
|                 || Opt_QuasiQuotes     `xopt` df |                 || Opt_QuasiQuotes     `xopt` df | ||||||
|  | |||||||
| @ -199,16 +199,13 @@ data GhcModCaches = GhcModCaches { | |||||||
| 
 | 
 | ||||||
| data GhcModState = GhcModState { | data GhcModState = GhcModState { | ||||||
|       gmGhcSession   :: !(Maybe GmGhcSession) |       gmGhcSession   :: !(Maybe GmGhcSession) | ||||||
|     , gmCompilerMode :: !CompilerMode |  | ||||||
|     , gmCaches       :: !GhcModCaches |     , gmCaches       :: !GhcModCaches | ||||||
|     , gmMMappedFiles :: !FileMappingMap |     , gmMMappedFiles :: !FileMappingMap | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| data CompilerMode = Simple | Intelligent deriving (Eq,Show,Read) |  | ||||||
| 
 |  | ||||||
| defaultGhcModState :: GhcModState | defaultGhcModState :: GhcModState | ||||||
| defaultGhcModState = | defaultGhcModState = | ||||||
|     GhcModState n Simple (GhcModCaches n n n n) Map.empty |     GhcModState n (GhcModCaches n n n n) Map.empty | ||||||
|  where n = Nothing |  where n = Nothing | ||||||
| 
 | 
 | ||||||
| ---------------------------------------------------------------- | ---------------------------------------------------------------- | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Daniel Gröber
						Daniel Gröber