gitcortex_indexer/parser/
mod.rs1use std::path::Path;
2
3use gitcortex_core::{
4 error::Result,
5 graph::{Edge, Node, NodeId},
6};
7
8mod complexity;
9mod deftext;
10pub mod go;
11pub mod java;
12pub mod python;
13pub mod rust;
14pub mod typescript;
15
16pub(crate) use complexity::cyclomatic_complexity;
17
18pub(crate) use deftext::capture as capture_definition;
19
20pub struct ParseResult {
22 pub nodes: Vec<Node>,
23 pub edges: Vec<Edge>,
24 pub deferred_calls: Vec<(NodeId, String, u32)>,
26 pub deferred_uses: Vec<(NodeId, String)>,
28 pub deferred_implements: Vec<(NodeId, String)>,
30 pub deferred_inherits: Vec<(NodeId, String)>,
32 pub deferred_throws: Vec<(NodeId, String)>,
34 pub deferred_annotated: Vec<(NodeId, String)>,
36 pub deferred_imports: Vec<(NodeId, String)>,
38}
39
40pub trait LanguageParser: Send + Sync {
47 fn extensions(&self) -> &[&str];
49
50 fn parse(&self, path: &Path, source: &str) -> Result<ParseResult>;
53}
54
55pub fn parser_for_path(path: &Path) -> Option<Box<dyn LanguageParser>> {
58 let ext = path.extension()?.to_str()?;
59 match ext {
60 "rs" => Some(Box::new(rust::RustParser::new())),
61 "py" => Some(Box::new(python::PythonParser::new())),
62 "ts" => Some(Box::new(typescript::TypeScriptParser::new_ts())),
63 "tsx" => Some(Box::new(typescript::TypeScriptParser::new_tsx())),
64 "js" | "mjs" | "cjs" => Some(Box::new(typescript::JavaScriptParser::new())),
65 "jsx" => Some(Box::new(typescript::JavaScriptParser::new())),
66 "go" => Some(Box::new(go::GoParser::new())),
67 "java" => Some(Box::new(java::JavaParser::new())),
68 _ => None,
69 }
70}