Skip to main content

woolink/
lib.rs

1//! woolink 🔗 - Global Symbol Table for Woo Ecosystem
2//! 
3//! 跨包符号解析系统,提供:
4//! - SoA 布局:符号属性分块存储,CPU 缓存友好
5//! - 并发查询:RwLock<SymbolUniverse> 支持 1000+ AI Agent 线程
6//! - 惰性反序列化:rkyv 零拷贝,mmap 直接映射
7//! - O(1) 定义跳转:链式符号索引
8//! - Lock-free 符号链接
9//! 
10//! ## Quick Start
11//! 
12//! ```rust
13//! use woolink::{SymbolUniverse, Symbol, SymbolKind, SymbolId};
14//! 
15//! // Create universe
16//! let universe = SymbolUniverse::new(100_000);
17//! 
18//! // Concurrent reads (1000+ threads supported)
19//! let guard = universe.read();
20//! let symbol = guard.get_symbol(SymbolId::new(42));
21//! let (target, location) = guard.jump_to_definition(SymbolId::new(42)).unwrap();
22//! ```
23
24pub mod symbol;
25pub mod bridge;
26pub mod cli;
27
28// Re-export main types
29pub use symbol::{
30    SymbolUniverse,
31    SymbolUniverseGuard,
32    UniverseSnapshot,
33    SymbolStorage,
34    SoAStorage,
35    ChainedIndex,
36    SymbolChain,
37    DefinitionLocation,
38    SymbolLinker,
39    LinkResolver,
40    LockFreeLink,
41    MmapIndex,
42    MemoryMappedStorage,
43    Symbol,
44    Package,
45    Import,
46    SymbolKind,
47    Visibility,
48    SymbolId,
49    PackageId,
50    UniverseStats,
51    SymbolError,
52    Result,
53};
54
55pub mod prelude {
56    //! Common imports for woolink users
57    
58    pub use crate::symbol::{
59        SymbolUniverse,
60        SymbolId,
61        PackageId,
62        SymbolKind,
63        Visibility,
64        DefinitionLocation,
65    };
66}
67
68/// Version information
69pub const VERSION: &str = env!("CARGO_PKG_VERSION");
70
71/// Magic number for archive files
72pub const ARCHIVE_MAGIC: &[u8; 4] = b"WLSK";
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77    use symbol::{Symbol, SymbolKind, Visibility, UniverseBuilder, DefinitionLocation};
78
79    #[test]
80    fn test_end_to_end() {
81        // Build universe
82        let mut builder = UniverseBuilder::with_capacity(10, 2);
83        
84        // Add package
85        builder.add_package(symbol::Package {
86            id: 1,
87            path_offset: 0,
88            path_len: 10,
89            name_offset: 10,
90            name_len: 4,
91            version_offset: 0,
92            version_len: 0,
93            first_symbol: 1,
94            symbol_count: 2,
95            import_count: 0,
96        });
97        
98        // Add symbols
99        builder.add_symbol(
100            Symbol::new(1, 1, SymbolKind::Function, 0, 4),
101            DefinitionLocation::new(1, 100)
102        );
103        
104        builder.add_symbol(
105            Symbol::new(2, 1, SymbolKind::Type, 4, 3),
106            DefinitionLocation::new(1, 200)
107        );
108        
109        // Build universe
110        let universe = builder.build();
111        
112        // Query
113        let guard = universe.read();
114        let sym = guard.get_symbol(SymbolId::new(1));
115        assert!(sym.is_some());
116        assert_eq!(sym.unwrap().id, 1);
117    }
118}