Mercurial > projects > qtd
diff generator/generatorsetd.cpp @ 1:e78566595089
initial import
author | mandel |
---|---|
date | Mon, 11 May 2009 16:01:50 +0000 |
parents | |
children | 136c9ee83ee5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/generator/generatorsetd.cpp Mon May 11 16:01:50 2009 +0000 @@ -0,0 +1,340 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Nokia. All rights reserved. +** +** This file is part of Qt Jambi. +** +** * Commercial Usage +* Licensees holding valid Qt Commercial licenses may use this file in +* accordance with the Qt Commercial License Agreement provided with the +* Software or, alternatively, in accordance with the terms contained in +* a written agreement between you and Nokia. +* +* +* GNU General Public License Usage +* Alternatively, this file may be used under the terms of the GNU +* General Public License versions 2.0 or 3.0 as published by the Free +* Software Foundation and appearing in the file LICENSE.GPL included in +* the packaging of this file. Please review the following information +* to ensure GNU General Public Licensing requirements will be met: +* http://www.fsf.org/licensing/licenses/info/GPLv2.html and +* http://www.gnu.org/copyleft/gpl.html. In addition, as a special +* exception, Nokia gives you certain additional rights. These rights +* are described in the Nokia Qt GPL Exception version 1.2, included in +* the file GPL_EXCEPTION.txt in this package. +* +* Qt for Windows(R) Licensees +* As a special exception, Nokia, as the sole copyright holder for Qt +* Designer, grants users of the Qt/Eclipse Integration plug-in the +* right for the Qt/Eclipse Integration to link to functionality +* provided by Qt Designer and its related libraries. +* +* +* If you are unsure which license is appropriate for your use, please +* contact the sales department at qt-sales@nokia.com. + +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#include "generatorsetd.h" +#include "reporthandler.h" + +#include "dgenerator.h" +#include "cppheadergenerator.h" +#include "cppimplgenerator.h" +#include "metainfogenerator.h" +#include "classlistgenerator.h" +#include "containergenerator.h" +#include "qdocgenerator.h" +#include "uiconverter.h" +#include "jumptable.h" + +#include <QFileInfo> + +GeneratorSet *GeneratorSet::getInstance() { + return new GeneratorSetD(); +} + +void dumpMetaDTree(const AbstractMetaClassList &classes); + +GeneratorSetD::GeneratorSetD() : + no_d(false), + no_cpp_h(false), + no_cpp_impl(false), + no_metainfo(false), + build_class_list(false), + build_qdoc_japi(false), + docs_enabled(false), + do_ui_convert(false), + native_jump_table(false), + doc_dir("../../main/doc/jdoc") +{} + +QString GeneratorSetD::usage() { + QString usage = + " --no-d \n" + " --no-metainfo \n" + " --no-cpp-h \n" + " --no-cpp-impl \n" + " --convert-to-jui=[.ui-file name] \n" + " --custom-widgets=[file names] \n"; + + return usage; +} + +bool GeneratorSetD::readParameters(const QMap<QString, QString> args) { + no_d = args.contains("no-d"); + no_cpp_h = args.contains("no-cpp-h"); + no_cpp_impl = args.contains("no-cpp-impl"); + no_metainfo = args.contains("no-metainfo"); + build_class_list = args.contains("build-class-list"); + native_jump_table = args.contains("native-jump-table"); + + if (args.contains("build-qdoc-japi")) { + no_d = true; + no_cpp_h = true; + no_cpp_impl = true; + no_metainfo = true; + build_qdoc_japi = true; + } + + if (args.contains("jdoc-dir")) { + doc_dir = args.value("jdoc-dir"); + } + + docs_enabled = args.contains("jdoc-enabled"); + + if (args.contains("custom-widgets")) + custom_widgets = args.value("custom-widgets"); + + if (args.contains("convert-to-jui")) { + ui_file_name = args.value("convert-to-jui"); + do_ui_convert = true; + + if (!QFileInfo(ui_file_name).exists()) { + printf(".ui file '%s' does not exist\n", qPrintable(ui_file_name)); + return false; + } + } + return GeneratorSet::readParameters(args); +} + +void GeneratorSetD::buildModel(const QString pp_file) { + // Building the code inforamation... + builder.setFileName(pp_file); + builder.build(); +} + +void GeneratorSetD::dumpObjectTree() { + dumpMetaDTree(builder.classes()); +} + +QString GeneratorSetD::generate() { + + // Ui conversion... + if (do_ui_convert) { + UiConverter converter; + converter.setClasses(builder.classes()); + converter.convertToJui(ui_file_name, custom_widgets); + return 0; + } else if (!custom_widgets.isEmpty()) { + fprintf(stderr, "NOTE: The --custom-widgets option only has an effect when used with --convert-to-jui"); + } + + // Code generation + QList<Generator *> generators; + PriGenerator *priGenerator = new PriGenerator; + ContainerGenerator *cointainerGenerator = new ContainerGenerator; + DGenerator *d_generator = 0; + CppHeaderGenerator *cpp_header_generator = 0; + CppImplGenerator *cpp_impl_generator = 0; + MetaInfoGenerator *metainfo = 0; + JumpTablePreprocessor *jumpTablePreprocessor = 0; + JumpTableGenerator *jumpTableGenerator = 0; + + QStringList contexts; + if (build_qdoc_japi) { + generators << new QDocGenerator; + contexts << "QDocGenerator"; + } + + if (native_jump_table) { + jumpTablePreprocessor = new JumpTablePreprocessor(); + generators << jumpTablePreprocessor; + contexts << "JumpTablePreprocessor"; + } + + if (!no_d) { + d_generator = new DGenerator; + d_generator->setDocumentationDirectory(doc_dir); + d_generator->setDocumentationEnabled(docs_enabled); + d_generator->setNativeJumpTable(native_jump_table); + generators << d_generator; + + contexts << "JavaGenerator"; + } + + if (!no_cpp_h) { + cpp_header_generator = new CppHeaderGenerator(priGenerator); + generators << cpp_header_generator; + contexts << "CppHeaderGenerator"; + } + + if (!no_cpp_impl) { + cpp_impl_generator = new CppImplGenerator(priGenerator); + cpp_impl_generator->setNativeJumpTable(native_jump_table); + generators << cpp_impl_generator; + contexts << "CppImplGenerator"; + } + + if (native_jump_table) { + jumpTableGenerator = new JumpTableGenerator(jumpTablePreprocessor, priGenerator); + generators << jumpTableGenerator; + contexts << "JumpTableGenerator"; + } + + if (!no_metainfo) { + metainfo = new MetaInfoGenerator(priGenerator); + generators << metainfo; + contexts << "MetaInfoGenerator"; + } + + if (build_class_list) { + generators << new ClassListGenerator; + contexts << "ClassListGenerator"; + } + + generators << priGenerator; + contexts << "PriGenerator"; + + generators << cointainerGenerator; + contexts << "cointainerGenerator"; + + for (int i=0; i<generators.size(); ++i) { + Generator *generator = generators.at(i); + ReportHandler::setContext(contexts.at(i)); + + generator->setOutputDirectory(outDir); + generator->setClasses(builder.classes()); + if (printStdout) + generator->printClasses(); + else + generator->generate(); + } + + QString res; + res = QString("Classes in typesystem: %1\n" + "Generated:\n" + " - d.........: %2 (%3)\n" + " - cpp-impl..: %4 (%5)\n" + " - cpp-h.....: %6 (%7)\n" + " - meta-info.: %8 (%9)\n" + " - pri.......: %10 (%11)\n" + ) + .arg(builder.classes().size()) + .arg(d_generator ? d_generator->numGenerated() : 0) + .arg(d_generator ? d_generator->numGeneratedAndWritten() : 0) + .arg(cpp_impl_generator ? cpp_impl_generator->numGenerated() : 0) + .arg(cpp_impl_generator ? cpp_impl_generator->numGeneratedAndWritten() : 0) + .arg(cpp_header_generator ? cpp_header_generator->numGenerated() : 0) + .arg(cpp_header_generator ? cpp_header_generator->numGeneratedAndWritten() : 0) + .arg(metainfo ? metainfo->numGenerated() : 0) + .arg(metainfo ? metainfo->numGeneratedAndWritten() : 0) + .arg(priGenerator->numGenerated()) + .arg(priGenerator->numGeneratedAndWritten()); + + return res; +} + +void dumpMetaDAttributes(const AbstractMetaAttributes *attr) +{ + if (attr->isNative()) printf(" native"); + if (attr->isAbstract()) printf(" abstract"); + if (attr->isFinalInTargetLang()) printf(" final(d)"); + if (attr->isFinalInCpp()) printf(" final(cpp)"); + if (attr->isStatic()) printf(" static"); + if (attr->isPrivate()) printf(" private"); + if (attr->isProtected()) printf(" protected"); + if (attr->isPublic()) printf(" public"); + if (attr->isFriendly()) printf(" friendly"); +} + +void dumpMetaDType(const AbstractMetaType *type) +{ + if (!type) { + printf("[void]"); + } else { + printf("[type: %s", qPrintable(type->typeEntry()->qualifiedCppName())); + if (type->isReference()) printf(" &"); + int indirections = type->indirections(); + if (indirections) printf(" %s", qPrintable(QString(indirections, '*'))); + + printf(", %s", qPrintable(type->typeEntry()->qualifiedTargetLangName())); + + if (type->isPrimitive()) printf(" primitive"); + if (type->isEnum()) printf(" enum"); + if (type->isQObject()) printf(" q_obj"); + if (type->isNativePointer()) printf(" n_ptr"); + if (type->isTargetLangString()) printf(" d_string"); + if (type->isConstant()) printf(" const"); + printf("]"); + } +} + +void dumpMetaDArgument(const AbstractMetaArgument *arg) +{ + printf(" "); + dumpMetaDType(arg->type()); + printf(" %s", qPrintable(arg->argumentName())); + if (!arg->defaultValueExpression().isEmpty()) + printf(" = %s", qPrintable(arg->defaultValueExpression())); + printf("\n"); +} + +void dumpMetaDFunction(const AbstractMetaFunction *func) +{ + printf(" %s() - ", qPrintable(func->name())); + dumpMetaDType(func->type()); + dumpMetaDAttributes(func); + if (func->isConstant()) printf(" const"); + printf("\n arguments:\n"); + foreach (AbstractMetaArgument *arg, func->arguments()) + dumpMetaDArgument(arg); +} + +void dumpMetaDClass(const AbstractMetaClass *cls) +{ + printf("\nclass: %s, package: %s\n", qPrintable(cls->name()), qPrintable(cls->package())); + if (cls->hasVirtualFunctions()) + printf(" shell based\n"); + printf(" baseclass: %s %s\n", qPrintable(cls->baseClassName()), cls->isQObject() ? "'QObject-type'" : "'not a QObject-type'"); + printf(" interfaces:"); + foreach (AbstractMetaClass *iface, cls->interfaces()) + printf(" %s", qPrintable(iface->name())); + printf("\n"); + printf(" attributes:"); + dumpMetaDAttributes(cls); + + printf("\n functions:\n"); + foreach (const AbstractMetaFunction *func, cls->functions()) + dumpMetaDFunction(func); + + // printf("\n fields:\n"); + // foreach (const AbstractMetaField *field, cls->fields()) + // dumpMetaJavaField(field); + + // printf("\n enums:\n"); + // foreach (const AbstractMetaEnum *e, cls->enums()) + // dumpMetaJavaEnum(e); +} + +void dumpMetaDTree(const AbstractMetaClassList &classes) +{ + foreach (AbstractMetaClass *cls, classes) { + dumpMetaDClass(cls); + } +} +