ligo/tools/lsp/README.md

70 lines
2.1 KiB
Markdown
Raw Normal View History

2020-06-04 16:06:51 +04:00
## 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.
2020-06-04 17:40:38 +04:00
Because GHCi REPL is unable to link from outside of project folder, the `parser.c` is
2020-06-04 16:06:51 +04:00
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.
2020-06-04 16:06:51 +04:00
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
```
2020-06-04 16:06:51 +04:00
The executable is a language server.