mirror of https://github.com/Wilfred/difftastic/
80 lines
2.7 KiB
Markdown
80 lines
2.7 KiB
Markdown
# tree-sitter-fsharp
|
|
tree-sitter grammar for F# (still WIP)
|
|
Based on [the 4.1 F# language specification](https://fsharp.org/specs/language-spec/4.1/FSharpSpec-4.1-latest.pdf) (Mostly, Appendix A)
|
|
and the [F# compiler parser](https://github.com/dotnet/fsharp/blob/main/src/Compiler/pars.fsy)
|
|
|
|
## Getting started
|
|
|
|
First, run `npm install` to install the `tree-sitter cli`.
|
|
Next, the grammar can be build using `npm run build`, or used to parse a file with `npm run parse $file`
|
|
|
|
### Project structure
|
|
The parser consists of two parts:
|
|
- `src/scanner.cc` is responsible for parsing newlines and comments and keeps track of indentation to open and close scopes.
|
|
- `grammar.js` the main tree-sitter grammar. The indent tokens from the external scanner is access though the `$.virtual_open_section` and `virtual_end_section` tokens.
|
|
|
|
The grammar starts with the `file` node at the begging of the rules.
|
|
|
|
### Adding to neovim
|
|
#### From the local copy:
|
|
```lua
|
|
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
|
|
parser_config.fsharp = {
|
|
install_info = {
|
|
url = "path/to/tree-sitter-fsharp",
|
|
files = {"src/scanner.cc", "src/parser.c" }
|
|
},
|
|
filetype = "fsharp",
|
|
}
|
|
```
|
|
#### From GitHub repository:
|
|
```lua
|
|
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
|
|
parser_config.fsharp = {
|
|
install_info = {
|
|
url = "https://github.com/Nsidorenco/tree-sitter-fsharp",
|
|
branch = "develop",
|
|
files = {"src/scanner.cc", "src/parser.c" },
|
|
generate_requires_npm = true,
|
|
requires_generate_from_grammar = true
|
|
},
|
|
filetype = "fsharp",
|
|
}
|
|
```
|
|
|
|
Then run `:TSInstallFromGrammar fsharp` inside Nvim.
|
|
## Status
|
|
The grammar currently has support for most language features, but might have rough edges.
|
|
Some parts, like the type annotations are still very bare-bones.
|
|
|
|
The grammar supports indentation-based scoping but does not fully support offside indentation and opening new indentation levels on record/list construction.
|
|
|
|
The precedence rules for the different grammar nodes (and particularly expressions) are not set properly yet, which means that the parser size is much larger than needed.
|
|
|
|
### Missing
|
|
- [ ] Computational expressions
|
|
- [ ] Type annotations
|
|
- [x] Annotations
|
|
- [ ] Offside tokens inside indentation scope
|
|
- [ ] Testing
|
|
- [ ] Set properly precedence rules
|
|
|
|
## Testing
|
|
### Testing corpus
|
|
To run all tests stores in `corpus/` run
|
|
|
|
```sh
|
|
$ npm test
|
|
```
|
|
|
|
### Test parsing a specific file
|
|
```
|
|
$ npm run debug $file
|
|
```
|
|
|
|
## How to contribute
|
|
Clone the repo and start playing around with it.
|
|
If you find a code example which fails to parse, please reduce it to a minimal example, such that it can be added to the corpus as a test case.
|
|
|
|
PRs fleshing out the grammar or fixing bugs are very welcome!
|