Skip to main content

garbage_code_hunter/language/
mod.rs

1pub mod adapter;
2
3use std::path::Path;
4
5/// Programming languages supported by the analyzer.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum Language {
8    Rust,
9    C,
10    Cpp,
11    Python,
12    JavaScript,
13    TypeScript,
14    Go,
15    Java,
16    Ruby,
17    Swift,
18    Zig,
19    Unknown,
20}
21
22impl Language {
23    pub fn from_extension(ext: &str) -> Self {
24        match ext {
25            "rs" => Language::Rust,
26            "c" | "h" => Language::C,
27            "cpp" | "cxx" | "cc" | "hpp" | "hh" | "hxx" | "C" | "CPP" => Language::Cpp,
28            "py" => Language::Python,
29            "js" | "mjs" | "cjs" => Language::JavaScript,
30            "ts" | "tsx" | "mts" | "cts" => Language::TypeScript,
31            "go" => Language::Go,
32            "java" => Language::Java,
33            "rb" => Language::Ruby,
34            "swift" => Language::Swift,
35            "zig" => Language::Zig,
36            _ => Language::Unknown,
37        }
38    }
39
40    pub fn from_path(path: &Path) -> Self {
41        path.extension()
42            .and_then(|e| e.to_str())
43            .map(Self::from_extension)
44            .unwrap_or(Language::Unknown)
45    }
46
47    pub fn extensions(&self) -> &'static [&'static str] {
48        match self {
49            Language::Rust => &["rs"],
50            Language::C => &["c", "h"],
51            Language::Cpp => &["cpp", "cxx", "cc", "hpp", "hh", "hxx", "C", "CPP"],
52            Language::Python => &["py"],
53            Language::JavaScript => &["js", "mjs", "cjs"],
54            Language::TypeScript => &["ts", "tsx", "mts", "cts"],
55            Language::Go => &["go"],
56            Language::Java => &["java"],
57            Language::Ruby => &["rb"],
58            Language::Swift => &["swift"],
59            Language::Zig => &["zig"],
60            Language::Unknown => &[],
61        }
62    }
63
64    pub fn display_name(&self) -> &'static str {
65        match self {
66            Language::Rust => "Rust",
67            Language::C => "C",
68            Language::Cpp => "C++",
69            Language::Python => "Python",
70            Language::JavaScript => "JavaScript",
71            Language::TypeScript => "TypeScript",
72            Language::Go => "Go",
73            Language::Java => "Java",
74            Language::Ruby => "Ruby",
75            Language::Swift => "Swift",
76            Language::Zig => "Zig",
77            Language::Unknown => "Unknown",
78        }
79    }
80
81    pub fn line_comment(&self) -> &'static str {
82        match self {
83            Language::Rust
84            | Language::C
85            | Language::Cpp
86            | Language::Go
87            | Language::Java
88            | Language::JavaScript
89            | Language::TypeScript
90            | Language::Ruby
91            | Language::Swift
92            | Language::Zig => "//",
93            Language::Python => "#",
94            Language::Unknown => "//",
95        }
96    }
97
98    pub fn has_tree_sitter_grammar(&self) -> bool {
99        matches!(
100            self,
101            Language::Rust
102                | Language::C
103                | Language::Cpp
104                | Language::Python
105                | Language::JavaScript
106                | Language::TypeScript
107                | Language::Go
108                | Language::Java
109                | Language::Ruby
110                | Language::Swift
111                | Language::Zig
112        )
113    }
114}
115
116/// All languages with a compiled tree-sitter grammar available.
117pub const LANGUAGES_WITH_GRAMMAR: &[Language] = &[
118    Language::Rust,
119    Language::Python,
120    Language::JavaScript,
121    Language::TypeScript,
122    Language::Go,
123    Language::Java,
124    Language::Ruby,
125    Language::Swift,
126    Language::Zig,
127    Language::C,
128    Language::Cpp,
129];
130
131/// All supported source file extensions for discovery.
132pub const SUPPORTED_EXTENSIONS: &[&str] = &[
133    "rs", "c", "h", "cpp", "cxx", "cc", "hpp", "hh", "hxx", "C", "CPP", "py", "js", "mjs", "cjs",
134    "ts", "tsx", "mts", "cts", "go", "java", "rb", "swift", "zig",
135];
136
137#[cfg(test)]
138mod tests {
139    use super::*;
140
141    #[test]
142    fn test_from_extension_rust() {
143        assert_eq!(Language::from_extension("rs"), Language::Rust);
144    }
145
146    #[test]
147    fn test_from_extension_python() {
148        assert_eq!(Language::from_extension("py"), Language::Python);
149    }
150
151    #[test]
152    fn test_from_extension_unknown() {
153        assert_eq!(Language::from_extension("xyz"), Language::Unknown);
154    }
155
156    #[test]
157    fn test_extensions_rust() {
158        assert!(Language::Rust.extensions().contains(&"rs"));
159    }
160
161    #[test]
162    fn test_display_names() {
163        assert_eq!(Language::Rust.display_name(), "Rust");
164        assert_eq!(Language::Python.display_name(), "Python");
165        assert_eq!(Language::Unknown.display_name(), "Unknown");
166    }
167
168    #[test]
169    fn test_line_comments() {
170        assert_eq!(Language::Rust.line_comment(), "//");
171        assert_eq!(Language::Python.line_comment(), "#");
172    }
173
174    #[test]
175    fn test_tree_sitter_grammar_available() {
176        assert!(Language::Rust.has_tree_sitter_grammar());
177        assert!(Language::Python.has_tree_sitter_grammar());
178        assert!(!Language::Unknown.has_tree_sitter_grammar());
179    }
180}