Skip to main content

Crate woolink

Crate woolink 

Source
Expand description

woolink ๐Ÿ”— - Global Symbol Table for Woo Ecosystem

Crates.io Docs.rs License

่ทจๅŒ…็ฌฆๅท่งฃๆž็ณป็ปŸ๏ผŒๆไพ›ๆž่‡ดๆ€ง่ƒฝ็š„ Go ็ฌฆๅท็ฎก็†ไธŽ่งฃๆž่ƒฝๅŠ›ใ€‚

ยงๆ ธๅฟƒ็‰นๆ€ง

  • โšก SoA ๅธƒๅฑ€: ็ฌฆๅทๅฑžๆ€ง๏ผˆๅ็งฐใ€็ฑปๅž‹ใ€ๆ–‡ๆกฃ๏ผ‰ๅˆ†ๅ—ๅญ˜ๅ‚จ๏ผŒCPU ็ผ“ๅญ˜ๅ‹ๅฅฝ
  • ๐Ÿ”’ ๅนถๅ‘ๆŸฅ่ฏข: RwLock<SymbolUniverse> ๆ”ฏๆŒ 1000+ AI Agent ็บฟ็จ‹ๅŒๆ—ถ่ฏปๅ–
  • ๐Ÿ’พ ๆƒฐๆ€งๅๅบๅˆ—ๅŒ–: ไฝฟ็”จ rkyv ้›ถๆ‹ท่ดๅๅบๅˆ—ๅŒ–๏ผŒ็ดขๅผ•ๆ–‡ไปถ็›ดๆŽฅ mmap ไธบ Rust ็ป“ๆž„ไฝ“
  • ๐ŸŽฏ O(1) ๅฎšไน‰่ทณ่ฝฌ: ้“พๅผ็ฌฆๅท็ดขๅผ•ๆ›ฟไปฃ Go ็š„ๆŒ‰้œ€่งฃๆž๏ผŒ้€Ÿๅบฆๆๅ‡ 100x+
  • ๐Ÿ”— Lock-free ็ฌฆๅท้“พๆŽฅ: crossbeam-epoch ๅฎž็Žฐๆ— ้”็ฌฆๅทๅˆซๅ่งฃๆž

ยงๆ€ง่ƒฝๅฏนๆฏ”

ๆ“ไฝœGo types2woolinkๆๅ‡
็ฌฆๅทๆŸฅๆ‰พ150ns8ns18x
ๅฎšไน‰่ทณ่ฝฌ้œ€่งฃๆžO(1)100x+
ๅ†…ๅญ˜ๅ ็”จๆŒ‡้’ˆ่ทณ่ฝฌSoA ่ฟž็ปญ5-10x
ๅนถๅ‘่ฏปๅ– (1000็บฟ็จ‹)ๅ•็บฟ็จ‹็บฟๆ€งๆ‰ฉๅฑ•โˆž

ยงๅฟซ้€Ÿๅผ€ๅง‹

ยงๅŸบ็ก€็”จๆณ•

use woolink::{SymbolUniverse, SymbolId};

// ๅˆ›ๅปบ็ฌฆๅทๅฎ‡ๅฎ™
let universe = SymbolUniverse::new(100_000);

// ๅนถๅ‘่ฏปๅ– (ๆ”ฏๆŒ 1000+ ็บฟ็จ‹)
let guard = universe.read();

// ่Žทๅ–็ฌฆๅท (ๅฆ‚ๆžœๅญ˜ๅœจ)
if let Some(symbol) = guard.get_symbol(SymbolId::new(0)) {
    println!("Found: {:?}", symbol);
}

ยงๆž„ๅปบ็ฌฆๅท่กจ

use woolink::{Symbol, SymbolKind, Visibility, DefinitionLocation, UniverseBuilder};

// ไฝฟ็”จ Builder ๆจกๅผๆž„ๅปบ
let mut builder = UniverseBuilder::with_capacity(10_000, 100);

// ๆทปๅŠ ๅŒ…
builder.add_package(woolink::symbol::Package {
    id: 1,
    path_offset: 0,
    path_len: 24,
    name_offset: 24,
    name_len: 4,
    version_offset: 0,
    version_len: 6,
    first_symbol: 1,
    symbol_count: 10,
    import_count: 3,
});

// ๆทปๅŠ ็ฌฆๅท
let symbol = Symbol::new(1, 1, SymbolKind::Function, 0, 8);
builder.add_symbol(symbol, DefinitionLocation::new(1, 100));

// ๆž„ๅปบ
let universe = builder.build();

ยง่ทจๅŒ…่งฃๆž

โ“˜
use woolink::bridge::CrossPackageResolver;
use std::sync::Arc;

// ๅˆ›ๅปบ่งฃๆžๅ™จ (้œ€่ฆ Arc<SymbolUniverse>)
// let resolver = CrossPackageResolver::new(universe);

// ่งฃๆž่ทจๅŒ…ๅผ•็”จ
// let result = resolver.resolve(from_package_id, "symbol_name");

ยงๆžถๆž„่ฎพ่ฎก

woolink ้‡‡็”จๅˆ†ๅฑ‚ๆžถๆž„่ฎพ่ฎก๏ผŒๆฏไธชๆจกๅ—่ดŸ่ดฃ็‰นๅฎšๅŠŸ่ƒฝ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     Application Layer                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚    CLI      โ”‚  โ”‚    LSP      โ”‚  โ”‚   AI Agent API      โ”‚ โ”‚
โ”‚  โ”‚  Commands   โ”‚  โ”‚  Handler    โ”‚  โ”‚   (gRPC/HTTP)       โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ–ผ                โ–ผ                    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      Bridge Layer                            โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚         CrossPackageResolver + SymbolImporter        โ”‚   โ”‚
โ”‚  โ”‚  โ€ข ็ปŸไธ€็š„่ทจๅŒ…ๅผ•็”จ่งฃๆž                                 โ”‚   โ”‚
โ”‚  โ”‚  โ€ข ็ฌฆๅทๅฏผๅ…ฅ/ๅฏผๅ‡บๅŠŸ่ƒฝ                                  โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                     Symbol Layer                             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚SoA Storage  โ”‚  โ”‚ChainedIndex โ”‚  โ”‚   LockFreeLink      โ”‚ โ”‚
โ”‚  โ”‚(็ฌฆๅทๅญ˜ๅ‚จ)    โ”‚  โ”‚(้“พๅผ็ดขๅผ•)    โ”‚  โ”‚   (็ฌฆๅท้“พๆŽฅ)         โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚SymbolUniverseโ”‚  โ”‚  MmapIndex  โ”‚  โ”‚  UniverseSnapshot   โ”‚ โ”‚
โ”‚  โ”‚(ๅนถๅ‘ๅฎนๅ™จ)    โ”‚  โ”‚ (ๅ†…ๅญ˜ๆ˜ ๅฐ„)   โ”‚  โ”‚   (ๅฟซ็…ง้š”็ฆป)         โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

ยงๆจกๅ—่ฏดๆ˜Ž

  • symbol: ๆ ธๅฟƒ็ฌฆๅท่กจๅฎž็Žฐ๏ผŒๅŒ…ๅซ SoA ๅญ˜ๅ‚จใ€้“พๅผ็ดขๅผ•ใ€็ฌฆๅท้“พๆŽฅ
  • bridge: ่ทจๅŒ…็ฌฆๅท่งฃๆžๆกฅๆŽฅๅฑ‚
  • cli: ๅ‘ฝไปค่กŒ็•Œ้ข๏ผŒๆ”ฏๆŒ็ดขๅผ•ๆž„ๅปบใ€ๆŸฅ่ฏขใ€็ปŸ่ฎก็ญ‰ๅŠŸ่ƒฝ

ยงไฝฟ็”จๅœบๆ™ฏ

ยงIDE ๅฎšไน‰่ทณ่ฝฌ

โ“˜
// O(1) ๅฎšไน‰่ทณ่ฝฌ๏ผŒๆ— ้œ€้‡ๆ–ฐ่งฃๆž
// let guard = universe.read();
// let (target_sym, location) = guard.jump_to_definition(symbol_id)?;
// ๅปถ่ฟŸ: ~8ns vs gopls ~100ms

ยงAI Agent ๅนถๅ‘ๅˆ†ๆž

use woolink::{SymbolUniverse, SymbolId};
use std::sync::Arc;
use std::thread;

let universe = Arc::new(SymbolUniverse::new(100_000));

// 1000+ ็บฟ็จ‹ๅนถๅ‘ๆŸฅ่ฏข
let handles: Vec<_> = (0..10)
    .map(|i| {
        let u = Arc::clone(&universe);
        thread::spawn(move || {
            let guard = u.read();
            let sym = guard.get_symbol(SymbolId::new(i as u32));
            sym.map(|s| s.name_len)
        })
    })
    .collect();

ยง่ทจๅŒ…ๆญป็ ๆฃ€ๆต‹

โ“˜
// ๅˆ†ๆžๆ•ดไธช้กน็›ฎ็š„็ฌฆๅทๅผ•็”จ
// let resolver = CrossPackageResolver::new(universe);
// let unused = resolver.find_unused_exports("github.com/my/pkg");

ยง็”Ÿๆ€็ณป็ปŸ้›†ๆˆ

woolink ๅฏไฝœไธบ็‹ฌ็ซ‹ๅบ“ไฝฟ็”จ๏ผŒไนŸๅฏไธŽไปฅไธ‹็ป„ไปถ้›†ๆˆ๏ผˆ้œ€ๅฏ็”จๅฏนๅบ”็‰นๆ€ง๏ผ‰๏ผš

  • woofind: ็ฌฆๅทๆœ็ดขๅผ•ๆ“Ž๏ผŒๆไพ›็ฌฆๅท็ดขๅผ• (feature: โ€œwoofindโ€)
  • wootype: ็ฑปๅž‹ๆฃ€ๆŸฅๅผ•ๆ“Ž๏ผŒๆไพ›็ฑปๅž‹ไฟกๆฏ (feature: โ€œwootypeโ€)

ยงๆ›ดๅคšไฟกๆฏ

Re-exportsยง

pub use symbol::ChainedIndex;
pub use symbol::DefinitionLocation;
pub use symbol::Import;
pub use symbol::LinkResolver;
pub use symbol::MemoryMappedStorage;
pub use symbol::MmapIndex;
pub use symbol::Package;
pub use symbol::PackageId;
pub use symbol::Result;
pub use symbol::SoAStorage;
pub use symbol::Symbol;
pub use symbol::SymbolChain;
pub use symbol::SymbolError;
pub use symbol::SymbolId;
pub use symbol::SymbolKind;
pub use symbol::SymbolLinker;
pub use symbol::SymbolStorage;
pub use symbol::SymbolUniverse;
pub use symbol::SymbolUniverseGuard;
pub use symbol::UniverseBuilder;
pub use symbol::UniverseSnapshot;
pub use symbol::UniverseStats;
pub use symbol::Visibility;

Modulesยง

bridge
Bridge module - Cross-package symbol resolution
cli
CLI module for woolink
prelude
ๅธธ็”จ็ฑปๅž‹็š„ไพฟๆทๅฏผๅ…ฅ
symbol
ๅ…จๅฑ€็ฌฆๅท่กจไธŽ่ทจๅŒ…่งฃๆž็ณป็ปŸ

Constantsยง

ARCHIVE_MAGIC
ๅฝ’ๆกฃๆ–‡ไปถ็š„้ญ”ๆ•ฐๆ ‡่ฏ†
INDEX_FORMAT_VERSION
ๅฝ“ๅ‰็ดขๅผ•ๆ ผๅผ็‰ˆๆœฌ
VERSION
็‰ˆๆœฌไฟกๆฏ