Skip to content

Latest commit

 

History

History
414 lines (231 loc) · 14.7 KB

features.md

File metadata and controls

414 lines (231 loc) · 14.7 KB

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
Semantic tokens textDocument/semanticTokens/full

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 plugin 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.

Stan hints

Provided by: hls-stan-plugin

Provides Stan hints as diagnostics.

Cabal parse errors and warnings

Provided by: hls-cabal-plugin

Provides errors and warnings from Cabal as diagnostics

Hovers

Provided by: ghcide

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

Show fixity

Provided by: hls-explicit-fixity-plugin

Provides fixity information.

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
Floskell hls-floskell-plugin
Fourmolu hls-fourmolu-plugin
Ormolu hls-ormolu-plugin
Stylish Haskell hls-stylish-haskell-plugin

Format your cabal files with a cabal code formatter.

Formatter Provided by
cabal-fmt hls-cabal-fmt-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).

Refine import

Provided by: hls-explicit-imports-plugin

Code action kind: quickfix.import.refine

Refines imports to more specific modules when names are re-exported (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.

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

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

Add argument to function

Provided by: hls-refactor-plugin

Code action kind: quickfix

Add an undefined variable as an argument to the top-level binding.

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

Expand record wildcard

Provided by: hls-explicit-record-fields-plugin

Code action kind: refactor.rewrite

Expand record wildcards, explicitly listing all record fields as field puns.

Explicit Wildcard Demo

Unknown SPDX License suggestion

Provided by: hls-cabal-plugin

Code action kind: quickfix

Correct common misspelling of SPDX Licenses such as BSD-3-Clause.

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-explicit-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-code-range-plugin

Provides haskell specific shrink/expand selection support.

Selection range demo

Folding range

Provided by: hls-code-range-plugin

Provides haskell specific Folding support.

Folding 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:

Semantic tokens

Provided by: hls-semantic-tokens-plugin

Provides semantic tokens for each token in the source code to support semantic highlighting.

Rewrite to overloaded record syntax

Provided by: hls-overloaded-record-dot-plugin

Code action kind: refactor.rewrite

Rewrites record selectors to use overloaded dot syntax

Explicit Wildcard Demo

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