Features

This table gives a summary of the features that HLS supports. Many of these are standard LSP features, but a lot of special features are provided as code actions and code lenses.

Feature

LSP method

Diagnostics

textDocument/publishDiagnostics

Hovers

textDocument/hover

Jump to definition

textDocument/definition

Jump to type definition

textDocument/typeDefinition

Find references

textDocument/references

Completions

textDocument/completion

Formatting

textDocument/formatting, textDocument/rangeFormatting

Document symbols

textDocument/documentSymbol

Workspace symbols

workspace/symbol

Call hierarchy

textDocument/prepareCallHierarchy, callHierarchy/incomingCalls, callHierarchy/outgoingCalls

Highlight references

textDocument/documentHighlight

Code actions

textDocument/codeAction

Code lenses

textDocument/codeLens

Selection range

textDocument/selectionRange

Rename

textDocument/rename

The individual sections below also identify which HLS plugin is responsible for providing the given functionality, which is useful if you want to raise an issue report or contribute! Additionally, not all plugins are supported on all versions of GHC, see the GHC version support page for details.

Diagnostics

GHC compiler errors and warnings

Provided by: ghcide

Provides errors and warnings from GHC as diagnostics.

Hlint hints

Provided by: hls-hlint-plugin

Provides hlint hints as diagnostics.

Hovers

Provided by: ghcide

Type information and documentation on hover, including from local definitions.

Jump to definition

Provided by: ghcide

Jump to the definition of a name.

Known limitations:

Jump to type definition

Provided by: ghcide

Known limitations:

Find references

Provided by: ghcide

Find references to a name within the project.

Completions

Code completions

Provided by: ghcide

  • Completion of names from qualified imports.

  • Completion of names from non-imported modules.

Pragma completions

Provided by: hls-pragmas-plugin

Completions for language pragmas.

Formatting

Format your code with various Haskell code formatters.

Formatter

Provided by

Brittany

hls-brittany-plugin

Floskell

hls-floskell-plugin

Fourmolu

hls-fourmolu-plugin

Ormolu

hls-ormolu-plugin

Stylish Haskell

hls-stylish-haskell-plugin

Document symbols

Provided by: ghcide

Provides listing of the symbols defined in a module, used to power outline displays.

Workspace symbols

Provided by: ghcide

Provides listing of the symbols defined in the project, used to power searches.

Call hierarchy

Provided by: hls-call-hierarchy-plugin

Shows ingoing and outgoing calls for a function.

Call Hierarchy in VSCode

Highlight references

Provided by: ghcide

Highlights references to a name in a document.

Code actions

Insert missing pragmas

Provided by: hls-pragma-plugin

Code action kind: quickfix

Inserts missing pragmas needed by GHC.

Apply Hlint fixes

Provided by: hls-hlint-plugin

Code action kind: quickfix

Applies hints, either individually or for the whole file. Uses apply-refact.

Hlint Demo

Known limitations:

  • May have strange behaviour in files with CPP, since apply-refact does not support CPP.

  • The hlint executable by default turns on many extensions when parsing a file because it is not certain about the exact extensions that apply to the file (they may come from project files). This differs from HLS which uses only the extensions the file needs to parse the file. Hence it is possible for the hlint executable to report a parse error on a file, but the hlint plugin to work just fine on the same file. This does mean that the turning on/off of extensions in the hlint config may be ignored by the hlint plugin.

  • Hlint restrictions do not work (yet). This PR should enable that functionality, but this requires a newer version of hlint to be used in HLS.

Make import lists fully explicit

Provided by: hls-explicit-imports-plugin

Code action kind: quickfix.literals.style

Make import lists fully explicit (same as the code lens).

Qualify imported names

Provided by: hls-qualify-imported-names-plugin

Code action kind: quickfix

Rewrites imported names to be qualified.

Qualify Imported Names Demo

For usage see the readme.

Refine import

Provided by: hls-refine-imports-plugin

Code action kind: quickfix.import.refine

Refines imports to more specific modules when names are re-exported (same as the code lens).

Add missing class methods

Provided by: hls-class-plugin

Code action kind: quickfix

Adds placeholders for missing class methods in a class instance definition.

Unfold definition

Provided by: hls-retrie-plugin

Code action kind: refactor.extract

Extracts a definition from the code.

Fold definition

Provided by: hls-retrie-plugin

Code action kind: refactor.inline

Inlines a definition from the code.

Retrie Demo

Insert contents of Template Haskell splice

Provided by: hls-splice-plugin

Code action kind: refactor.rewrite

Evaluates a Template Haskell splice and inserts the resulting code in its place.

Convert numbers to alternative formats

Provided by: hls-alternate-number-format-plugin

Code action kind: quickfix.literals.style

Converts numeric literals to different formats.

Alternate Number Format Demo

Add Haddock comments

Provided by: hls-haddock-comments-plugin

Code action kind: quickfix

Adds Haddock comments for function arguments.

Wingman

Status: Not supported on GHC 9.2

Provided by: hls-tactics-plugin

Provides a variety of code actions for interactive code development, see https://haskellwingman.dev/ for more details.

Wingman Demo

Change Type Signature

Provided by: hls-change-type-signature-plugin

Code action kind: quickfix

Change/Update a type signature to match implementation.

Status: Until GHC 9.4, the implementation is ad-hoc and relies on GHC error messages to create a new signature. Not all GHC error messages are supported.

Known Limitations:

  • Not all GHC error messages are supported

  • Top-level and Function-local bindings with the same names can cause issues, such as incorrect signature changes or no code actions available.

Change Type Signature Demo

Change Type Signature Demo

Link to Docs

Convert to GADT syntax

Provided by: hls-gadt-plugin

Code action kind: refactor.rewrite

Convert a datatype to GADT syntax.

GADT Demo

Link to Docs

Code lenses

Add type signature

Provided by: ghcide

Shows the type signature for bindings without type signatures, and adds it with a click.

Evaluation code snippets in comments

Provided by: hls-eval-plugin

Evaluates code blocks in comments with a click. Tutorial.

Eval Demo

Known limitations:

Make import lists fully explicit code lens

Provided by: hls-explicit-imports-plugin

Shows fully explicit import lists and rewrites them with a click (same as the code action).

Imports code lens Demo

Refine import code lens

Provided by: hls-refine-imports-plugin

Shows refined imports and applies them with a click (same as the code action).

Fix module names

Provided by: hls-module-name-plugin

Shows module name matching file path, and applies it with a click.

Module Name Demo

Selection range

Provided by: hls-selection-range-plugin

Provides haskell specific shrink/expand selection support.

Selection range demo

Rename

Provided by: hls-rename-plugin

Provides renaming of symbols within a module. Experimental cross-module renaming can be enabled via the configuration.

Rename Demo

Known limitations:

Missing features

The following features are supported by the LSP specification but not implemented in HLS. Contributions welcome!

Feature

Status

LSP method

Signature help

Unimplemented

textDocument/signatureHelp

Jump to declaration

Unclear if useful

textDocument/declaration

Jump to implementation

Unclear if useful

textDocument/implementation

Folding

Unimplemented

textDocument/foldingRange

Semantic tokens

Unimplemented

textDocument/semanticTokens

Linked editing

Unimplemented

textDocument/linkedEditingRange

Document links

Unimplemented

textDocument/documentLink

Document color

Unclear if useful

textDocument/documentColor

Color presentation

Unclear if useful

textDocument/colorPresentation

Monikers

Unclear if useful

textDocument/moniker