autozig 0.1.2

Safe autogenerated interop between Rust and Zig
Documentation

# AutoZig Phase 2 Implementation Status

## 实施日期
2026-01-05

## 实施概述
AutoZig Phase 2 的核心架构已完成实现,添加了对有状态 Trait 的支持,包括 Opaque Pointer 管理和生命周期契约。

---

## ✅ 已完成的功能

### 1. Parser 扩展 (`autozig/parser/src/lib.rs`)

#### 新增数据结构
- `RustTraitImpl` 添加了以下字段:
  - `is_opaque: bool` - 标记是否为 opaque pointer 类型
  - `constructor: Option<TraitMethod>` - 构造函数
  - `destructor: Option<TraitMethod>` - 析构函数

- `TraitMethod` 添加了以下字段:
  - `is_constructor: bool` - 标记是否为构造函数
  - `is_destructor: bool` - 标记是否为析构函数

#### 新增函数
- `is_opaque_struct()` - 检测 `struct Name(opaque);` 语法
-`has_attribute()` - 检测 `#[constructor]``#[destructor]` 属性
-`parse_inherent_impl()` - 解析 inherent impl 块(`impl Type { ... }`- ✅ 修改 `extract_zig_function_from_expr()` - 支持非 `zig_*` 前缀的函数名

#### 解析流程
1. ✅ 第一遍:收集所有 `struct Name(opaque);` 声明
2. ✅ 第二遍:解析 impl 块,标记 opaque 类型
3. ✅ 第三遍:收集其他定义,跳过将被生成的结构体

---

### 2. Macro 代码生成 (`autozig/macro/src/lib.rs`)

#### 新增函数
- `generate_opaque_struct()` - 生成 Opaque Pointer 结构体
  ```rust
  pub struct ZigHasher {
      inner: std::ptr::NonNull<std::ffi::c_void>,
      _marker: std::marker::PhantomData<*mut ()>,
  }
  ```

- `generate_constructor()` - 生成构造函数
  ```rust
  impl ZigHasher {
      pub fn new() -> Self {
          unsafe {
              let ptr = ffi::hasher_new();
              std::ptr::NonNull::new(ptr as *mut _)
                  .map(|inner| Self { inner, _marker: PhantomData })
                  .expect("Zig allocation failed (OOM)")
          }
      }
  }
  ```

- `generate_drop_impl()` - 生成 Drop 实现
  ```rust
  impl Drop for ZigHasher {
      fn drop(&mut self) {
          unsafe { ffi::hasher_free(self.inner.as_ptr()); }
      }
  }
  ```

- `inject_self_pointer()` - 在 trait 方法中自动注入 self 指针
-`handle_receiver_type()` - 处理 `&self` vs `&mut self` 的指针类型

#### 修改的函数
- `generate_trait_impl_types()` - 支持生成 opaque struct,防止重复生成
-`generate_trait_implementations()` - 处理 constructor/destructor,跳过空 trait 名称
-`generate_trait_ffi_declarations()` - 为 constructor/destructor 生成 FFI 声明

---

### 3. Engine 扩展 (`autozig/engine/src/zig_compiler.rs`)

- ✅ 添加 `-lc` 标志到 Zig 编译命令
  - 原因:Phase 2 使用 `std.heap.c_allocator` 需要链接 libc

---

### 4. 示例项目 (`autozig/examples/trait_hasher`)

#### 文件结构
```
examples/trait_hasher/
├── Cargo.toml          ✅ 已创建
├── build.rs            ✅ 已创建
└── src/
    └── main.rs         ✅ 已创建(包含完整示例和 7 个测试)
```

#### Zig 实现
- `HasherState` 结构体 - 包含哈希状态
-`hasher_new()` - 构造函数,使用 `c_allocator.create()`
-`hasher_free()` - 析构函数,使用 `c_allocator.destroy()`
-`hasher_write()` - 写入数据到哈希器
-`hasher_finish()` - 返回最终哈希值

#### Rust 包装器
- `ZigHasher(opaque)` 声明
-`impl ZigHasher` with `#[constructor]` and `#[destructor]`
-`impl std::hash::Hasher for ZigHasher`

#### 测试套件(7 个测试)
1. `test_basic_hashing` - 基础哈希功能
2.`test_hash_consistency` - 哈希一致性
3.`test_hashmap_integration` - HashMap 集成
4.`test_drop` - Drop 正确调用
5.`test_multiple_writes` - 多次写入
6.`test_zero_length` - 空输入处理
7.`test_different_inputs_different_hashes` - 不同输入产生不同哈希

---

## ⚠️ 当前状态:需要修复的问题

### 编译错误(约 ~5 个)

1. **方法调用问题** - `hasher_write``hasher_finish` 未正确生成
   - 原因:方法体中的参数传递需要调整
   - 修复方向:检查 trait 方法的参数注入逻辑

2. **Default trait 缺失** - `BuildHasherDefault<ZigHasher>` 需要 `ZigHasher: Default`
   - 原因:Opaque types 不能实现 Default(因为需要 Zig 分配)
   - 修复方向:使用 `BuildHasher` 的自定义实现,而不是 `BuildHasherDefault`

3. **FFI 声明可能有问题** - 需要验证生成的 FFI 声明是否正确

---

## 📊 完成度评估

### 核心功能实现:**90%**
- ✅ Parser 架构:100%
- ✅ Macro 架构:90%
- ✅ Opaque Pointer 生成:100%
- ✅ Constructor/Destructor:100%
- ⚠️ Trait 方法注入:80% (需要修复方法调用)
- ✅ 示例代码:100%
- ⚠️ 编译成功:0% (有编译错误)
- ⏳ 测试通过:0% (未能编译)

### 剩余工作量:**~2-4 小时**

#### 高优先级(必须)
1. 修复 trait 方法的参数传递逻辑(~1 小时)
2. 处理 Default trait 问题(~30 分钟)
3. 验证并修复 FFI 声明(~30 分钟)

#### 中优先级(推荐)
4. 运行并通过所有测试(~30 分钟)
5. 内存泄漏检查(valgrind)(~30 分钟)
6. 更新文档(~30 分钟)

---

## 🔧 下一步行动计划

### 立即行动(修复编译错误)

1. **修复方法体生成逻辑**
   ```rust
   // 当前问题:方法体直接调用 hasher_write(bytes)
   // 应该调用:ffi::hasher_write(self.inner.as_ptr(), bytes.as_ptr(), bytes.len())
   ```

2. **移除 BuildHasherDefault,使用自定义 BuildHasher**
   ```rust
   // 添加到生成的代码:
   impl std::hash::BuildHasher for ZigHasherBuilder {
       type Hasher = ZigHasher;
       fn build_hasher(&self) -> Self::Hasher {
           ZigHasher::new()
       }
   }
   ```

3. **验证 FFI 声明**
   - 确保 `hasher_write` 的签名正确:`(self_ptr: *mut c_void, bytes_ptr: *const u8, len: usize)`
   - 确保 `hasher_finish` 的签名正确:`(self_ptr: *const c_void) -> u64`

### 短期目标(本周)
- 修复所有编译错误
- 通过 6/6 测试
- 完成 valgrind 内存检查

### 中期目标(本月)
- 更新 TRAIT_SUPPORT_ROADMAP.md
- 更新 README.md
- 添加更多 Phase 2 示例

---

## 📝 技术要点总结

### Opaque Pointer 设计
```rust
pub struct ZigHasher {
    inner: std::ptr::NonNull<std::ffi::c_void>,  // 非空保证
    _marker: std::marker::PhantomData<*mut ()>,  // !Send !Sync
}
```

### 生命周期契约
- Rust `new()` → Zig `hasher_new()` 返回 `?*HasherState`
- Rust `Drop::drop()` → Zig `hasher_free(*HasherState)`
- Zig 使用 `std.heap.c_allocator` 进行内存管理

### Self 指针注入
- `&self` → FFI 第一个参数为 `*const std::ffi::c_void`
- `&mut self` → FFI 第一个参数为 `*mut std::ffi::c_void`
- 宏自动注入 `self.inner.as_ptr()`

### OOM 处理
```rust
std::ptr::NonNull::new(ptr as *mut _)
    .map(|inner| Self { inner, _marker: PhantomData })
    .expect("Zig allocation failed (OOM)")
```

---

## 🎯 成功标准(Phase 2 完成)

- ✅ Parser 支持 `struct Name(opaque)` 语法
- ✅ Parser 支持 `#[constructor]``#[destructor]` 属性
- ✅ Macro 正确生成 Opaque Pointer 结构体
- ✅ Macro 正确生成 Drop 实现
- ⚠️ Macro 自动注入 self 指针到 trait 方法(部分完成)
- ⚠️ `examples/trait_hasher` 编译通过(有错误)
- ⏳ 所有 6-7 个测试通过(未运行)
- ⏳ Hasher 可用于 `HashMap`(未验证)
- ⏳ 无内存泄漏(valgrind 验证)(未测试)
- ⏳ 文档更新完成(未完成)

---

## 📌 已知限制

1. **当前不支持** Default trait for opaque types
   - 原因:Opaque types 必须通过 Zig constructor 创建
   - 解决方案:使用自定义 BuildHasher

2. **调试输出** 仍然存在于 parser 中
   - 需要移除所有 `eprintln!` 调试语句

3. **方法体语法** 限制
   - 当前需要完整函数体:`fn write(&mut self, bytes: &[u8]) { hasher_write(bytes) }`
   - 不支持简写:`fn write(&mut self, bytes: &[u8]) = hasher_write;`

---

## 🚀 Phase 2 里程碑

- [x] 2026-01-05: 核心架构实现完成(90%)
- [ ] 2026-01-06: 修复编译错误,测试通过
- [ ] 2026-01-07: