IntelliJ plugin for Haskell
When I was learning Haskell, I missed the nice features of IntelliJ IDEA. My first approach was to use the default way of creating an IntelliJ plugin by defining a grammar and a lexer according to Haskell report. That didn't work out because I could not define all the recursion. Then I decided to use grammar and lexer definitions only for tokenizing and parsing Haskell code, and not for syntax checking the code. This is needed for syntax highlighting, all kinds of navigation, and so on. Further Haskell language support is provided with the help of external tools.
This plugin depends mainly on Stack. It can create new Stack projects and import existing Stack projects.
GHC 8.2.2 and later is supported.
Any feedback is welcomed!!
Installing the plugin
You can install this plugin using the Jetbrains plugin repository:
Settings
/Plugins
/Browse repositories
/IntelliJ-Haskell`
Installing the latest beta of the plugin
To try out the latest beta version one can install the plugin by adding https://plugins.jetbrains.com/plugins/alpha/8258
as a custom plugin repository in Settings
/Plugins
/Browse repositories
/Manage repositories
.
An alternative way to install the latest beta version is to download IntelliJ-haskell.zip
from releases and apply Install plugin from disk
in Settings
/Plugins
.
Features
- Syntax highlighting;
- Error/warning highlighting;
- Haskell Problems View. This tool window displays GHC messages for the currently edited files;
- Find usages of identifiers;
- Resolve references to identifiers;
- Code completion;
- In-place rename identifiers;
- View type info from (selected) expression;
- View sticky type info;
- View expression info;
- View quick documentation;
- View quick definition;
- Structure view;
- Goto to declaration (called
Navigate
>Declaration
in IntelliJ menu); - Navigate to declaration (called
Navigate
>Class
in IntelliJ menu); - Navigate to an identifier (called
Navigate
>Symbol
in IntelliJ menu); - Goto instance declaration (called
Navigate
>Instance Declaration
in IntelliJ menu); - Navigate to declaration or identifier powered by Hoogle (called
Navigate
>Navigation by Hoogle
in IntelliJ menu); - Inspection by HLint;
- Quick fixes for HLint suggestions;
- Show error action to view formatted messages. Useful in case message consists of multiple lines (Ctrl-F10, Meta-F10 on Mac OSX);
- Intention actions to add language extension (depends on compiler error), add top-level type signature (depends on compiler warning);
- Intention action to select which module to import if the identifier is not in scope;
- Default code formatting by
ormolu
. Alternatively bystylish-Haskell
. - Code completion for project module names, language extensions, and package names in Cabal file;
- Running REPL, tests, and executables via
Run Configurations
; - Smart code completion on typed holes (since GHC 8.4);
Getting started
- If you don't already have IntelliJ, download it - the Community Edition is sufficient.
- Install this plugin using the Jetbrains plugin repository:
Settings
/Plugins
/Browse repositories
/IntelliJ-Haskell`. Make sure no other Haskell plugin is installed in IntelliJ; - Install the latest version of Stack; use
stack upgrade
to confirm you are on the latest version. - Setup the project:
- Make sure your Stack project builds without errors. Preferably by using:
stack build --test --haddock --no-haddock-hyperlink-source
; - After your project is built successfully, import an existing project by:
- Inside IntelliJ use
File
>New
>Project from Existing Sources...
from the IntelliJ menu; - In the
Welcome to IntelliJ IDEA
dialog useOpen or Import Project
;
- Inside IntelliJ use
- In the
New Project
wizard selectImport project from external model
and checkHaskell Stack
; - On the next page of wizard configure
Project SDK
by configuringHaskell Tool Stack
by selecting a path tostack
binary, e.g./usr/local/bin/stack
(you can usewhich stack
on Linux or macOS orwhere stack
on windows to find the path); - Finish wizard and project will be opened;
- Wizard will automatically configure which folders are sources, test and which to exclude;
- Plugin will automatically build Haskell Tools (HLint, Hoogle, Ormolu, and Stylish Haskell) to prevent incompatibility issues
- Check
Project structure
>Project settings
>Modules
which folders to exclude (like.stack-work
anddist
) and which folders areSource
andTest
(normallysrc
andtest
); - Plugin will automatically download library sources. They will be added as source libraries to module(s).
- After changing the Cabal file and/or
stack.yaml
useHaskell
>Haskell
>Update Settings and Restart REPLs
to download missing library sources and update the project settings; - The
Event Log
will display what's going on in the background. Useful when something fails. It's disabled by default. It can be enabled by checking theHaskell Log
checkbox in theEvent Log
>Settings
orSettings
>Appearance & Behavior
>Notifications
;
- Make sure your Stack project builds without errors. Preferably by using:
Remarks
- IntelliJ's Build action is not (yet) implemented. Project is built when the project is opened and when needed, e.g. when library code is changed and the user navigates to test code;
About Haskell Project
inHelp
menu shows which Haskell GHC/tools are used by the plugin for the project;- GHC depends on
libtinfo-dev
. On Ubuntu you can install it withsudo apt-get install libtinfo-dev
; - Haskell tools depend on
libgmp3-dev zlib1g-dev
. On Ubuntu you can install them withsudo apt-get install libgmp3-dev zlib1g-dev
; - Cabal's internal libraries are not (yet) supported;
- Cabal's common stanzas are not (yet) supported;
- The Haskell tools are built in an IntelliJ sandbox with LTS-16. So they have no dependency on Stackage resolvers in your projects. After Stackage LTS-13 minor updates one can use
Haskell
>Update Haskell tools
; - Stack REPLs are running in the background. You can restart them by
Haskell
>Update Settings and Restart REPLs
.
If you want to contribute to this project, read the contributing guideline.