Skip to main content

cure_tree/
lib.rs

1//! # cure-tree
2//!
3//! 通用 arena 树工具包:为 [`cure_engine::Lang`] 的实现语言提供每个语言
4//! 都要重复构建的基础设施。一个新语言前端 = 本工具包 + 语言自己的
5//! NodeData / parser / printer / 规则包。
6//!
7//! 约定(工具包假设的语言形态):
8//! - 节点 = 稠密 arena 下标(`Lang::node_index` 与 `Lang::id_of_index`
9//!   互逆;`Id: Copy`)
10//! - 名字键 = `u32` intern id(`NameTable`:`名字 ↔ u32` 只增表 +
11//!   每节点名字键表)
12//! - children 布局遵循 [`cure_engine::kind::NodeKind`] 的文档
13//!   (Assign = `[target, value]` 等——区域事件收集器按此遍历)
14//!
15//! 模块:
16//! - [`ChildList`]:≤3 孩子内联零堆分配的容器(AST 扇出绝大多数 ≤3)
17//! - [`NameTable`]:单元级名字 intern 表 + 节点名字键(增量扩展)
18//! - [`EventStore`] + [`stmt_roots`] + [`collect_region_events`]:
19//!   区域事件索引(B3 惰性重建:只重建被失效的空条目)与**泛型**事件
20//!   收集器(只依赖 Lang 钩子:`is_opaque` / `var_key` / `kind` /
21//!   `children` / `un_op`——与引擎 `scan_region` 递归严格同序)
22//! - [`rebuild_effects`]:聚合效果表的不动点重建
23//!   (children-先于-parent 索引序 + 注入节点违例的多轮收敛)
24//!
25//! 集成模式(语言侧 `Lang::prepare` / `invalidate_effect` 的标准骨架):
26//!
27//! ```ignore
28//! fn prepare(&mut self, root: JavaId) {
29//!     // 1) 新节点名字键增量扩展(名字先收集,借用安全)
30//!     let names = /* base..count 收集 var_name */;
31//!     self.names.extend_owned(base, &names);
32//!     // 2) 区域事件索引:B3 只重建空条目
33//!     self.events.resize(self.nodes.len());
34//!     if !self.events.is_clean() {
35//!         self.events.mark_clean();
36//!         for sr in cure_tree::stmt_roots(self, root) {
37//!             if self.events.slot(sr).is_empty() {
38//!                 let ev = cure_tree::collect_region_events(self, sr);
39//!                 self.events.put(self.node_index(sr), ev);
40//!             }
41//!         }
42//!     }
43//!     // 3) 效果表
44//!     self.effect_cache = cure_tree::rebuild_effects(self, self.nodes.len());
45//!     // 4) 语言专属(作用域类型解析等)
46//! }
47//!
48//! fn invalidate_effect(&mut self, id: JavaId) {
49//!     self.events.invalidate(self.node_index(id));
50//!     // + 语言自己的缓存失效
51//! }
52//! ```
53//!
54//! 零外部依赖(仅 cure-engine)。
55
56mod child;
57mod effect;
58mod events;
59mod name;
60
61pub use child::ChildList;
62pub use effect::rebuild_effects;
63pub use events::{collect_region_events, stmt_roots, EventStore};
64pub use name::{NameTable, KEY_NONE};