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:
@@ -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)
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user