Import style GHC plugin
The plugin helps to unify imports style via compile warnings/errors
Tested with:
Usage
Yaml config
Enable plugin in your cabal file:
build-depends: ..., import-style-plugin, ... ghc-options: -fplugin ImportStylePlugin.Yaml -fplugin-opt ImportStylePlugin.Yaml:<path-to-config>
Write config:
qualificationStyle: Post | Pre | null bannedModules: # can be null Module.Name: severity: Error | Warning why: string with ban reason importRules: # can be null DataModuleName: severity: Error | Warning rules: - qualification: Required | Forbidden | null aliases: # Either `exactly`, so alias can't be omitted exactly: - Module.Alias - Alias # or just list, so alias can be omitted - Module.Alias - Alias # or null importedNames: # Either whitelist, so import should be # accompanied with explicit import list whitelist: - pattern (:|>) - type (+) - foo # or blacklist, so import should be # accompanied with explicit hiding list with all these names # or explicit import list shouldn't contain any of these names blacklist: - pattern (:|>) - type (+) - foo # or null
Here is example:
qualificationStyle: Post bannedModules: # Forbids Data.Map at all Data.Map: severity: Error why: Use 'Data.Map.Strict' importRules: # Either # import Data.Text (Text) # or # import Data.Text qualified as Text Data.Text: severity: Warning rules: - qualification: Required aliases: exactly: - Text - qualification: Forbidden importedNames: whitelist: - Text
Derived plugin
It can be useful if you have a lot of projects with one style. So you haven't to copy paste config but just use style as library
- Create library package
- Add to deps
import-style-plugin - Create module
YourPlugin.hs (or something like that, it's unimportant) - Put there
module YourPlugin where import ImportStylePlugin.Derived qualified as Derived import ImportStylePlugin.Config as Cfg -- variable name `plugin` IS important -- Configure your style with Haskell types from `ImportStylePlugin.Config` plugin = Derived.plugin ImportsStyle { qualificationStyle = ... , bannedModules = ... , importRules = ... }
- Plug in
build-depends: ..., your-import-style-plugin, ... ghc-options: -fplugin YourPlugin
Tips
Custom warning
Since ghc-9.8 the plugin introduces custom warning x-import-style. So if you set -Werror but still want to style warnings be warnings use ghc option -Wwarn=x-import-style. You also can disable at all warnings with -Wno-x-import-style