Skip to content

Instantly share code, notes, and snippets.

@utdemir
Created January 20, 2021 08:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save utdemir/9b5794d32e97fccbaa6366e531fc0d20 to your computer and use it in GitHub Desktop.
Save utdemir/9b5794d32e97fccbaa6366e531fc0d20 to your computer and use it in GitHub Desktop.
{-# LANGUAGE TypeApplications #-}
module TidyImportsPlugin (plugin) where
import Data.Function ((&))
import Data.Generics (Data, cast, gmapQr)
import GHC.Hs
import GhcPlugins
plugin :: Plugin
plugin =
defaultPlugin
{ pluginRecompile = const $ return NoForceRecompile,
parsedResultAction = \_ _ parsed ->
return $ parsed {hpm_module = modifyHsMod <$> hpm_module parsed}
}
modifyHsMod :: HsModule GhcPs -> HsModule GhcPs
modifyHsMod m =
let newImports =
hsmodDecls m
& map referencedModules
& unionManyUniqSets
& nonDetEltsUniqSet
& map (\n -> noLoc (simpleImportDecl n) {ideclQualified = QualifiedPre})
in m {hsmodImports = hsmodImports m ++ newImports}
referencedModules :: Data a => a -> UniqSet ModuleName
referencedModules =
gmapQr
unionUniqSets
emptyUniqSet
( \d ->
cast @_ @ModuleName d
& maybe (referencedModules d) unitUniqSet
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment