sql-lsp 0.1.0

A high-performance, multi-dialect SQL Language Server Protocol (LSP) implementation in Rust.
Documentation
# Gap Analysis - SQL LSP Project

基于对项目架构和代码的深入分析,以下是当前项目存在的缺陷和改进建议。

## 1. 功能缺失 (Critical)

### 1.1 配置管理系统缺失

**问题**: 项目缺少 `workspace/didChangeConfiguration` 的实现

- README 中提到支持动态配置 Schema,但 `server.rs` 中没有实现该 LSP 方法
- 用户无法通过 LSP 客户端动态配置 Schema 信息
- **建议**: 实现 `didChangeConfiguration` 处理器,支持运行时更新 Schema

```rust
// 缺失的实现示例
async fn did_change_configuration(&self, params: DidChangeConfigurationParams) {
    // 解析配置并更新 SchemaManager
}
```

### 1.2 增量同步未完整实现

**问题**: `did_change` 使用简化处理,未真正实现增量更新

- 当前代码注释: "实际应该根据 TextDocumentSyncKind::INCREMENTAL 进行增量更新"
- 仅使用最后一个变更 (`content_changes.last()`),在大文件场景下可能影响性能
- **建议**: 实现真正的增量更新逻辑或改为 `FULL` 同步

### 1.3 文档缺失

**问题**: README 中提到的文档文件不存在

在 README 中引用的文档均不存在:

- `docs/editor-integration.md`
- `docs/configuration.md`
- `docs/dialects.md`
- `docs/development.md`
- `docs/troubleshooting.md`
- `docs/contributing.md`
- `docs/api.md`
- `docs/uri-support.md`

**建议**: 创建这些文档以改善用户体验和开发者体验

## 2. 功能不完善 (High Priority)

### 2.1 格式化功能过于简单

**问题**: `format()` 仅删除多余空格,不具备真正的 SQL 格式化能力

```rust
// 当前实现过于简陋
async fn format(&self, sql: &str) -> String {
    sql.split_whitespace().collect::<Vec<_>>().join(" ")
}
```

**建议**:

- 集成 `sqlformat` crate 或实现基于 AST 的格式化
- 支持配置格式化选项(缩进、关键字大小写等)
- 或者在 `Cargo.toml` 中启用 `strict-parser` feature 并使用 `sqlparser` 进行格式化

### 2.2 Hover 功能简陋

**问题**: 当前 hover 实现仅简单的字符串匹配

```rust
// 当前实现:仅检查 sql.contains(&table.name)
if sql.contains(&table.name) { ... }
```

不支持:

- 列的详细信息
- 函数签名和文档
- 精确的光标位置匹配

**建议**: 使用 AST 位置信息而非简单字符串匹配

### 2.3 goto_definition 返回虚拟位置

**问题**: 跳转到定义返回硬编码的 `file:///schema.sql`

```rust
uri: Url::parse("file:///schema.sql").unwrap()
```

- 实际上应该跳转到 DDL 定义文件或 Schema 配置文件
- **建议**:
  - 扩展 Schema 数据结构添加源文件位置信息
  - 或支持从实际 DDL 文件中提取 Schema

## 3. 架构和设计问题 (Medium Priority)

### 3.1 Schema 推断的性能问题

**问题**: 每次文件变更都重新推断 Schema

- `get_schema_for_file` 在每次 `did_change` 时调用
- 大量 Schema 场景下,计算匹配分数可能成为性能瓶颈
- **建议**:
  - 添加推断结果缓存(已有 `file_schemas`,但在文件变更时会清除)
  - 只在解析出的表名发生变化时重新推断

### 3.2 Dialect Registry 不支持动态扩展

**问题**: 所有方言在初始化时硬编码注册

```rust
pub fn new() -> Self {
    registry.register(Arc::new(MysqlDialect::new()));
    registry.register(Arc::new(PostgresDialect::new()));
    // ... 硬编码
}
```

- 不利于插件化扩展
- **建议**: 提供动态注册机制或配置文件

### 3.3 错误处理不完善

**问题**: 多处使用 `unwrap()` 和 `unwrap_or_default()`

```rust
let text = self.document_manager.get(&uri).unwrap_or_default();
```

- 缺少详细的错误日志
- **建议**: 使用 `Result` 类型并添加详细日志(`log``tracing` crate)

### 3.4 并发安全性未经充分测试

**问题**: 虽然使用了 `DashMap` 和 `Arc`,但缺少并发测试

- `tests/` 中没有专门的并发测试覆盖
- **建议**: 添加并发场景测试(使用 `tokio::test` 和多线程)

## 4. 测试和质量保证 (Medium Priority)

### 4.1 测试覆盖不足

**问题**: 缺少以下方面的测试

- LSP 协议的各个方法(completion, hover, definition 等)
- 各方言的特定语法测试
- 错误处理的边界条件测试
- **建议**: 补充单元测试和集成测试

### 4.2 没有基准测试 (Benchmark)

**问题**: Makefile 中有 `bench` 命令,但没有实际的基准测试

```bash
bench: ## 运行基准测试(如果存在)
    cargo bench || echo "没有基准测试"
```

- 无法评估性能瓶颈
- **建议**: 添加关键路径的基准测试(解析、补全、Schema 推断)

### 4.3 端到端测试脚本不完整

**问题**: `scripts/lsp_client_test.py` 等测试脚本缺少详细说明

- 没有依赖声明(需要哪些 Python 包)
- **建议**: 添加 `requirements.txt` 和测试文档

## 5. 代码质量 (Low Priority)

### 5.1 重复代码

**问题**: 各 Dialect 实现中有大量重复代码

- `create_keyword_item`, `create_table_item` 等在每个 dialect 中都重复实现
- **建议**: 提取公共实现到 `dialect.rs` 或单独的 `completion_utils.rs`

### 5.2 类型命名不一致

**问题**: 不同文件中类型命名风格不统一

- `MysqlDialect` vs `ElasticsearchDslDialect` (MySQL vs Elasticsearch DSL)
- **建议**: 统一命名规范

### 5.3 缺少 API 文档

**问题**: 公开 API 缺少 Rustdoc 注释

- 大部分公开函数没有文档注释
- **建议**: 添加 `///` 文档并生成 `cargo doc`

## 6. 部署和分发 (Low Priority)

### 6.1 没有发布流程

**问题**: `.github/workflows/release.yml` 存在但可能不完整

- 缺少 crates.io 发布配置
- 缺少跨平台二进制构建(Windows, macOS, Linux)
- **建议**: 完善 CI/CD 流程

### 6.2 缺少安装指南

**问题**: README 提到 "Install via Cargo" 但未发布到 crates.io

- 用户只能从源代码构建
- **建议**: 发布到 crates.io 或提供预编译二进制

## 7. 性能和优化 (Low Priority)

### 7.1 Parser 对象未复用

**问题**: 每个 Dialect 都持有自己的 `SqlParser`

```rust
pub struct MysqlDialect {
    parser: std::sync::Mutex<SqlParser>,
}
```

- 可能造成内存浪费
- **建议**: 评估是否可以共享 Parser 实例

### 7.2 没有缓存机制

**问题**: 补全、解析结果没有缓存

- 相同查询可能重复解析
- **建议**: 添加 LRU 缓存(使用 `lru` crate)

## 优先级总结

### 立即处理 (Critical)

1. 实现 `didChangeConfiguration` 支持
2. 创建缺失的文档
3. 修复增量同步或改为 FULL 模式

### 近期改进 (High)

1. 改进格式化功能
2. 完善 hover 和 goto_definition 功能
3. 添加更多测试覆盖

### 长期优化 (Medium/Low)

1. 性能优化和缓存
2. 代码重构减少重复
3. 完善 CI/CD 和发布流程

## 建议开发路线图

### Phase 1: 核心功能完善 (1-2 周)

- [ ] 实现配置管理系统
- [ ] 创建基础文档(至少 editor-integration 和 configuration)
- [ ] 改进 format/hover/goto_definition

### Phase 2: 质量提升 (2-3 周)

- [ ] 提升测试覆盖率至 70%+
- [ ] 添加错误日志系统
- [ ] 性能优化和基准测试

### Phase 3: 生态完善 (持续)

- [ ] 发布到 crates.io
- [ ] 编写详细文档
- [ ] 社区支持和插件系统