When I was learning Haskell, I missed the nice features of IntelliJ IDEA. My first approach was to use 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 and Intero. It can create new Stack projects (by using template hspec
) and import existing Stack projects.
Any feedback is welcome!!
You can install this plugin using the Jetbrains plugin repository:
Settings
/Plugins
/Browse repositories
/Intellij-Haskell
- Syntax highlighting;
- Error/warning highlighting;
- 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 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 message. 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 identifier is not in scope;
- Code formatting with Hindent and/or Stylish-haskell. Formatting of selected code by Hindent;
- Code completion for project module names, language extensions and package names in Cabal file;
- Running REPL, tests and executables via
Run Configurations
;
- Install this plugin. Make sure no other Haskell plugin is installed in IntelliJ;
- Install latest version of Stack;
- Install latest versions of Hindent and Stylish-Haskell.
You have to install version of Hindent > 5.0, for example by:
stack install --resolver nightly-2016-11-06 hindent
Set file paths tohindent
andstylish-haskell
in theSettings
>Other Settings
>Haskell
; - Setup the project:
- Make sure your Stack project builds without errors. Preferably by using:
stack build --test --haddock --fast
; - After your project is built successfully, import project in IntelliJ by using
File
>New
>Project from Existing Sources...
from the IntelliJ menu; - In the
New Project
wizard selectImport project from external module
and checkHaskell Stack
; - In next page of wizard configure
Project SDK
by configuringHaskell Tool Stack
with selecting path tostack
binary, e.g./usr/local/bin/stack
; - Finish wizard and project will be opened;
- Wizard will automatically configure which folders are sources, test and which to exclude;
- Plugin will automatically build Intero and HLint to prevent incompatibility issues
(If you use non LTS or Nightly resolver e.g.
ghc-7.10.2
, you may have to build them manually since there are some extra-deps should be added tostack.yaml
). Those tools are built against Stackage release defined in project'sstack.yaml
. If you want to use later version of tool, you will have to build tool manually in project's folder by usingstack build
; - 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).
This option gives you nice navigation features through libraries. Sources are downloaded to folder
.intellij-haskell
inside your home folder; - After changes to dependencies you can download them again by using
Tools
>Haskell
>Download Haskell Library Sources
; - 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 checkingHaskell Log
checkbox in theEvent Log
>Settings
orSettings
>Appearance & Behavior
>Notifications
; - In the background for each Haskell project three Stack REPLs are running. You can restart them by
Tools
>Restart Haskell Stack REPLs
. - When you make changes to
stack.yaml
or Cabal file, IntelliJ will give you notification with the option to restart REPLs;
- Make sure your Stack project builds without errors. Preferably by using:
About Haskell Project
inHelp
menu shows which Haskell GHC/tools are used by plugin for project;- Intero depends on
libtinfo-dev
. On Ubuntu you can install it withsudo apt-get install libtinfo-dev
;
- Clone this project;
- Go to root of project and start sbt;
- Run task
updateIdea
from the sbt console; - Run task
compile
from the sbt console; - Install/enable the following plugins in IntelliJ: Plugin Devkit, Grammar-Kit and PsiViewer;
- Import this project as an sbt project in IntelliJ;
- Be sure
JVM SDK
insideLanguages & Frameworks
>Scala Compiler Server
is set to1.8
, since the Scala compiler version (2.12.3) which this plugin is currently using is not compatible with Java 7 or lower, Java 9 is not yet supported; - Select
Build
>Build Project
;
- Right click on top of
intellij-haskell.iml
insideintellij-haskell
folder; - Select
Import module
; - Be sure
unmanaged-jars
dependency is set toprovided
insideProject structure
>Project settings
>Modules
>Dependencies
(btw, settingprovided
inside sbt file gives error); - Right click on top of
intellij-haskell
plugin module and selectPrepare Plugin Module 'intellij-haskell' for deployment
;
- Set Plugin SDK settings right inside
Project structure
>Platform settings
>SDKs
. For example to, set SDK home path toidea/142.5239.7
inside project root folder; - Set
Module-SDK
right forintellij-haskell
plugin module insideProject structure
>Project structure
>Project settings
>Modules
; - To run plugin inside IntelliJ, first run configuration has to be created. Navigate to
Run
>Edit configurations
and createplugin
configuration forintellij-haskell
;
- After making changes to
_HaskellLexer.flex
, runRun Flex Generator
. This will generate_HaskellLexer.java
; - After making changes to
haskell.bnf
, runGenerate Parser Code
. This will generate parser Java files ingen
directory; - Add
sources.zip
insideidea
>[idea build #
] toProject structure
>Project settings
>Modules
>Dependencies
>unmanaged-jars
to see IntelliJ sources;