semtree-parse 0.2.1

Tree-sitter parsing and chunk extraction for semtree
Documentation
use semtree_core::{ChunkKind, Language};
use tree_sitter::Node;

use super::shared::{make_chunk, walk};
use crate::extractor::Extractor;
use crate::parser::ParsedTree;
use semtree_core::Chunk;

pub struct RustExtractor;

impl Extractor for RustExtractor {
    fn extract(&self, tree: &ParsedTree) -> Vec<Chunk> {
        let mut chunks = Vec::new();
        walk(&tree.root(), tree, &mut chunks, &visit);
        chunks
    }
}

fn visit(node: &Node<'_>, tree: &ParsedTree) -> Option<Chunk> {
    let kind = match node.kind() {
        "function_item" => ChunkKind::Function,
        "struct_item" => ChunkKind::Struct,
        "enum_item" => ChunkKind::Enum,
        "trait_item" => ChunkKind::Trait,
        "impl_item" => ChunkKind::Impl,
        "mod_item" => ChunkKind::Module,
        _ => return None,
    };
    let name = node
        .child_by_field_name("name")
        .map(|n| tree.node_text(&n).to_string());
    Some(make_chunk(node, tree, Language::Rust, kind, name))
}