hindent-6.1.0: src/HIndent/Pretty/Import.hs
{-# LANGUAGE CPP #-}
-- | Helper functions for dealing with import declarations.
module HIndent.Pretty.Import
( importsExist
, extractImports
, extractImportsSorted
, groupImports
) where
import GHC.Types.SrcLoc
import HIndent.GhcLibParserWrapper.GHC.Hs
import HIndent.Pretty.Import.Sort
-- | Returns if the module has import declarations.
importsExist :: HsModule' -> Bool
importsExist = not . null . hsmodImports
-- | Extracts import declarations from the given module. Adjacent import
-- declarations are grouped as a single list.
extractImports :: HsModule' -> [[LImportDecl GhcPs]]
extractImports = groupImports . sortImportsByLocation . hsmodImports
-- | Extracts import declarations from the given module and sorts them by
-- their names. Adjacent import declarations are grouped as a single list.
extractImportsSorted :: HsModule' -> [[LImportDecl GhcPs]]
extractImportsSorted = fmap sortImportsByName . extractImports
-- | Combines adjacent import declarations into a single list.
groupImports :: [LImportDecl GhcPs] -> [[LImportDecl GhcPs]]
groupImports = groupImports' []
where
groupImports' ::
[[LImportDecl GhcPs]] -> [LImportDecl GhcPs] -> [[LImportDecl GhcPs]]
groupImports' xs [] = xs
groupImports' [] (x:xs) = groupImports' [[x]] xs
groupImports' [[]] (x:xs) = groupImports' [[x]] xs
groupImports' ([]:x:xs) (y:ys) = groupImports' ([y] : x : xs) ys
groupImports' ((z:zs):xs) (y:ys)
| z `isAdjacentTo` y = groupImports' ((y : z : zs) : xs) ys
| otherwise = groupImports' ([y] : (z : zs) : xs) ys
a `isAdjacentTo` b =
srcSpanEndLine (sp a) + 1 == srcSpanStartLine (sp b)
|| srcSpanEndLine (sp b) + 1 == srcSpanStartLine (sp a)
sp x =
case locA $ getLoc x of
RealSrcSpan x' _ -> x'
_ -> error "Src span unavailable."