@@ -36,7 +36,6 @@ import Development.IDE.Import.FindImports
3636import Development.IDE.Core.FileStore
3737import Development.IDE.Types.Diagnostics
3838import Development.IDE.Types.Location
39−import Data.Bifunctor
4039import Data.Either.Extra
4140import Data.Maybe
4241import Data.Foldable
@@ -186,9 +185,20 @@ getLocatedImportsRule =
186185 env <- useNoFile_ GhcSession
187186 let dflags = addRelativeImport pm $ hsc_dflags env
188187 opt <- getIdeOptions
189− xs <- forM imports $ \(mbPkgName, modName) ->
190− (modName, ) <$> locateModule dflags (optExtensions opt) getFileExists modName mbPkgName
191− return (concat $ lefts $ map snd xs, Just $ map (second eitherToMaybe) xs)
188+ (diags, imports') <- fmap unzip $ forM imports $ \(mbPkgName, modName) -> do
189+ diagOrImp <- locateModule dflags (optExtensions opt) getFileExists modName mbPkgName
190+ case diagOrImp of
191+ Left diags -> pure (diags, Left (modName, Nothing))
192+ Right (FileImport path) -> pure ([], Left (modName, Just path))
193+ Right (PackageImport pkgId) -> liftIO $ do
194+ diagsOrPkgDeps <- computePackageDeps env pkgId
195+ case diagsOrPkgDeps of
196+ Left diags -> pure (diags, Right Nothing)
197+ Right pkgIds -> pure ([], Right $ Just $ pkgId : pkgIds)
198+ let (moduleImports, pkgImports) = partitionEithers imports'
199+ case sequence pkgImports of
200+ Nothing -> pure (concat diags, Nothing)
201+ Just pkgImports -> pure (concat diags, Just (moduleImports, Set.fromList $ concat pkgImports))
192202
193203
194204-- | Given a target file path, construct the raw dependency results by following
@@ -204,19 +214,10 @@ rawDependencyInformation f = go (Set.singleton f) Map.empty Map.empty
204214 Nothing ->
205215 let modGraph' = Map.insert f (Left ModuleParseError) modGraph
206216 in go fs modGraph' pkgs
207− Just imports -> do
208− packageState <- lift $ useNoFile_ GhcSession
209− modOrPkgImports <- forM imports $ \imp -> do
210− case imp of
211− (_modName, Just (PackageImport pkg)) -> do
212− pkgs <- ExceptT $ liftIO $ computePackageDeps packageState pkg
213− pure $ Right $ pkg:pkgs
214− (modName, Just (FileImport absFile)) -> pure $ Left (modName, Just absFile)
215− (modName, Nothing) -> pure $ Left (modName, Nothing)
216− let (modImports, pkgImports) = partitionEithers modOrPkgImports
217+ Just (modImports, pkgImports) -> do
217218 let newFiles = Set.fromList (mapMaybe snd modImports) Set.\\ Map.keysSet modGraph
218219 modGraph' = Map.insert f (Right modImports) modGraph
219− pkgs' = Map.insert f (Set.fromList $ concat pkgImports) pkgs
220+ pkgs' = Map.insert f pkgImports pkgs
220221 go (fs `Set.union` newFiles) modGraph' pkgs'
221222
222223getDependencyInformationRule :: Rules ()
@@ -270,9 +271,9 @@ getSpanInfoRule :: Rules ()
270271getSpanInfoRule =
271272 define $ \GetSpanInfo file -> do
272273 tc <- use_ TypeCheck file
273− imports <- use_ GetLocatedImports file
274+ (fileImports, _) <- use_ GetLocatedImports file
274275 packageState <- useNoFile_ GhcSession
275− x <- liftIO $ getSrcSpanInfos packageState (fileImports imports) tc
276+ x <- liftIO $ getSrcSpanInfos packageState fileImports tc
276277 return ([], Just x)
277278
278279-- Typechecks a module.
@@ -328,11 +329,3 @@ mainRule = do
328329
329330fileFromParsedModule :: ParsedModule -> NormalizedFilePath
330331fileFromParsedModule = toNormalizedFilePath . ms_hspp_file . pm_mod_summary
331−
332−fileImports ::
333− [(Located ModuleName, Maybe Import)]
334− -> [(Located ModuleName, Maybe NormalizedFilePath)]
335−fileImports = mapMaybe $ \case
336− (modName, Nothing) -> Just (modName, Nothing)
337− (modName, Just (FileImport absFile)) -> Just (modName, Just absFile)
338− (_modName, Just (PackageImport _pkg)) -> Nothing