Supporting a new language
This section is to help developers implement support for a new language in rust-code-analysis
.
To implement a new language, two steps are required:
- Generate the grammar
- Add the grammar to
rust-code-analysis
A number of metrics are supported and help to implement those are covered elsewhere in the documentation.
Generating the grammar
As a prerequisite for adding a new grammar, there needs to exist a tree-sitter version for the desired language that matches the version used in this project.
The grammars are generated by a project in this repository called enums. The following steps add the language support from the language crate and generate an enum file that is then used as the grammar in this project to evaluate metrics.
- Add the language specific
tree-sitter
crate to theenum
crate, making sure to tie it to thetree-sitter
version used in theruse-code-analysis
crate. For example, for the Rust support at time of writing the following line exists in the /enums/Cargo.toml:tree-sitter-rust = "version number"
. - Append the language to the
enum
crate in /enums/src/languages.rs. Keeping with Rust as the example, the line would be(Rust, tree_sitter_rust)
. The first parameter is the name of the Rust enum that will be generated, the second is thetree-sitter
function to call to get the language's grammar. - Add a case to the end of the match in
mk_get_language
macro rule in /enums/src/macros.rs eg. for RustLang::Rust => tree_sitter_rust::language()
. - Lastly, we execute the /recreate-grammars.sh script that runs the
enums
crate to generate the grammar for the new language.
At this point we should have a new grammar file for the new language in /src/languages/. See /src/languages/language_rust.rs as an example of the generated enum.
Adding the new grammar to rust-code-analysis
- Add the language specific
tree-sitter
crate to therust-code-analysis
project, making sure to tie it to thetree-sitter
version used in this project. For example, for the Rust support at time of writing the following line exists in the Cargo.toml:tree-sitter-rust = "0.19.0"
. - Next we add the new
tree-sitter
language namespace to /src/languages/mod.rs eg.
# #![allow(unused_variables)] #fn main() { pub mod language_rust; pub use language_rust::*; #}
- Lastly, we add a definition of the language to the arguments of
mk_langs!
macro in /src/langs.rs.
# #![allow(unused_variables)] #fn main() { // 1) Name for enum // 2) Language description // 3) Display name // 4) Empty struct name to implement // 5) Parser name // 6) tree-sitter function to call to get a Language // 7) file extensions // 8) emacs modes ( Rust, "The `Rust` language", "rust", RustCode, RustParser, tree_sitter_rust, [rs], ["rust"] ) #}