cstree 0.14.0

Library for generic lossless syntax trees
Documentation
#![cfg(feature = "salsa_2022_compat")]

use cstree::{build::GreenNodeBuilder, impl_cstree_interning_for_salsa};

#[salsa::jar(db = Db)]
pub struct Jar(crate::SourceId);

pub trait Db: salsa::DbWithJar<Jar> {}
impl<DB> Db for DB where DB: ?Sized + salsa::DbWithJar<Jar> {}

#[salsa::interned]
pub struct SourceId {
    #[return_ref]
    pub text: String,
}

#[derive(Default)]
#[salsa::db(crate::Jar)]
struct Database {
    storage: salsa::Storage<Self>,
}

impl salsa::Database for Database {}

impl_cstree_interning_for_salsa!(impl Interning for Database => text as SourceId);

use cstree::{syntax::SyntaxNode, testing::*};

fn main() {
    let db = Database::default();
    let interned = SourceId::new(&db, "foo".to_string());
    let original = interned.text(&db);
    assert_eq!(original, "foo");

    let interner = db.as_interner();
    let mut shared_interner = &interner;
    let mut builder: GreenNodeBuilder<MySyntax, _> = GreenNodeBuilder::with_interner(&mut shared_interner);
    let (tree, _no_interner_because_it_was_borrowed) = {
        builder.start_node(TestSyntaxKind::Plus);
        builder.token(TestSyntaxKind::Float, "2.05");
        builder.token(TestSyntaxKind::Whitespace, " ");
        builder.token(TestSyntaxKind::Plus, "+");
        builder.token(TestSyntaxKind::Whitespace, " ");
        builder.token(TestSyntaxKind::Float, "7.32");
        builder.finish_node();
        builder.finish()
    };
    let tree: SyntaxNode<MySyntax> = SyntaxNode::new_root(tree);
    assert_eq!(tree.resolve_text(shared_interner), "2.05 + 7.32");
}