diff --git a/build.rs b/build.rs index dc3321fa0..9dce0ab46 100644 --- a/build.rs +++ b/build.rs @@ -151,6 +151,11 @@ fn main() { src_dir: "vendored_parsers/tree-sitter-erlang-src", extra_files: vec![], }, + TreeSitterParser { + name: "tree-sitter-f-sharp", + src_dir: "vendored_parsers/tree-sitter-f-sharp-src", + extra_files: vec!["scanner.cc"], + }, TreeSitterParser { name: "tree-sitter-gleam", src_dir: "vendored_parsers/tree-sitter-gleam-src", diff --git a/src/parse/guess_language.rs b/src/parse/guess_language.rs index 262fe4973..1873b711e 100644 --- a/src/parse/guess_language.rs +++ b/src/parse/guess_language.rs @@ -34,6 +34,7 @@ pub(crate) enum Language { Elvish, EmacsLisp, Erlang, + FSharp, Gleam, Go, Hack, @@ -122,6 +123,7 @@ pub(crate) fn language_name(language: Language) -> &'static str { Elvish => "Elvish", EmacsLisp => "Emacs Lisp", Erlang => "Erlang", + FSharp => "F#", Gleam => "Gleam", Go => "Go", Hack => "Hack", @@ -253,6 +255,7 @@ pub(crate) fn language_globs(language: Language) -> Vec { "*.yrl", "Emakefile", ], + FSharp => &["*.fs", "*.fsx", "*.fsi"], Gleam => &["*.gleam"], Go => &["*.go"], Hack => &["*.hack", "*.hck", "*.hhi"], @@ -482,6 +485,7 @@ fn from_emacs_mode_header(src: &str) -> Option { "elm" => Some(Elm), "elvish" => Some(Elvish), "emacs-lisp" => Some(EmacsLisp), + "fsharp" => Some(FSharp), "gleam" => Some(Gleam), "go" => Some(Go), "haskell" => Some(Haskell), diff --git a/src/parse/tree_sitter_parser.rs b/src/parse/tree_sitter_parser.rs index 345f381b1..7a0af194d 100644 --- a/src/parse/tree_sitter_parser.rs +++ b/src/parse/tree_sitter_parser.rs @@ -76,6 +76,7 @@ extern "C" { fn tree_sitter_elm() -> ts::Language; fn tree_sitter_elvish() -> ts::Language; fn tree_sitter_erlang() -> ts::Language; + fn tree_sitter_fsharp() -> ts::Language; fn tree_sitter_gleam() -> ts::Language; fn tree_sitter_go() -> ts::Language; fn tree_sitter_hare() -> ts::Language; @@ -386,6 +387,23 @@ pub(crate) fn from_language(language: guess::Language) -> TreeSitterConfig { sub_languages: vec![], } } + FSharp => { + let language = unsafe { tree_sitter_fsharp() }; + TreeSitterConfig { + language, + atom_nodes: [ + "string", + "triple_quoted_string" + ].into(), + delimiter_tokens: vec![("(", ")"), ("[", "]"), ("{", "}")], + highlight_query: ts::Query::new( + language, + include_str!("../../vendored_parsers/highlights/f-sharp.scm"), + ) + .unwrap(), + sub_languages: vec![], + } + } Gleam => { let language = unsafe { tree_sitter_gleam() }; TreeSitterConfig { diff --git a/vendored_parsers/highlights/f-sharp.scm b/vendored_parsers/highlights/f-sharp.scm new file mode 120000 index 000000000..3650b6313 --- /dev/null +++ b/vendored_parsers/highlights/f-sharp.scm @@ -0,0 +1 @@ +../tree-sitter-f-sharp/queries/highlights.scm \ No newline at end of file diff --git a/vendored_parsers/tree-sitter-f-sharp-src b/vendored_parsers/tree-sitter-f-sharp-src new file mode 120000 index 000000000..1ec225e00 --- /dev/null +++ b/vendored_parsers/tree-sitter-f-sharp-src @@ -0,0 +1 @@ +tree-sitter-f-sharp/src \ No newline at end of file