Add language support for Ada

Implement support in difftastic for the Ada programming language
using the treesitter grammar provided in 'briot/tree-sitter-ada'.

Language detection depends on the following suffixes:

    * adb
    * ads
    * ada

The presence of the alire TOML file (alire.toml) is also used as
a heuristic.
pull/494/head
Karl Ding 2023-03-12 01:53:06 +07:00
parent 9222b92e1e
commit 5271f65f92
4 changed files with 31 additions and 0 deletions

@ -90,6 +90,11 @@ impl TreeSitterParser {
fn main() {
let parsers = vec![
TreeSitterParser {
name: "tree-sitter-ada",
src_dir: "vendored_parsers/tree-sitter-ada-src",
extra_files: vec![],
},
TreeSitterParser {
name: "tree-sitter-bash",
src_dir: "vendored_parsers/tree-sitter-bash-src",

@ -8,6 +8,7 @@ with `difft --list-languages`.
| Language | Parser Used |
|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|
| Ada | [tree-sitter/tree-sitter-ada](https://github.com/briot/tree-sitter-ada) |
| Bash | [tree-sitter/tree-sitter-bash](https://github.com/tree-sitter/tree-sitter-bash) |
| C | [tree-sitter/tree-sitter-c](https://github.com/tree-sitter/tree-sitter-c) |
| C++ | [tree-sitter/tree-sitter-cpp](https://github.com/tree-sitter/tree-sitter-cpp) |

@ -18,6 +18,7 @@ use std::{borrow::Borrow, ffi::OsStr, path::Path};
/// corresponding tree-sitter parser.
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Language {
Ada,
Bash,
C,
Clojure,
@ -74,6 +75,7 @@ pub enum Language {
/// The language name shown to the user.
pub fn language_name(language: Language) -> &'static str {
match language {
Ada => "Ada",
Bash => "Bash",
C => "C",
Clojure => "Clojure",
@ -132,6 +134,12 @@ use Language::*;
/// Which file extensions are associated with which languages.
pub const LANG_EXTENSIONS: &[(Language, &[&str])] = &[
(
Ada,
&[
"ada", "adb", "ads"
],
),
(
Bash,
&[
@ -224,6 +232,7 @@ pub const LANG_EXTENSIONS: &[(Language, &[&str])] = &[
/// Which file names are associated with which languages.
pub const LANG_FILE_NAMES: &[(Language, &[&str])] = &[
(Ada, &["alire.toml"]),
(
Bash,
&[
@ -349,6 +358,7 @@ fn from_emacs_mode_header(src: &str) -> Option<Language> {
_ => "".into(),
};
let lang = match mode_name.to_ascii_lowercase().trim().borrow() {
"ada" => Some(Ada),
"c" => Some(C),
"clojure" => Some(Clojure),
"csharp" => Some(CSharp),

@ -63,6 +63,7 @@ pub struct TreeSitterConfig {
}
extern "C" {
fn tree_sitter_ada() -> ts::Language;
fn tree_sitter_bash() -> ts::Language;
fn tree_sitter_c() -> ts::Language;
fn tree_sitter_c_sharp() -> ts::Language;
@ -128,6 +129,20 @@ const OCAML_ATOM_NODES: [&str; 6] = [
pub fn from_language(language: guess::Language) -> TreeSitterConfig {
use guess::Language::*;
match language {
Ada => {
let language = unsafe { tree_sitter_ada() };
TreeSitterConfig {
language,
atom_nodes: vec!["string_literal", "character_literal"].into_iter().collect(),
delimiter_tokens: vec![("(", ")"), ("[", "]")],
highlight_query: ts::Query::new(
language,
include_str!("../../vendored_parsers/highlights/ada.scm"),
)
.unwrap(),
sub_languages: vec![],
}
}
Bash => {
let language = unsafe { tree_sitter_bash() };
TreeSitterConfig {