ligo/tools/lsp/README.md
Anton Myasnikov 820d73f345
[LIGO-25] Chores (add Makefile, scripts, vendor, stylish)
Problem: We need to add stylish config to settle code style for our
project. Makefile to simplify its building. Also we need to check
our project for trailing whitespaces so we need to add the corresponding
script to be used later in CI.

Solution:
Add
  - stylish-haskell config
  - Makefile
  - `check_trailing_whitespace` script
2020-08-11 13:31:22 +03:00

70 lines
2.1 KiB
Markdown

## What
A language server for all three dialects of LIGO.
## Design choices
The server contains 2 big parts:
1) Grammars
2) Server itself.
Grammars are in separate folders, in form of tree-sitter grammars.
They are compiled via `tree-sitter generate` command in their respective folder.
Then they are linked as `parser.c` file with GHC toolchain.
Because GHCi REPL is unable to link from outside of project folder, the `parser.c` is
symlinked into `vendor/` directory.
Right now only one parser is linked there; the name of symlink should be changed
in future.
Server part invokes the TS-parser and then constructs a tree of haskell datatypes
from the TS-tree. Then it is fed into `LIGO.Parser` (name will be changed), which
constructs an universal LIGO from the tree of the respective language.
Parser uses the root `Parser` module which provides the combinators and monad
to deal with `ParseTree`, produced from TS output.
The tree it produces has:
1) An `ASTInfo` at each node, which contains the `Range` of that node and
preceeding comments. Sadly, but the comments after all the code in the module
are lost.
2) Some structure;
3) Ability to be just an `Error` instead of all above. An error contains `Range`
as well.
It is possible to update the scopes in the tree, using `updateTree` function,
which is a specialised custom `traverse`.
It is also possible to get the zipper-like chain of trees, covering some node,
in ascending order - using `spineTo` function. If you have already pinned
the scopes, you can just take first one and pull the scope out of it. Unless
it is an `Error` node. We probably need th error nodes to be `Functor`s
as well as any other structures used to build the tree.
On top of all that is an event loop for handling messages from some lsp-client.
## For developers
To compile and run, the following tools are needed:
1) tree-sitter-clr (the Node.js one was usied during development)
2) optionally, nix package manager
3) haskell-stack
First, you need to generate the `parser.c`.
For that, do
```
cd tools/lsp/pascaligo
tree-sitter generate
```
Then
```
cd ../squirrel
stack install
```
The executable is a language server.