242 lines
7.5 KiB
Markdown
242 lines
7.5 KiB
Markdown
|
|
# Core AST Structure - Testing & Validation Guide
|
||
|
|
|
||
|
|
**Status**: Phase 1 (Structures) & Phase 2 (Editors) Complete
|
||
|
|
**Created**: 2026-02-03
|
||
|
|
**Feature**: [spec.md](spec.md)
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
This guide provides step-by-step instructions for validating that the Core AST Structure implementation is working correctly in MPS. All structure concepts and editor definitions have been added to the SemAnno language files.
|
||
|
|
|
||
|
|
## Files Modified
|
||
|
|
|
||
|
|
### Phase 1: Structure Definitions
|
||
|
|
- **File**: `languages/SemAnno/models/SemAnno.structure.mps`
|
||
|
|
- **Changes**: Added ~30+ concept definitions including:
|
||
|
|
- Core AST Nodes: Module, Function, Parameter, Variable
|
||
|
|
- Statements: Block, Assignment, IfStatement, WhileLoop, ForLoop, Return, ExpressionStatement
|
||
|
|
- Expressions: BinaryOperation, UnaryOperation, FunctionCall, Literals, Collections, Access
|
||
|
|
- Types: PrimitiveType, ListType, SetType, MapType, TupleType, ArrayType, OptionalType, CustomType
|
||
|
|
- Annotations: DerefStrategy, OptimizationLock, LangSpecific
|
||
|
|
|
||
|
|
### Phase 2: Editor Definitions
|
||
|
|
- **File**: `languages/SemAnno/models/SemAnno.editor.mps`
|
||
|
|
- **Changes**: Added editor declarations for all Phase 1 concepts with:
|
||
|
|
- Proper syntax highlighting (keywords in blue)
|
||
|
|
- Nested structure indentation
|
||
|
|
- Inline property editing
|
||
|
|
- Reference cell handling
|
||
|
|
|
||
|
|
## Validation Checklist
|
||
|
|
|
||
|
|
### Step 1: Rebuild the SemAnno Language
|
||
|
|
|
||
|
|
1. Open MPS 2024.3 (or compatible version)
|
||
|
|
2. Open the Whetstone_DSL project
|
||
|
|
3. Right-click on the `SemAnno` language module
|
||
|
|
4. Select **Rebuild Language**
|
||
|
|
5. **Expected Result**: Build completes with **zero errors and zero warnings**
|
||
|
|
|
||
|
|
**If you see errors**:
|
||
|
|
- Check the MPS Error pane for red highlights
|
||
|
|
- Common issues:
|
||
|
|
- Missing concept IDs (should not happen if structure file is valid)
|
||
|
|
- Invalid parent concept references (check structure.mps file)
|
||
|
|
- Editor referencing non-existent concepts (check editor.mps file)
|
||
|
|
|
||
|
|
### Step 2: Create a Test Model
|
||
|
|
|
||
|
|
1. In MPS, create a new Model: Right-click project > New > Model
|
||
|
|
2. Name it: `SemAnno.tests.SimpleExample`
|
||
|
|
3. Choose **Language**: `SemAnno`
|
||
|
|
4. Create the model file
|
||
|
|
|
||
|
|
### Step 3: Create a Module Root
|
||
|
|
|
||
|
|
1. In the new model, click "Add Root" or right-click the model node
|
||
|
|
2. Select **Module** from the concept list
|
||
|
|
3. **Expected Result**:
|
||
|
|
- Editor shows: `module [editable field]`
|
||
|
|
- Type a name like "example"
|
||
|
|
|
||
|
|
### Step 4: Add a Function
|
||
|
|
|
||
|
|
1. Within the Module, add a Function element
|
||
|
|
2. Set name: `sum`
|
||
|
|
3. Add parameters by clicking the "+" next to parameters:
|
||
|
|
- Parameter 1: name="items", type="list[int]"
|
||
|
|
- Parameter 2: name="factor", type="float"
|
||
|
|
4. Set return type to "float"
|
||
|
|
5. **Expected Result**:
|
||
|
|
- Editor shows: `def sum(items: list[int], factor: float) -> float:`
|
||
|
|
- Function body is ready for statements
|
||
|
|
|
||
|
|
### Step 5: Add Statements to Function Body
|
||
|
|
|
||
|
|
1. Click in the function body area
|
||
|
|
2. Add a ForLoop:
|
||
|
|
- Iterator name: "item"
|
||
|
|
- Iterable: reference to "items"
|
||
|
|
- Body: add an assignment or expression
|
||
|
|
3. Add an Assignment statement:
|
||
|
|
- Target: "result"
|
||
|
|
- Value: `item + accumulator`
|
||
|
|
4. Add a Return statement:
|
||
|
|
- Value: multiply result by factor
|
||
|
|
5. **Expected Result**:
|
||
|
|
- Statements display with proper indentation
|
||
|
|
- Keywords (for, in, return) are highlighted in blue
|
||
|
|
- Nested structures are readable
|
||
|
|
|
||
|
|
### Step 6: Add a Variable at Module Level
|
||
|
|
|
||
|
|
1. In the Module, add a Variable:
|
||
|
|
- Name: "cache"
|
||
|
|
- Type: "optional[map[string, list[int]]]"
|
||
|
|
2. **Expected Result**:
|
||
|
|
- Complex nested type renders as: `optional[map[string, list[int]]]`
|
||
|
|
- Type hierarchy is readable and selectable
|
||
|
|
|
||
|
|
### Step 7: Add Expressions
|
||
|
|
|
||
|
|
1. Within an assignment or expression context, add:
|
||
|
|
- BinaryOperation: `items + factor` (or similar)
|
||
|
|
- FunctionCall: `print("message")`
|
||
|
|
- VariableReference to existing variables
|
||
|
|
- Literals: integers, floats, strings, booleans
|
||
|
|
2. **Expected Result**:
|
||
|
|
- Expressions render with proper operator spacing
|
||
|
|
- Function calls show: `functionName(arg1, arg2)`
|
||
|
|
- Literals display with syntax highlighting (strings in green, numbers in magenta)
|
||
|
|
|
||
|
|
### Step 8: Test Annotations (Future Expansion)
|
||
|
|
|
||
|
|
1. Try to add a DerefStrategy annotation to the function:
|
||
|
|
- Note: The structure supports this, but UI for adding annotations is part of future features
|
||
|
|
2. **Expected Result**:
|
||
|
|
- Concept exists and can be added
|
||
|
|
- Property and reference fields work
|
||
|
|
|
||
|
|
## Success Criteria
|
||
|
|
|
||
|
|
The implementation is complete and working when:
|
||
|
|
|
||
|
|
1. ✅ **SemAnno language rebuilds** with zero errors, zero warnings
|
||
|
|
2. ✅ **All concepts are available** when creating model roots and adding children
|
||
|
|
3. ✅ **Editors render correctly**:
|
||
|
|
- Keywords appear in blue
|
||
|
|
- Indentation works for nested structures
|
||
|
|
- Properties are editable inline
|
||
|
|
- References are selectable
|
||
|
|
4. ✅ **Type system works**: Nested types (list, optional, map, etc.) render correctly
|
||
|
|
5. ✅ **Model persistence**: Models save and reload without errors
|
||
|
|
6. ✅ **No red error marks** appear in the model tree for correctly created structures
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Problem: "Concept not found" error
|
||
|
|
|
||
|
|
**Cause**: Structure definitions may not have reloaded after rebuild.
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
1. In MPS, go to File > Invalidate Caches and Restart
|
||
|
|
2. Reopen the project
|
||
|
|
3. Rebuild the language again
|
||
|
|
|
||
|
|
### Problem: Editor shows placeholder text instead of structured content
|
||
|
|
|
||
|
|
**Cause**: Editor definitions may have incorrect role references.
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
1. Check SemAnno.editor.mps file for correct role names
|
||
|
|
2. Role names must match LinkDeclaration "role" properties in structure.mps
|
||
|
|
3. Rebuild language after fixing
|
||
|
|
|
||
|
|
### Problem: Model has red error squiggles
|
||
|
|
|
||
|
|
**Cause**: Invalid structure creation (wrong concept in wrong context).
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
1. Delete the invalid node
|
||
|
|
2. Recreate it, ensuring you select the correct concept
|
||
|
|
3. Verify type compatibility
|
||
|
|
|
||
|
|
### Problem: Reference fields won't accept concepts
|
||
|
|
|
||
|
|
**Cause**: Concept may not be the target of that reference.
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
1. Check structure.mps to verify reference type compatibility
|
||
|
|
2. Only accept valid target concept types
|
||
|
|
3. If needed, create intermediate wrapper concepts
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
After validation is complete:
|
||
|
|
|
||
|
|
1. **Phase 3**: Create constraint rules (SemAnno.constraints.mps)
|
||
|
|
2. **Phase 4**: Add type system and typesystem rules
|
||
|
|
3. **Downstream Features**: Python/C++ projections will build on this AST
|
||
|
|
|
||
|
|
## Reference: Concept Hierarchy
|
||
|
|
|
||
|
|
```
|
||
|
|
Module (root)
|
||
|
|
├── functions: Function*
|
||
|
|
├── variables: Variable*
|
||
|
|
└── annotations: Annotation*
|
||
|
|
|
||
|
|
Function
|
||
|
|
├── name: string
|
||
|
|
├── parameters: Parameter*
|
||
|
|
├── returnType: Type
|
||
|
|
├── body: Statement*
|
||
|
|
└── annotations: Annotation*
|
||
|
|
|
||
|
|
Statement (abstract)
|
||
|
|
├── Block
|
||
|
|
├── Assignment
|
||
|
|
├── IfStatement
|
||
|
|
├── WhileLoop
|
||
|
|
├── ForLoop
|
||
|
|
├── Return
|
||
|
|
└── ExpressionStatement
|
||
|
|
|
||
|
|
Expression (abstract)
|
||
|
|
├── BinaryOperation
|
||
|
|
├── UnaryOperation
|
||
|
|
├── FunctionCall
|
||
|
|
├── VariableReference
|
||
|
|
├── Literals: Integer, Float, String, Boolean, Null
|
||
|
|
├── ListLiteral
|
||
|
|
├── IndexAccess
|
||
|
|
└── MemberAccess
|
||
|
|
|
||
|
|
Type (abstract)
|
||
|
|
├── PrimitiveType (int, float, string, bool)
|
||
|
|
├── ListType
|
||
|
|
├── SetType
|
||
|
|
├── MapType
|
||
|
|
├── TupleType
|
||
|
|
├── ArrayType
|
||
|
|
├── OptionalType
|
||
|
|
└── CustomType
|
||
|
|
|
||
|
|
Annotation (abstract)
|
||
|
|
├── DerefStrategy
|
||
|
|
├── OptimizationLock
|
||
|
|
└── LangSpecific
|
||
|
|
```
|
||
|
|
|
||
|
|
## Documentation References
|
||
|
|
|
||
|
|
- Feature Specification: [spec.md](spec.md)
|
||
|
|
- Implementation Plan: [plan.md](plan.md)
|
||
|
|
- Task Definitions: [tasks.md](tasks.md)
|
||
|
|
- MPS Language Documentation: https://www.jetbrains.com/help/mps/
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Last Updated**: 2026-02-03
|
||
|
|
**Author**: Claude Haiku 4.5
|