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 markdown;
13pub mod python;
14pub mod rust;
15pub mod typescript;
16
17pub(crate) use complexity::cyclomatic_complexity;
18
19pub(crate) use deftext::capture as capture_definition;
20
21pub struct ParseResult {
23 pub nodes: Vec<Node>,
24 pub edges: Vec<Edge>,
25 pub deferred_calls: Vec<(NodeId, String, u32)>,
27 pub deferred_uses: Vec<(NodeId, String)>,
29 pub deferred_implements: Vec<(NodeId, String)>,
31 pub deferred_inherits: Vec<(NodeId, String)>,
33 pub deferred_throws: Vec<(NodeId, String)>,
35 pub deferred_annotated: Vec<(NodeId, String)>,
37 pub deferred_imports: Vec<(NodeId, String)>,
39 pub deferred_doc_refs: Vec<(NodeId, String)>,
42}
43
44pub trait LanguageParser: Send + Sync {
51 fn extensions(&self) -> &[&str];
53
54 fn parse(&self, path: &Path, source: &str) -> Result<ParseResult>;
57}
58
59pub fn parser_for_path(path: &Path) -> Option<Box<dyn LanguageParser>> {
62 let ext = path.extension()?.to_str()?;
63 match ext {
64 "rs" => Some(Box::new(rust::RustParser::new())),
65 "py" => Some(Box::new(python::PythonParser::new())),
66 "ts" => Some(Box::new(typescript::TypeScriptParser::new_ts())),
67 "tsx" => Some(Box::new(typescript::TypeScriptParser::new_tsx())),
68 "js" | "mjs" | "cjs" => Some(Box::new(typescript::JavaScriptParser::new())),
69 "jsx" => Some(Box::new(typescript::JavaScriptParser::new())),
70 "go" => Some(Box::new(go::GoParser::new())),
71 "java" => Some(Box::new(java::JavaParser::new())),
72 "md" | "markdown" => Some(Box::new(markdown::MarkdownParser::new())),
73 _ => None,
74 }
75}