GithubHelp home page GithubHelp logo

steshaw / intellij-haskell Goto Github PK

View Code? Open in Web Editor NEW

This project forked from rikvdkleij/intellij-haskell

0.0 2.0 0.0 2.89 MB

IntelliJ plugin for Haskell

Home Page: http://rikvdkleij.github.io/intellij-haskell/

License: Apache License 2.0

Scala 83.82% Shell 0.40% HTML 0.09% Java 10.64% Lex 5.04%

intellij-haskell's Introduction

logo IntelliJ plugin for Haskell

Join the chat at https://gitter.im/intellij-haskell/Lobby

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!!

Installing the plugin

You can install this plugin using the Jetbrains plugin repository: Settings/Plugins/Browse repositories/Intellij-Haskell

Features

  • 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 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;

Getting started

  • 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. Note that currently the latest version of Hindent is not on Stackage LTS. You have to install version of Hindent > 5.0, for example by: stack install --resolver nightly-2016-11-06 hindent Set file paths to hindent and stylish-haskell in the Settings/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 select Import project from external module and check Haskell Stack;
  • In next page of wizard configure Project SDK by configuring Haskell Tool Stack with selecting path to stack binary, e.g. /usr/local/bin/stack;
  • Finish wizard and project will be opened;
  • Wizard will try to 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 to stack.yaml). Those tools are built against Stackage release defined in project's stack.yaml. If you want to use later version of tool, you will have to build tool manually in project's folder by using stack build;
  • Check Project structure/Project settings/Modules which folders to exclude (like .stack-work and dist) and which folders are Source and Test (normally src and test);
  • Plugin will automatically download library sources (since Stack version 1.2.1 also for test dependencies). They will be added as source libraries to module. This option gives you nice navigation features through libraries. Sources are downloaded to folder .ideaHaskellLib inside root of project;
  • After changes to dependencies you can download them again by using Tools/Download Haskell Library Sources;
  • The Event Log will display what's going on in the background. Useful when something fails;
  • In the background for each Haskell project two Stack repls are running. You can restart them by Tools/Restart Haskell Stack REPLs. When you make large changes to stack.yaml or Cabal file, you have to restart IntelliJ project;

Remarks

  1. Plugin does not support multi package projects;
  2. IntelliJ has a nice terminal plugin;
  3. Developed plugin on Linux. Also tested on OSX;
  4. Windows is not supported;
  5. About Haskell Project in Help menu shows which Haskell GHC/tools are used by plugin for project;

How to build project

  1. Clone this project;
  2. Go to root of project and start sbt;
  3. Run task updateIdea from the sbt console;
  4. Run task compile from the sbt console;
  5. Install/enable the following plugins in IntelliJ: Plugin Devkit, Grammar-Kit and PsiViewer;
  6. Import this project as an sbt project in IntelliJ;
  7. Be sure JVM SDK inside Languages & Frameworks/Scala Compiler Server is set to 1.8, since the Scala compiler version (2.12.1) which this plugin is currently using is not compatible with Java 7 or lower, Java 9 is not yet supported;
  8. Select Build/Build Project;

How to prepare plugin for deployment

  1. Right click on top of intellij-haskell.iml inside intellij-haskell folder;
  2. Select Import module;
  3. Be sure unmanaged-jars dependency is set to provided inside Project structure/Project settings/Modules/Dependencies (btw, setting provided inside sbt file gives error);
  4. Right click on top of intellij-haskell plugin module and select Prepare Plugin Module 'intellij-haskell' for deployment;

How to run/debug plugin inside IntelliJ

  1. Set Plugin SDK settings right inside Project structure/Platform settings/SDKs. For example to, set SDK home path to idea/142.5239.7 inside project root folder;
  2. Set Module-SDK right for intellij-haskell plugin module inside Project structure/Project structure/Project settings/Modules;
  3. To run plugin inside IntelliJ, first run configuration has to be created. Navigate to Run/Edit configurations and create plugin configuration for intellij-haskell;

Development remarks

  1. After making changes to _HaskellLexer.flex, run Run Flex Generator. This will generate _HaskellLexer.java;
  2. After making changes to haskell.bnf, run Generate Parser Code. This will generate parser Java files in gen directory;
  3. Add sources.zip inside idea/[idea build #] to Project structure/Project settings/Modules/Dependencies/unmanaged-jars to see IntelliJ sources;

intellij-haskell's People

Contributors

rikvdkleij avatar zjhmale avatar oblosys avatar nightra avatar epost avatar chrissound avatar gitter-badger avatar

Watchers

Steven Shaw avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.