summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/cplusplus/generate-ast.cpp92
1 files changed, 86 insertions, 6 deletions
diff --git a/src/tools/cplusplus/generate-ast.cpp b/src/tools/cplusplus/generate-ast.cpp
index 7051db24ce..3bab1aa41b 100644
--- a/src/tools/cplusplus/generate-ast.cpp
+++ b/src/tools/cplusplus/generate-ast.cpp
@@ -769,6 +769,72 @@ private:
Overview oo;
};
+static QList<QTextCursor> removeConstructors(ClassSpecifierAST *classAST,
+ TranslationUnit *translationUnit,
+ QTextDocument *document)
+{
+ Overview oo;
+ QList<QTextCursor> cursors;
+ const QString className = oo(classAST->symbol->name());
+
+ for (DeclarationListAST *iter = classAST->member_specifier_list; iter; iter = iter->next) {
+ if (FunctionDefinitionAST *funDef = iter->value->asFunctionDefinition()) {
+ if (oo(funDef->symbol->name()) == className) {
+ // found it:
+ QTextCursor tc = createCursor(translationUnit, funDef, document);
+ tc.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
+ tc.setPosition(tc.position() + 1, QTextCursor::KeepAnchor);
+ cursors.append(tc);
+ }
+ }
+ }
+
+ return cursors;
+}
+
+static QStringList collectFields(ClassSpecifierAST *classAST)
+{
+ QStringList fields;
+ Overview oo;
+ Class *clazz = classAST->symbol;
+ for (unsigned i = 0; i < clazz->memberCount(); ++i) {
+ Symbol *s = clazz->memberAt(i);
+ if (Declaration *decl = s->asDeclaration()) {
+ FullySpecifiedType ty = decl->type();
+ if (ty->isPointerType())
+ fields.append(oo(decl->name()));
+ else if (ty.isUnsigned())
+ fields.append(oo(decl->name()));
+ }
+ }
+ return fields;
+}
+
+static QString createConstructor(ClassSpecifierAST *classAST)
+{
+ Overview oo;
+ Class *clazz = classAST->symbol;
+
+ QString result(QLatin1String(" "));
+ result.append(oo(clazz->name()));
+ result.append(QLatin1String("()\n"));
+
+ QStringList classFields = collectFields(classAST);
+ for (int i = 0; i < classFields.size(); ++i) {
+ if (i == 0) {
+ result.append(QLatin1String(" : "));
+ result.append(classFields.at(i));
+ result.append(QLatin1String("(0)\n"));
+ } else {
+ result.append(QLatin1String(" , "));
+ result.append(classFields.at(i));
+ result.append(QLatin1String("(0)\n"));
+ }
+ }
+
+ result.append(QLatin1String(" {}\n"));
+ return result;
+}
QStringList generateAST_H(const Snapshot &snapshot, const QDir &cplusplusDir)
{
@@ -802,6 +868,8 @@ QStringList generateAST_H(const Snapshot &snapshot, const QDir &cplusplusDir)
QList<QTextCursor> baseCastMethodCursors = removeCastMethods(astNodes.base);
QMap<ClassSpecifierAST *, QList<QTextCursor> > cursors;
QMap<ClassSpecifierAST *, QString> replacementCastMethods;
+ QMap<ClassSpecifierAST *, QList<QTextCursor> > constructors;
+ QMap<ClassSpecifierAST *, QString> replacementConstructors;
Overview oo;
@@ -812,8 +880,10 @@ QStringList generateAST_H(const Snapshot &snapshot, const QDir &cplusplusDir)
const QString methodName = QLatin1String("as") + className.mid(0, className.length() - 3);
replacementCastMethods[classAST] = QString(" virtual %1 *%2() { return this; }\n").arg(className, methodName);
castMethods.append(QString(" virtual %1 *%2() { return 0; }\n").arg(className, methodName));
-
astDerivedClasses.append(className);
+
+ constructors[classAST] = removeConstructors(classAST, AST_h_document->translationUnit(), &document);
+ replacementConstructors[classAST] = createConstructor(classAST);
}
if (! baseCastMethodCursors.isEmpty()) {
@@ -828,13 +898,23 @@ QStringList generateAST_H(const Snapshot &snapshot, const QDir &cplusplusDir)
for (int classIndex = 0; classIndex < astNodes.deriveds.size(); ++classIndex) {
ClassSpecifierAST *classAST = astNodes.deriveds.at(classIndex);
- // remove the cast methods.
- QList<QTextCursor> c = cursors.value(classAST);
- for (int i = 0; i < c.length(); ++i) {
- c[i].removeSelectedText();
+ { // remove the cast methods.
+ QList<QTextCursor> c = cursors.value(classAST);
+ for (int i = 0; i < c.length(); ++i) {
+ c[i].removeSelectedText();
+ }
+ }
+ { // remove the constructors.
+ QList<QTextCursor> c = constructors.value(classAST);
+ for (int i = 0; i < c.length(); ++i) {
+ c[i].removeSelectedText();
+ }
}
- astNodes.endOfPublicClassSpecifiers[classIndex].insertText(replacementCastMethods.value(classAST));
+ astNodes.endOfPublicClassSpecifiers[classIndex].insertText(
+ replacementConstructors.value(classAST) +
+ QLatin1String("\n") +
+ replacementCastMethods.value(classAST));
}
if (file.open(QFile::WriteOnly)) {