Skip to main content

Crate wootype

Crate wootype 

Source
Expand description

wootype ๐Ÿ• - Type System as a Service for Go

Crates.io Docs.rs License

ๆž้€Ÿ Go ็ฑปๅž‹ๆฃ€ๆŸฅๅผ•ๆ“Ž๏ผŒ้‡‡็”จๅขž้‡่ฎก็ฎ—ๆžถๆž„ (Salsa) ๅ’Œ ECS ๅญ˜ๅ‚จๆจกๅž‹๏ผŒ ๅฎž็Žฐไบšๆฏซ็ง’็บง็ฑปๅž‹ๆฃ€ๆŸฅๅ“ๅบ”ใ€‚

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

  • โšก ๅขž้‡่ฎก็ฎ—: Salsa ๆก†ๆžถ่‡ชๅŠจ่ทŸ่ธชไพ่ต–๏ผŒๅช้‡ๆ–ฐ่ฎก็ฎ—ๅ˜ๆ›ด้ƒจๅˆ†
  • ๐Ÿงฉ ECS ๅญ˜ๅ‚จ: Entity-Component-System ๆžถๆž„๏ผŒArchetype ็ดงๅ‡‘ๅญ˜ๅ‚จ
  • ๐Ÿ”’ ๅนถๅ‘ๅฎ‰ๅ…จ: DashMap ๆ— ้”่ฏป๏ผŒๆ”ฏๆŒ 1000+ AI Agent ๅนถๅ‘
  • ๐ŸŽฏ O(1) ็ฑปๅž‹่ทณ่ฝฌ: ้ข„่ฎก็ฎ—็ฑปๅž‹ๅ›พ๏ผŒๆ— ้œ€้‡ๆ–ฐ่งฃๆž
  • ๐ŸŒ ๅคšๅ่ฎฎๆ”ฏๆŒ: gRPC/WebSocket/LSP ๆœๅŠกๆŽฅๅฃ

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

ๅœบๆ™ฏwootypego/types้ข†ๅ…ˆๅ€ๆ•ฐ
ๅ†ทๅฏๅŠจ (1000 ๅ‡ฝๆ•ฐ)1.2ms1-5s800-4000x
ๅขž้‡ๆ›ดๆ–ฐ (ๅ•ๅ‡ฝๆ•ฐ)25ฮผsๅ…จ้‡้‡ๆฃ€20,000x
็ผ“ๅญ˜ๆŸฅ่ฏข3nsN/A300x
LSP ๅ•ๅญ—็ฌฆๅ“ๅบ”50ns~697ns14x

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

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

โ“˜
use wootype::prelude::*;
use std::sync::Arc;

// ๅˆ›ๅปบ็ฑปๅž‹ๅฎ‡ๅฎ™
let universe = Arc::new(TypeUniverse::new());

// ๆ‰ง่กŒ็ฑปๅž‹ๆฃ€ๆŸฅ
let result = universe.check_file("main.go");

// ๅขž้‡ๆ›ดๆ–ฐ
let delta = universe.check_incremental(changes);

ยง็ฑปๅž‹ๆŸฅ่ฏข

โ“˜
use wootype::core::{TypeUniverse, TypeKind, PrimitiveType};
use wootype::query::QueryEngine;
use std::sync::Arc;

#[tokio::main]
async fn main() {
    let universe = Arc::new(TypeUniverse::new());
    let engine = QueryEngine::new(universe);
     
    // ๆŒ‰ๆŒ‡็บนๆŸฅ่ฏข็ฑปๅž‹
    let fingerprint = PrimitiveType::Int.fingerprint();
    let results = engine.query_by_fingerprint(fingerprint);
     
    for ty in results {
        println!("Found type: {:?}", ty);
    }
}

ยงAI Agent ไผš่ฏ

โ“˜
use wootype::agent::{AgentCoordinator, AgentSession, SessionConfig, AgentType};

// ๅˆ›ๅปบๅ่ฐƒๅ™จ
let coordinator = AgentCoordinator::new();

// ๅˆ›ๅปบไผš่ฏ
let config = SessionConfig {
    agent_type: AgentType::TypeChecker,
    isolation_level: IsolationLevel::ReadCommitted,
    ..Default::default()
};

let session = coordinator.create_session(config);

// ๅœจไผš่ฏไธญๆ‰ง่กŒ็ฑปๅž‹ๆฃ€ๆŸฅ
let result = session.check_types("main.go");

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

wootype ้‡‡็”จๅคšๅฑ‚ๆžถๆž„๏ผŒๆ”ฏๆŒไปŽๅตŒๅ…ฅๅผๅˆฐๆœๅŠก็ซฏ็š„ๅคš็ง้ƒจ็ฝฒๆจกๅผ๏ผš

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Service Layer                             โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚    gRPC     โ”‚  โ”‚  WebSocket  โ”‚  โ”‚   LSP Server        โ”‚ โ”‚
โ”‚  โ”‚   Service   โ”‚  โ”‚   Real-time โ”‚  โ”‚   Protocol          โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ–ผ                โ–ผ                    โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   Agent Layer                                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚         AgentCoordinator + AgentSession              โ”‚   โ”‚
โ”‚  โ”‚  โ€ข ๅคš Agent ๅนถๅ‘็ฎก็†                                  โ”‚   โ”‚
โ”‚  โ”‚  โ€ข ๅˆ†ๆ”ฏ้š”็ฆป (Speculative Execution)                   โ”‚   โ”‚
โ”‚  โ”‚  โ€ข ไผš่ฏ็”Ÿๅ‘ฝๅ‘จๆœŸ็ฎก็†                                    โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   Query Layer                                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚    Salsa    โ”‚  โ”‚   Pattern   โ”‚  โ”‚     Cache           โ”‚ โ”‚
โ”‚  โ”‚   Engine    โ”‚  โ”‚   Matcher   โ”‚  โ”‚    (LRU)            โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
          โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Core Layer                                โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚  โ”‚    ECS      โ”‚  โ”‚    Type     โ”‚  โ”‚    Symbol           โ”‚ โ”‚
โ”‚  โ”‚   Storage   โ”‚  โ”‚   System    โ”‚  โ”‚    Table            โ”‚ โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

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

  • core: ๆ ธๅฟƒ็ฑปๅž‹็ณป็ปŸ๏ผŒECS ๅญ˜ๅ‚จๆžถๆž„
  • query: ๆŸฅ่ฏขๅผ•ๆ“Ž๏ผŒๆ”ฏๆŒๆจกๅผๅŒน้…ๅ’Œ็ผ“ๅญ˜
  • validate: ็ฑปๅž‹้ชŒ่ฏๅ’Œๆตๅผๆฃ€ๆŸฅ
  • agent: AI Agent ไผš่ฏ็ฎก็†ๅ’Œๅ่ฐƒ
  • bridge: ไธŽ Go ็ผ–่ฏ‘ๅ™จ็š„ IPC ๆกฅๆŽฅ
  • api: gRPC/WebSocket/HTTP ๆœๅŠกๆŽฅๅฃ
  • salsa: Salsa ๅขž้‡่ฎก็ฎ—ๆก†ๆžถ้›†ๆˆ
  • semantic: ่ฏญไน‰ๅˆ†ๆžๅ’Œ gopls ๆ›ฟไปฃๅฎž็Žฐ

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

ยงIDE ๅฎžๆ—ถ็ฑปๅž‹ๆฃ€ๆŸฅ

โ“˜
use wootype::prelude::*;

// ็”จๆˆท่พ“ๅ…ฅๅญ—็ฌฆ โ†’ Salsa ๅขž้‡ๆฃ€ๆŸฅ โ†’ ๆ›ดๆ–ฐ็ฑปๅž‹ๆ็คบ
let universe = TypeUniverse::new();

// ๅˆๅง‹ๆฃ€ๆŸฅ
let result = universe.check_file("main.go");

// ๅขž้‡ๆ›ดๆ–ฐ๏ผˆไป…้‡ๆ–ฐ่ฎก็ฎ—ๅ˜ๆ›ด้ƒจๅˆ†๏ผ‰
let changes = vec![FileChange {
    path: "main.go",
    content: new_content,
}];
let delta = universe.check_incremental(changes);
// ๅปถ่ฟŸ: ~50ns (็ผ“ๅญ˜ๅ‘ฝไธญ)

ยงAI Agent ๆ‰น้‡ๅˆ†ๆž

โ“˜
use std::sync::Arc;
use wootype::prelude::*;

let universe = Arc::new(TypeUniverse::new());

// 1000+ AI Agent ๅนถๅ‘ๆŸฅ่ฏข็ฑปๅž‹
let handles: Vec<_> = (0..1000)
    .map(|i| {
        let u = Arc::clone(&universe);
        std::thread::spawn(move || {
            let engine = QueryEngine::new(u);
            let type_info = engine.query_type(symbol_id); // O(1) ๆŸฅ่ฏข
            type_info
        })
    })
    .collect();

ยงCI ็ฑปๅž‹ๆฃ€ๆŸฅ

โ“˜
use wootype::prelude::*;

// CI ็ฎก้“ไธญๅฟซ้€Ÿ็ฑปๅž‹ๆฃ€ๆŸฅ
let universe = TypeUniverse::new();

// ๆฃ€ๆŸฅๆ•ดไธช้กน็›ฎ
let result = universe.check_project("./...");

// ๆˆ–ไฝฟ็”จๅขž้‡ๆจกๅผ
let result = universe.check_incremental(detect_changes("."));

if result.has_errors() {
    std::process::exit(1);
}

ยง็ฑปๅž‹ๅ…ณ็ณปๅˆ†ๆž

โ“˜
use wootype::prelude::*;
use wootype::semantic;

// ๅˆ†ๆžๆŽฅๅฃๅฎž็Žฐๅ…ณ็ณป
let implementations = semantic::find_implementations(
    &universe,
    "io.Reader" // ๆŽฅๅฃๅ
);

// ๆฃ€ๆต‹ๅพช็Žฏ็ฑปๅž‹ไพ่ต–
let cycles = semantic::detect_cycles(&universe);

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

wootype ๆ˜ฏ Woo Ecosystem ็š„ๆ ธๅฟƒ็ป„ไปถ๏ผš

  • woofind: ็ฌฆๅทๆœ็ดขๅผ•ๆ“Ž๏ผŒๆไพ›็ฌฆๅท็ดขๅผ•
  • woolink: ่ทจๅŒ…็ฌฆๅท่งฃๆž๏ผŒๅ…จๅฑ€็ฌฆๅท่กจ
โ“˜
use wootype::prelude::*;
use woolink::SymbolUniverse;

// ไปŽ woolink ็ฌฆๅท่กจๆž„ๅปบ็ฑปๅž‹ๅฎ‡ๅฎ™
let symbol_universe = SymbolUniverse::new(100_000);
let type_universe = TypeUniverse::from_symbols(&symbol_universe);

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

Re-exportsยง

pub use agent::AgentCoordinator;
pub use agent::AgentId;
pub use agent::AgentSession;
pub use agent::AgentType;
pub use agent::IsolationLevel;
pub use agent::SessionConfig;
pub use agent::SessionId;

Modulesยง

agent
Multi-Agent concurrency with branch isolation
api
gRPC API for AI Agent access
bridge
IPC Bridge for Go compiler integration
build
ๆž„ๅปบไฟกๆฏ
core
Core type system components
daemon
Type Daemon - Type System as a Service
features
็ผ–่ฏ‘ๆ—ถๅŠŸ่ƒฝๅผ€ๅ…ณ
parser
Go parser integration
prelude
ๅธธ็”จ็ฑปๅž‹็š„ไพฟๆทๅฏผๅ…ฅ
query
Type query engine - Zero-latency type queries
salsa
Salsa-inspired incremental type checking
salsa_full
Full Salsa integration with advanced features Full Salsa integration for incremental type checking
semantic
Semantic OS - Complete gopls replacement ่ฏญไน‰ๆ“ไฝœ็ณป็ปŸ (Semantic OS)
validate
Streaming validation pipeline

Constantsยง

VERSION
Version of the library

Functionsยง

init_logging
Initialize logging/tracing