wootype 0.1.0

Type System as a Service - Rust-powered Go type checker for AI Agents
Documentation
# Salsa 增量计算实现

## 概述

本项目为 wootype 引入了 Salsa 风格的增量计算框架,实现函数级增量类型检查,灵感来自 Rust Analyzer 和 Astral 的 ty。

## 核心特性

### 1. 增量数据库 (`IncrementalDb`)

```rust
let db = IncrementalDb::new();

// 注册函数
db.set_function("add".to_string(), function_body);

// 类型推断(自动缓存)
let result = db.infer_function("add");

// 更新函数(自动使缓存失效)
db.set_function("add".to_string(), new_body);

// 重新推断(只重新计算变更的函数)
let result = db.infer_function("add");
```

### 2. 查询缓存

- **解析查询**: `parse_file(path)` - 缓存 AST
- **类型推断**: `infer_function(name)` - 缓存函数类型
- **导入解析**: `resolve_imports(path)` - 缓存依赖

### 3. 依赖追踪

```rust
// 当输入变化时,自动使依赖查询失效
db.set_file("main.go".to_string(), new_content);
// 所有依赖于 main.go 的查询自动失效并重新计算
```

## 性能基准

### 测试结果

| 测试场景 | 时间 | 说明 |
|---------|------|------|
| Cold check (10 funcs) | ~12 µs | 全量检查 |
| Cold check (100 funcs) | ~115 µs | 全量检查 |
| Cold check (1000 funcs) | ~1.2 ms | 全量检查 |
| **Incremental check** | **~33 µs** | **只更新变更函数** |
| LSP single char insert | ~904 ns | 字符级增量 |
| Function isolation | ~464 ns | 函数级隔离 |
| PyTorch-like incremental | ~462 ns | 模拟 ty 场景 |

### 增量 vs 冷启动加速比

| 函数数量 | 冷启动 | 增量 | 加速比 |
|---------|--------|------|--------|
| 100 | 115 µs | 33 µs | **3.5x** |
| 1000 | 1.2 ms | 518 µs | **2.3x** |

**注意**: 这是简化实现的基准。完整的 Salsa 实现(如 Rust Analyzer)可以达到 10-100x 加速。

## 架构对比

### 传统架构
```
输入 → 解析全部 → 类型检查全部 → 输出
         ↑_________↓
              每次都要重新计算
```

### Salsa 增量架构
```
输入 → 查询系统 → 缓存? → 是 → 返回缓存结果
                ↓ 否
              计算 → 存储缓存 → 输出
                ↑______↓
              变更时只使依赖失效
```

## 关键组件

### 1. 输入管理 (`InputManager`)

```rust
let manager = InputManager::new();

// 全量更新
manager.set_file(path, content);

// LSP 增量更新
manager.apply_change(IncrementalChange {
    file: path,
    range: ChangeRange { start_line, start_col, end_line, end_col },
    new_text: "new_code".to_string(),
});
```

### 2. 查询系统

```rust
// 定义查询键
enum QueryKey {
    ParseFile(String),
    InferFunction(String),
}

// 查询自动缓存和追踪依赖
let result = db.query(QueryKey::InferFunction("add".to_string()), |inputs| {
    // 计算逻辑
    compute_function_type(inputs, "add")
});
```

### 3. LSP 集成

```rust
// 支持增量同步
did_change(&self, params: DidChangeTextDocumentParams) {
    for change in params.content_changes {
        if let Some(range) = change.range {
            // 增量更新
            self.apply_incremental_change(range, change.text);
        } else {
            // 全量更新
            self.set_file(path, change.text);
        }
    }
    
    // 触发诊断
    self.run_diagnostics(&url).await;
}
```

## 类型系统特性

### 支持的类型
- 基础类型: `bool`, `int`, `float64`, `string`
- 复合类型: `struct`, `interface`, `array`, `slice`, `map`, `chan`
- 函数类型: `fn(params) return`
- 指针类型: `*T`

### 类型检查特性
- 变量声明和赋值检查
- 二元操作符类型推断
- 类型提升(int + float = float)
- 函数调用参数检查
- 字段访问检查

### 示例

```go
// 类型推断
func add(x, y int) int {
    return x + y  // 返回 int
}

// 类型错误检测
func bad() {
    x := "hello"
    y := x + 42  // 错误: cannot add string and int
}

// 类型提升
func promote() float64 {
    return 1 + 2.5  // 返回 float64
}
```

## 与 ty 的对比

| 特性 | ty (Astral) | wootype (当前) |
|------|-------------|----------------|
| 增量框架 | Salsa (完整) | 自定义简化版 |
| 粒度 | 函数级 | 函数级 |
| 冷启动 (1000 funcs) | ~10-20ms | ~1.2ms (简化) |
| 增量更新 | ~4.7ms | ~518µs |
| LSP 响应 | <1ms | ~904ns |
| 缓存策略 | LRU + 版本 | HashMap |

## 未来改进

### 短期
1. **引入完整 Salsa**: 使用 `salsa-rs` crate 替代自定义实现
2. **LRU 缓存**: 限制内存使用
3. **并行查询**: 使用 Rayon 并行化独立查询

### 中期
1. **依赖图优化**: 更精细的依赖追踪
2. **部分失效**: 函数内语句级增量
3. **跨模块增量**: 包级别的依赖管理

### 长期
1. **持久化缓存**: 磁盘缓存支持
2. **分布式查询**: 多核/多机并行
3. **WASM 支持**: 浏览器端类型检查

## 使用示例

### 命令行
```bash
# 启动增量类型检查服务
wootype-daemon --incremental

# 检查文件
wootype check main.go
```

### LSP 编辑器集成
```json
// VS Code settings
{
    "go.toolsManagement.autoUpdate": false,
    "gopls": {
        "build.experimentalWorkspaceModule": true
    }
}
```

### Rust API
```rust
use wootype::salsa::*;

// 创建数据库
let db = IncrementalDb::new();

// 注册文件
db.set_file("main.go".to_string(), source_code);

// 获取解析结果(缓存)
let parse = db.parse_file("main.go");

// 类型推断(缓存)
for func in &parse.functions {
    let types = db.infer_function(&func.name);
    println!("{}: {}", func.name, types.return_type);
}
```

## 总结

通过引入 Salsa 风格的增量计算,wootype 实现了:
- **函数级增量**: 只重新计算变更的函数
- **查询缓存**: 避免重复计算
- **LSP 优化**: <1ms 的实时响应
- **可扩展架构**: 为未来高级特性打下基础

虽然当前是简化实现,但已展示了增量架构的核心优势。未来引入完整 Salsa 后,性能将达到 Rust Analyzer 级别。