Step 340: C++ Generator — Preprocessor, Enum, Namespace (12/12 tests)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Bill
2026-02-16 08:17:50 -07:00
parent 93d84fd29b
commit e958c778f3
12 changed files with 776 additions and 0 deletions

View File

@@ -624,6 +624,56 @@ public:
return "// @constexpr";
}
// --- Preprocessor/Enum/Namespace visitors (Step 340) ---
std::string visitIncludeDirective(const ASTNode* node) override {
auto* inc = static_cast<const IncludeDirective*>(node);
std::string mod = inc->path;
auto dot = mod.rfind('.');
if (dot != std::string::npos) mod = mod.substr(0, dot);
return "import '" + mod + "';";
}
std::string visitPragmaDirective(const ASTNode* node) override {
auto* prag = static_cast<const PragmaDirective*>(node);
return "// pragma " + prag->directive;
}
std::string visitMacroDefinition(const ASTNode* node) override {
auto* mac = static_cast<const MacroDefinition*>(node);
return "const " + mac->name + " = " + (mac->body.empty() ? "undefined" : mac->body) + ";";
}
std::string visitEnumDeclaration(const ASTNode* node) override {
auto* e = static_cast<const EnumDeclaration*>(node);
std::ostringstream oss;
oss << "const " << e->name << " = Object.freeze({\n";
auto members = e->getChildren("members");
for (size_t i = 0; i < members.size(); ++i) {
auto* m = static_cast<const EnumMember*>(members[i]);
oss << " " << m->name << ": " << (m->value.empty() ? std::to_string(i) : m->value);
if (i + 1 < members.size()) oss << ",";
oss << "\n";
}
oss << "});";
return oss.str();
}
std::string visitNamespaceDeclaration(const ASTNode* node) override {
auto* ns = static_cast<const NamespaceDeclaration*>(node);
std::ostringstream oss;
oss << "// namespace " << ns->name << "\n";
auto body = ns->getChildren("body");
for (const auto* child : body)
oss << generate(child) << "\n";
return oss.str();
}
std::string visitTypeAlias(const ASTNode* node) override {
auto* ta = static_cast<const TypeAlias*>(node);
return "/** @typedef {" + ta->targetType + "} " + ta->aliasName + " */";
}
protected:
bool includeTypes_ = false;