Files
whetstone_DSL/editor/tests/step11_test.cpp

95 lines
3.1 KiB
C++

// Step 11: Python generator - Annotation output.
//
// DerefStrategy → `# @deref(strategy)` comment in Python
// OptimizationLock → `# @lock(...)` comment
// Test: SimpleFunctionExample with @deref(batched) → comment appears in output.
#include "../src/ast/Module.h"
#include "../src/ast/Function.h"
#include "../src/ast/Variable.h"
#include "../src/ast/Parameter.h"
#include "../src/ast/Statement.h"
#include "../src/ast/Expression.h"
#include "../src/ast/Type.h"
#include "../src/ast/Annotation.h"
#include "../src/ast/Generator.h"
#include <cassert>
#include <iostream>
#include <sstream>
int main() {
// Build a SimpleFunctionExample module with deref annotation
Module simple("SFE_M001", "SimpleFunctionExample", "python");
// Add a function: def calculate_sum(a, b) with deref annotation
Function calcSum("SFE_F001", "calculate_sum");
// Add parameters a and b
Parameter pa("SFE_P001", "a");
PrimitiveType paType("SFE_PT001", "int");
pa.setChild("type", &paType);
calcSum.addChild("parameters", &pa);
Parameter pb("SFE_P002", "b");
PrimitiveType pbType("SFE_PT002", "int");
pb.setChild("type", &pbType);
calcSum.addChild("parameters", &pb);
// Add return type
PrimitiveType retType("SFE_RT001", "int");
calcSum.setChild("returnType", &retType);
// Add deref strategy annotation: @deref(batched)
DerefStrategy derefStrategy;
derefStrategy.id = "SFE_DR001";
derefStrategy.strategy = "batched";
calcSum.addChild("annotations", &derefStrategy);
// Add a simple assignment: result = a + b
Assignment assign;
assign.id = "SFE_A001";
// Assignment target: result
VariableReference assignTarget("SFE_VR001", "result");
assign.setChild("target", &assignTarget);
// Assignment value: a + b (BinaryOperation)
BinaryOperation addOp("SFE_BO001", "+");
// Left operand: a
VariableReference varA("SFE_VR_a", "a");
addOp.setChild("left", &varA);
// Right operand: b
VariableReference varB("SFE_VR_b", "b");
addOp.setChild("right", &varB);
assign.setChild("value", &addOp);
calcSum.addChild("body", &assign);
// Add return statement: return result
Return retStmt;
retStmt.id = "SFE_R001";
VariableReference retVal("SFE_VR_return", "result");
retStmt.setChild("value", &retVal);
calcSum.addChild("body", &retStmt);
// Add function to module
simple.addChild("functions", &calcSum);
// Create Python generator and generate code
PythonGenerator gen;
std::string output = gen.visitModule(&simple);
std::cout << "Generated Python code:\n" << output << std::endl;
// Verify the output contains the expected Python code with annotation comment
assert(output.find("def calculate_sum(a: int, b: int):") != std::string::npos);
assert(output.find("result = a + b") != std::string::npos);
assert(output.find("return result") != std::string::npos);
// Check that the deref annotation appears as a comment
assert(output.find("# @deref(batched)") != std::string::npos);
std::cout << "\nStep 11: PASS — Python generator handles annotation output" << std::endl;
return 0;
}