Step 335: C++ Generator — Inheritance + Templates (12/12 tests)

Updated CppGenerator, PythonGenerator, JavaGenerator for multiple inheritance
output using getBases(). C++ emits template prefix + access specifiers + virtual.
Python uses direct multi-base. Java uses extends + implements adaptation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Bill
2026-02-16 00:29:54 -07:00
parent b75fba72d8
commit 6464c88483
6 changed files with 331 additions and 4 deletions

View File

@@ -110,8 +110,36 @@
std::ostringstream oss;
auto annotations = cls->getChildren("annotations");
for (const auto* a : annotations) oss << generate(a) << "\n";
// Template prefix if has GenericType children with isClassTemplate
auto tpChildren = cls->getChildren("typeParameters");
for (const auto* tpc : tpChildren) {
if (tpc->conceptType == "GenericType") {
auto* gt = static_cast<const GenericType*>(tpc);
if (gt->isClassTemplate) {
oss << "template<";
auto params = gt->getChildren("typeParameters");
for (size_t i = 0; i < params.size(); ++i) {
if (i > 0) oss << ", ";
auto* tp = static_cast<const TypeParameter*>(params[i]);
if (tp->isVariadic) oss << "typename... " << tp->name;
else oss << "typename " << tp->name;
}
oss << ">\n";
break;
}
}
}
oss << "class " << cls->name;
if (!cls->superClass.empty()) oss << " : public " << cls->superClass;
auto bases = cls->getBases();
if (!bases.empty()) {
oss << " : ";
for (size_t i = 0; i < bases.size(); ++i) {
if (i > 0) oss << ", ";
oss << bases[i].accessSpecifier;
if (bases[i].isVirtual) oss << " virtual";
oss << " " << bases[i].name;
}
}
oss << " {\npublic:\n";
auto fields = cls->getChildren("fields");
for (const auto* f : fields)

View File

@@ -451,10 +451,21 @@ public:
for (const auto* a : annotations) oss << generate(a) << "\n";
if (cls->isAbstract) oss << "abstract ";
oss << "class " << cls->name;
if (!cls->superClass.empty()) oss << " extends " << cls->superClass;
auto bases = cls->getBases();
if (!bases.empty()) {
// First base → extends, rest → implements (Java adaptation)
oss << " extends " << bases[0].name;
if (bases.size() > 1) {
oss << " implements ";
for (size_t i = 1; i < bases.size(); ++i) {
if (i > 1) oss << ", ";
oss << bases[i].name;
}
}
}
auto interfaces = cls->getChildren("interfaces");
if (!interfaces.empty()) {
oss << " implements ";
oss << (bases.size() > 1 ? ", " : " implements ");
for (size_t i = 0; i < interfaces.size(); ++i) {
if (i > 0) oss << ", ";
oss << generate(interfaces[i]);

View File

@@ -538,7 +538,15 @@ public:
auto annotations = cls->getChildren("annotations");
for (const auto* a : annotations) oss << generate(a) << "\n";
oss << "class " << cls->name;
if (!cls->superClass.empty()) oss << "(" << cls->superClass << ")";
auto bases = cls->getBases();
if (!bases.empty()) {
oss << "(";
for (size_t i = 0; i < bases.size(); ++i) {
if (i > 0) oss << ", ";
oss << bases[i].name;
}
oss << ")";
}
oss << ":\n";
auto fields = cls->getChildren("fields");
auto methods = cls->getChildren("methods");