use crate::error::{Result, SpliceError};
use crate::symbol::Language;
use std::path::Path;
pub mod cpp;
pub mod java;
pub mod javascript;
pub mod python;
pub mod rust;
pub mod typescript;
pub trait ImportExtractor {
fn language() -> tree_sitter::Language;
fn language_enum() -> Language;
fn extract_from_node(node: tree_sitter::Node, source: &[u8], imports: &mut Vec<ImportFact>);
fn extract(path: &Path, source: &[u8]) -> Result<Vec<ImportFact>> {
let mut parser = tree_sitter::Parser::new();
parser
.set_language(&Self::language())
.map_err(|e| SpliceError::Parse {
file: path.to_path_buf(),
message: format!("Failed to set language: {:?}", e),
})?;
let tree = parser
.parse(source, None)
.ok_or_else(|| SpliceError::Parse {
file: path.to_path_buf(),
message: "Parse failed - no tree returned".to_string(),
})?;
let mut imports = Vec::new();
Self::extract_from_node(tree.root_node(), source, &mut imports);
Ok(imports)
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct ImportFact {
pub file_path: std::path::PathBuf,
pub import_kind: ImportKind,
pub path: Vec<String>,
pub imported_names: Vec<String>,
pub is_glob: bool,
pub is_reexport: bool,
pub byte_span: (usize, usize),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ImportKind {
UseCrate,
UseSuper,
UseSelf,
ExternCrate,
PlainUse,
PythonImport,
PythonFrom,
PythonFromRelative,
PythonFromParent,
PythonFromAncestor,
CppSystemInclude,
CppLocalInclude,
JsImport,
JsDefaultImport,
JsNamespaceImport,
JsSideEffectImport,
JsRequire,
JavaImport,
JavaStaticImport,
TsTypeImport,
TsTypeDefaultImport,
}
impl ImportKind {
pub fn as_str(&self) -> &'static str {
match self {
ImportKind::UseCrate => "UseCrate",
ImportKind::UseSuper => "UseSuper",
ImportKind::UseSelf => "UseSelf",
ImportKind::ExternCrate => "ExternCrate",
ImportKind::PlainUse => "PlainUse",
ImportKind::PythonImport => "PythonImport",
ImportKind::PythonFrom => "PythonFrom",
ImportKind::PythonFromRelative => "PythonFromRelative",
ImportKind::PythonFromParent => "PythonFromParent",
ImportKind::PythonFromAncestor => "PythonFromAncestor",
ImportKind::CppSystemInclude => "CppSystemInclude",
ImportKind::CppLocalInclude => "CppLocalInclude",
ImportKind::JsImport => "JsImport",
ImportKind::JsDefaultImport => "JsDefaultImport",
ImportKind::JsNamespaceImport => "JsNamespaceImport",
ImportKind::JsSideEffectImport => "JsSideEffectImport",
ImportKind::JsRequire => "JsRequire",
ImportKind::JavaImport => "JavaImport",
ImportKind::JavaStaticImport => "JavaStaticImport",
ImportKind::TsTypeImport => "TsTypeImport",
ImportKind::TsTypeDefaultImport => "TsTypeDefaultImport",
}
}
}
pub use cpp::extract_cpp_imports;
pub use java::extract_java_imports;
pub use javascript::extract_javascript_imports;
pub use python::extract_python_imports;
pub use rust::extract_rust_imports;
pub use typescript::extract_typescript_imports;