Skip to main content

semantic/parser/
parser_language.rs

1// SPDX-License-Identifier: Apache-2.0
2//! Supported language definitions.
3
4/// Supported programming languages.
5#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq)]
6pub enum Language {
7    Rust,
8    Python,
9    JavaScript,
10    TypeScript,
11    Go,
12    C,
13    Cpp,
14    Java,
15    Zig,
16    Unknown,
17}
18
19impl Language {
20    /// Detect language from file extension.
21    pub fn from_path(path: &std::path::Path) -> Self {
22        match path.extension().and_then(|e| e.to_str()) {
23            Some("rs") => Language::Rust,
24            Some("py") | Some("pyi") => Language::Python,
25            Some("js") | Some("jsx") | Some("mjs") | Some("cjs") => Language::JavaScript,
26            Some("ts") | Some("tsx") => Language::TypeScript,
27            Some("go") => Language::Go,
28            Some("c") | Some("h") => Language::C,
29            Some("cpp") | Some("cc") | Some("hpp") | Some("cxx") => Language::Cpp,
30            Some("java") => Language::Java,
31            Some("zig") => Language::Zig,
32            _ => Language::Unknown,
33        }
34    }
35
36    /// Get the tree-sitter language parser. Public mirror of [`parser`]
37    /// for consumers outside the `semantic` crate (notably
38    /// [`crate::symbol_resolver`] and the `repo` re-export).
39    pub fn parser_handle(&self) -> Option<tree_sitter::Language> {
40        self.parser()
41    }
42
43    /// Get the tree-sitter language parser.
44    pub(crate) fn parser(&self) -> Option<tree_sitter::Language> {
45        match self {
46            #[cfg(feature = "lang-rust")]
47            Language::Rust => Some(tree_sitter_rust::LANGUAGE.into()),
48            #[cfg(feature = "lang-python")]
49            Language::Python => Some(tree_sitter_python::LANGUAGE.into()),
50            #[cfg(feature = "lang-javascript")]
51            Language::JavaScript => Some(tree_sitter_javascript::LANGUAGE.into()),
52            #[cfg(feature = "lang-typescript")]
53            Language::TypeScript => Some(tree_sitter_typescript::LANGUAGE_TYPESCRIPT.into()),
54            #[cfg(feature = "lang-go")]
55            Language::Go => Some(tree_sitter_go::LANGUAGE.into()),
56            #[cfg(feature = "lang-c")]
57            Language::C => Some(tree_sitter_c::LANGUAGE.into()),
58            #[cfg(feature = "lang-cpp")]
59            Language::Cpp => Some(tree_sitter_cpp::LANGUAGE.into()),
60            #[cfg(feature = "lang-java")]
61            Language::Java => Some(tree_sitter_java::LANGUAGE.into()),
62            #[cfg(feature = "lang-zig")]
63            Language::Zig => Some(tree_sitter_zig::LANGUAGE.into()),
64            _ => None,
65        }
66    }
67}