14 KiB
14 KiB
@enum Architecture Summary (Quick Reference)
For: Developers who want the TL;DR version See Also: 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)
# 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
- Separation of Concerns: Parser → AST → Expander → Engine (clear boundaries)
- Testability: 3-layer testing (parser unit, expander unit, integration)
- Follows Existing Patterns: Consistent with box_definition.rs style
- Minimal Changes: Only 5 files modified + 8 files created
- Future-Proof: Easy to extend for match expressions (Phase 19.2)
FAQ (Quick Answers)
Q: Where do I start? A: Read IMPLEMENTATION_CHECKLIST.md and start Day 1
Q: What if I get stuck? A: Check 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
- ✅ Review this summary
- ✅ Read IMPLEMENTATION_CHECKLIST.md
- ✅ Start Day 1: Parser + AST
- ✅ Follow checklist day by day
- ✅ Celebrate when done! 🎉
Document Version: 1.0 Last Updated: 2025-10-08 Status: Ready for Implementation ✅