docs: restore docs/private/roadmap from 7b4908f9 (Phase 20.31)

This commit is contained in:
nyash-codex
2025-10-31 18:00:10 +09:00
parent 1d49e24bf0
commit 8fd3a2b509
433 changed files with 108935 additions and 0 deletions

View File

@ -0,0 +1,353 @@
# @enum Architecture Summary (Quick Reference)
**For**: Developers who want the TL;DR version
**See Also**: [enum-module-architecture.md](enum-module-architecture.md) (complete design)
---
## File Map (What Goes Where)
```
┌─────────────────────────────────────────────────────────────────┐
│ @enum Implementation │
│ File Organization │
└─────────────────────────────────────────────────────────────────┘
📁 src/
├── 📄 ast.rs [MODIFY +80 lines]
│ └── Add: EnumDeclaration, EnumVariant, EnumField structs
├── 📁 parser/
│ ├── 📄 mod.rs [MODIFY +10 lines]
│ │ └── Integrate enum parsing in parse_statement()
│ └── 📁 declarations/
│ ├── 📄 mod.rs [MODIFY +1 line]
│ │ └── Export enum_parser module
│ └── 📄 enum_parser.rs [NEW ~200 lines] ⭐
│ └── parse_enum_declaration()
└── 📁 macro/
├── 📄 mod.rs [MODIFY +1 line]
│ └── Export enum_expander module
├── 📄 engine.rs [MODIFY +15 lines]
│ └── Call enum_expander::expand_enum()
└── 📄 enum_expander.rs [NEW ~300 lines] ⭐
├── expand_enum()
├── generate_box_declaration()
└── generate_static_box()
📁 apps/
└── 📁 tests/
└── 📁 enum/ [NEW directory] ⭐
├── 📄 test_enum_basic.hako [NEW ~40 lines]
├── 📄 test_enum_option.hako [NEW ~30 lines]
└── 📄 test_enum_multi.hako [NEW ~50 lines]
📁 docs/
├── 📁 reference/language/
│ └── 📄 enum-syntax.md [NEW ~300 lines] ⭐
│ └── User guide for @enum
└── 📁 development/roadmap/phases/phase-19-enum-match/
├── 📄 enum-module-architecture.md [THIS DOC] ⭐
├── 📄 IMPLEMENTATION_CHECKLIST.md [CHECKLIST] ⭐
└── 📄 enum-implementation-notes.md [NEW ~200 lines] ⭐
└── Developer implementation notes
```
---
## Data Flow (Pipeline)
```
┌──────────────────────────────────────────────────────────────────────┐
│ @enum Processing Pipeline │
└──────────────────────────────────────────────────────────────────────┘
Source Code:
@enum Result { Ok(value: T), Err(error: E) }
┌─────────────────┐
│ Tokenizer │ (existing)
└─────────────────┘
│ Token Stream: [@, enum, Result, {, Ok, (, value, :, T, ), ...]
┌─────────────────┐
│ Parser │ src/parser/declarations/enum_parser.rs (NEW)
│ enum_parser.rs │ ← parse_enum_declaration()
└─────────────────┘
│ EnumDeclaration AST
┌─────────────────┐
│ AST Structs │ src/ast.rs (MODIFY)
│ ast.rs │ ← EnumDeclaration, EnumVariant, EnumField
└─────────────────┘
│ EnumDeclaration AST
┌─────────────────┐
│ Macro Engine │ src/macro/engine.rs (MODIFY)
│ engine.rs │ ← Call enum_expander::expand_enum()
└─────────────────┘
┌─────────────────┐
│ Enum Expander │ src/macro/enum_expander.rs (NEW)
│ enum_expander.rs│ ← expand_enum()
└─────────────────┘
│ Vec<ASTNode> [BoxDeclaration, StaticBoxDeclaration]
┌─────────────────────────────────────────────────────────────────┐
│ Generated AST: │
│ │
│ box ResultBox<T, E> { │
│ variant: StringBox │
│ ok_value: T │
│ err_error: E │
│ birth(variant, ok_value, err_error) { ... } │
│ is_ok() { return me.variant == "Ok" } │
│ is_err() { return me.variant == "Err" } │
│ } │
│ │
│ static box Result { │
│ Ok(value) { return new ResultBox("Ok", value, null) } │
│ Err(error) { return new ResultBox("Err", null, error) } │
│ } │
└─────────────────────────────────────────────────────────────────┘
│ BoxDeclaration + StaticBoxDeclaration AST
┌─────────────────┐
│ MIR Builder │ (existing)
└─────────────────┘
│ MIR
┌─────────────────┐
│ Backend │ (existing)
│ VM/LLVM/WASM │
└─────────────────┘
Executable
```
---
## Module Dependencies (No Cycles)
```
┌─────────────────────────────────────────────────────────────┐
│ Dependency Graph │
│ (Linear Flow) │
└─────────────────────────────────────────────────────────────┘
tokenizer.rs
enum_parser.rs ──depends on──> ast.rs (EnumDeclaration structs)
ast.rs
enum_expander.rs ──depends on──> ast.rs (BoxDeclaration structs)
engine.rs ──depends on──> enum_expander.rs
parser/mod.rs (integration)
MIR builder (existing)
✅ No circular dependencies
✅ Clear data flow
✅ Easy to test each layer independently
```
---
## Naming Conventions (Quick Reference)
| Item | Pattern | Example |
|------|---------|---------|
| **Files** | `snake_case.rs` | `enum_parser.rs`, `enum_expander.rs` |
| **AST structs** | `CamelCase` | `EnumDeclaration`, `EnumVariant`, `EnumField` |
| **Functions** | `verb_noun()` | `parse_enum_declaration()`, `expand_enum()` |
| **Tests** | `test_*.hako` | `test_enum_basic.hako` |
| **Input syntax** | `@enum Name` | `@enum Result`, `@enum Option` |
| **Generated box** | `{Name}Box<T>` | `ResultBox<T, E>`, `OptionBox<T>` |
| **Generated static** | `{Name}` | `Result`, `Option` |
| **Variant fields** | `{variant}_{field}` | `ok_value`, `err_error` |
| **Query methods** | `is_{variant}()` | `is_ok()`, `is_err()` |
---
## Test Organization (3 Layers)
```
┌─────────────────────────────────────────────────────────────────┐
│ Test Strategy │
└─────────────────────────────────────────────────────────────────┘
Layer 1: Parser Unit Tests (Rust)
📁 src/parser/declarations/enum_parser.rs
└── #[cfg(test)] mod tests {
✓ test_parse_two_variant_enum()
✓ test_parse_zero_field_variant()
✓ test_duplicate_variant_error()
}
Run: cargo test --lib enum_parser::tests
Layer 2: Expander Unit Tests (Rust)
📁 src/macro/enum_expander.rs
└── #[cfg(test)] mod tests {
✓ test_expand_result_enum()
✓ test_generated_box_fields()
✓ test_generated_is_methods()
}
Run: cargo test --lib enum_expander::tests
Layer 3: Integration Tests (Hakorune)
📁 apps/tests/enum/
├── test_enum_basic.hako ← Result-like (Ok/Err)
├── test_enum_option.hako ← Option-like (Some/None)
└── test_enum_multi.hako ← 3+ variants
Run: ./target/release/hako apps/tests/enum/*.hako
```
---
## Timeline (3 Days + 1 Buffer)
```
┌─────────────────────────────────────────────────────────────────┐
│ Implementation Timeline │
└─────────────────────────────────────────────────────────────────┘
Day 1: Parser + AST (Foundation) ⏰ 8 hours
✓ Add AST structs (EnumDeclaration, EnumVariant, EnumField)
✓ Create enum_parser.rs
✓ Implement parse_enum_declaration()
✓ Add tokenizer support for @enum
✓ Write parser unit tests
✓ Integration: Export from mod.rs
Output: Can parse @enum syntax into AST ✅
Day 2: Macro Expander (Code Generation) ⏰ 8 hours
✓ Create enum_expander.rs
✓ Implement expand_enum()
✓ Implement generate_box_declaration()
✓ Implement generate_static_box()
✓ Write expander unit tests
✓ Integration: Call from engine.rs
Output: Can transform enum AST → box AST ✅
Day 3: Integration Tests + Documentation ⏰ 8 hours
✓ Create apps/tests/enum/ directory
✓ Write test_enum_basic.hako (Result-like)
✓ Write test_enum_option.hako (Option-like)
✓ Write test_enum_multi.hako (3+ variants)
✓ Write enum-syntax.md (user guide)
✓ Write enum-implementation-notes.md (dev notes)
Output: Full pipeline working + documented ✅
Day 4: Polish + Edge Cases (Buffer) ⏰ 4-8 hours
✓ Error handling (duplicate variants, invalid names)
✓ Edge cases (zero-field variants, single variant)
✓ Code review and refactoring
✓ Clippy and fmt fixes
Output: Production-ready code ✅
```
---
## Success Criteria (Checklist)
- [ ]**Parser**: Can parse `@enum Result { Ok(value: T), Err(error: E) }`
- [ ]**AST**: EnumDeclaration nodes correctly constructed
- [ ]**Expander**: Generates BoxDeclaration + StaticBoxDeclaration
- [ ]**Generated Code**: Valid Hakorune syntax
- [ ]**Tests**: All integration tests pass
- [ ]**Docs**: User guide and developer notes complete
- [ ]**Errors**: Helpful error messages for common mistakes
- [ ]**Edge Cases**: Zero-field variants, single variant, many variants
- [ ]**No Regressions**: Existing tests still pass
---
## Quick Commands (Copy-Paste Ready)
```bash
# Day 1: Build and test parser
cargo build
cargo test --lib enum_parser::tests
# Day 2: Build and test expander
cargo build
cargo test --lib enum_expander::tests
# Day 3: Run integration tests
./target/release/hako apps/tests/enum/test_enum_basic.hako
./target/release/hako apps/tests/enum/test_enum_option.hako
./target/release/hako apps/tests/enum/test_enum_multi.hako
# Day 4: Code quality checks
cargo clippy
cargo fmt
cargo test
# All enum tests at once
for test in apps/tests/enum/*.hako; do
echo "Running $test..."
./target/release/hako "$test" || echo "FAILED: $test"
done
```
---
## Key Design Principles
1. **Separation of Concerns**: Parser → AST → Expander → Engine (clear boundaries)
2. **Testability**: 3-layer testing (parser unit, expander unit, integration)
3. **Follows Existing Patterns**: Consistent with box_definition.rs style
4. **Minimal Changes**: Only 5 files modified + 8 files created
5. **Future-Proof**: Easy to extend for match expressions (Phase 19.2)
---
## FAQ (Quick Answers)
**Q: Where do I start?**
A: Read [IMPLEMENTATION_CHECKLIST.md](IMPLEMENTATION_CHECKLIST.md) and start Day 1
**Q: What if I get stuck?**
A: Check [enum-module-architecture.md](enum-module-architecture.md) for detailed design
**Q: How do I run tests?**
A: See "Quick Commands" section above
**Q: What about match expressions?**
A: Phase 19.2 (future work) - hooks are in place for easy integration
**Q: Will this break existing code?**
A: No - all changes are additive, no existing functionality modified
**Q: How do I generate documentation?**
A: `cargo doc --open` for Rust docs, markdown files for user docs
---
## Next Steps
1. ✅ Review this summary
2. ✅ Read [IMPLEMENTATION_CHECKLIST.md](IMPLEMENTATION_CHECKLIST.md)
3. ✅ Start Day 1: Parser + AST
4. ✅ Follow checklist day by day
5. ✅ Celebrate when done! 🎉
---
**Document Version**: 1.0
**Last Updated**: 2025-10-08
**Status**: Ready for Implementation ✅