.. _readme-chpl-language-server:
chpl-language-server
====================
``chpl-language-server`` (``CLS`` for short) is a language intelligence tool
for the Chapel programming language. ``CLS`` provides many of the common
features users expect from a modern development environment. It is built on top
of the `Language Server Protocol (LSP)
`_ and is designed to be
editor-agnostic.
Getting Started
---------------
The easiest way to make ``CLS`` available is by using the
``chpl-language-server`` Makefile target. This will build the Dyno compiler
frontend and the Python bindings for Dyno if needed, and place
``chpl-language-server`` into ``$CHPL_HOME/bin``. Make sure that you satisfy :ref:`the requirements for building the Python bindings `.
.. code-block:: bash
cd $CHPL_HOME
make chpl-language-server
chpl-language-server --help
``CLS`` can be used with any editor that supports the LSP. See the
:ref:`Editor Support page ` for details on a specific
editor.
Supported Features
------------------
``CLS`` supports a number of core features, with further features controlled by configuration options.
.. note::
Not all editor integrations may support all features. This list details
features that are supported by ``CLS`` itself, not by any particular editor.
Core Features
^^^^^^^^^^^^^
* Diagnostics
Errors and warnings are reported on file save. ``CLS`` also has limited
support to fix some errors and warnings automatically with quick fixes.
* Symbol Information
``CLS`` provides basic information about symbols in code, enabling various
actions. For example, you can jump to the definition of a symbol, find all
references to a symbol, and rename a symbol. Hovering over a symbol will
show its definition and documentation. Selecting a symbol will highlight all
references to it in the file.
* Code Completion
``CLS`` provides limited code completion for symbols imported from modules
or present in your code.
Optional Features
^^^^^^^^^^^^^^^^^
* End of Block Markers
``CLS`` can display markers after a closing brace to indicate what block it
closes. This feature is off-by-default, but can be enabled with
``--end-markers ``.
```` is a comma-separated list of markers to display. The
following markers are supported:
* ``none``: Do not display any end markers. This is the default.
* ``all``: Display all end markers.
* ``decl``: Display markers for the end of a declaration (e.g. modules,
records, functions, etc.)
* ``loop``: Display markers for the end of a loop (e.g. ``for``,
``forall``, ``while``, etc.)
* ``block``: Display markers for the end of other important blocks (e.g.
``on``, ``begin``, etc.)
End of block markers have a threshold of 10 lines of code. If a block is
smaller than this, no end marker will be displayed. This threshold can be
adjusted with ``--end-marker-threshold ``.
Experimental Resolver Features
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
All of the following features are disabled without the ``--resolver`` flag. To
use them, enable ``--resolver``.
.. warning::
These features rely on the Dyno resolver, which is not finished and actively
under development. It is fairly common for ``--resolver`` to cause ``CLS``
to crash or hang.
* Type Information
``CLS`` can resolve the type of a symbol and allow jumping to type
definitions.
* Call Hierarchy
Some editors support showing a call hierarchy for a symbol, both inbound
calls and outbound calls. ``CLS`` supports this basic feature, as well as
enabling some additional features for this with generic functions.
The following features are extra visual aids:
+----------------+--------------------------------------------+---------------------------------------+
| Feature | Description | Flag |
+----------------+--------------------------------------------+---------------------------------------+
| Type Inlays | Type information can be displayed inline | ``--type-inlays`` (default), |
| | as an inlay hint. | ``--no-type-inlays`` |
+----------------+--------------------------------------------+---------------------------------------+
| Param Inlays | ``param`` values can be computed and | ``--param-inlays`` (default), |
| | displayed inline as inlay hints. | ``--no-param-inlays`` |
+----------------+--------------------------------------------+---------------------------------------+
| Evaluated | ``param`` values can also be computed and | ``--evaluate-expressions`` (default), |
| Tooltips | displayed as tooltips. | ``--no-evaluate-expressions`` |
+----------------+--------------------------------------------+---------------------------------------+
| Call Inlays | Names of literal arguments can be | ``--literal-arg-inlays`` (default), |
| | displayed inline as inlay hints. | ``--no-literal-arg-inlays`` |
+----------------+--------------------------------------------+---------------------------------------+
| Dead Code | Dyno can determine compile-time dead code, | ``--dead-code`` (default), |
| | which ``CLS`` highlights in the editor. | ``--no-dead-code`` |
+----------------+--------------------------------------------+---------------------------------------+
| Generic | ``CLS`` can show the various | ``--show-instantiations`` (default), |
| Instantiations | instantiations of a generic function. | ``--no-show-instantiations`` |
+----------------+--------------------------------------------+---------------------------------------+
Using ``chplcheck`` from ``CLS``
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Although :ref:`chplcheck ` is a separate tool from ``CLS``,
it can be used from ``CLS`` to provide additional diagnostics. This is done by
enabling the ``--chplcheck`` flag. This will incorporate the diagnostics and
fixits from ``chplcheck``.
You can also still pass many of the same ``chplcheck`` flags to ``CLS``, just
prefixed with ``--chplcheck-``. For example, the following command runs the
language server with linting enabled various ``chplcheck`` flags:
.. code-block:: bash
chpl-language-server --chplcheck \
--chplcheck-enable-rule UseExplicitModules \
--chplcheck-disable-rule UnusedLoopIndex \
--chplcheck-add-rules path/to/my/myrules.py
Configuring Chapel Projects
---------------------------
Many Chapel projects are organized in a way that is not immediately
understandable by ``CLS``. For example, a project may have multiple source
directories with any variety of build systems (``make``, ``mason``, etc.).
``CLS`` can be configured to understand the structure of a Chapel project by
creating a ``.cls-commands.json`` file in the root of the project. This is done
automatically when ``chpl-shim`` is used to build a project.
.. note::
The ``.cls-commands.json`` file is not intended to be edited by hand. It is
generated by ``chpl-shim`` and should be treated as a build artifact. It is
specific to the machine and build environment that generated it.
For example, the following can be used to configure ``CLS`` to understand a
project using ``make``:
.. code-block:: bash
$CHPL_HOME/tools/chpl-language-server/chpl-shim make
This is similarly done for ``mason`` projects:
.. code-block:: bash
$CHPL_HOME/tools/chpl-language-server/chpl-shim mason build
.. note::
The above commands assume a from-source build of Chapel. An installed Chapel
may require a different path to ``chpl-shim``.
.. note::
First-class ``mason`` support is currently planned (but not yet
implemented), avoiding the need for ``chpl-shim`` in ``mason`` projects.