Mercurial > projects > qtd
diff generator/dgenerator.h @ 1:e78566595089
initial import
author | mandel |
---|---|
date | Mon, 11 May 2009 16:01:50 +0000 |
parents | |
children | 3aa118a9ae71 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/generator/dgenerator.h Mon May 11 16:01:50 2009 +0000 @@ -0,0 +1,191 @@ +/**************************************************************************** +** +** 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. +** +****************************************************************************/ + +#ifndef DGENERATOR_H +#define DGENERATOR_H + +#include "generator.h" +#include "metajava.h" + +#include <QTextStream> + +class DocParser; + +class DGenerator : public Generator +{ + Q_OBJECT + +public: + DGenerator(); + + static QString translateType(const AbstractMetaType *d_type, const AbstractMetaClass *context, Option option = NoOption); + + void writeInjectedCode(QTextStream &s, + const AbstractMetaFunction *d_function, + CodeSnip::Position position); + static void writeArgument(QTextStream &s, + const AbstractMetaFunction *d_function, + const AbstractMetaArgument *d_argument, + uint options = 0); + static QString argumentString(const AbstractMetaFunction *d_function, + const AbstractMetaArgument *d_argument, + uint options = 0); + void writeEnum(QTextStream &s, const AbstractMetaEnum *d_enum); + void writeIntegerEnum(QTextStream &s, const AbstractMetaEnum *d_enum); + void writeSignal(QTextStream &s, const AbstractMetaFunction *d_function); + void writeFunction(QTextStream &s, const AbstractMetaFunction *d_function, + uint included_attributes = 0, uint excluded_attributes = 0); + void writeFieldAccessors(QTextStream &s, const AbstractMetaField *field); + void writeNativeField(QTextStream &s, const AbstractMetaField *field); + + void write(QTextStream &s, const AbstractMetaClass *d_class); + + void writeFunctionOverloads(QTextStream &s, const AbstractMetaFunction *d_function, + uint included_attributes, uint excluded_attributes); + void writeEnumOverload(QTextStream &s, const AbstractMetaFunction *d_function, + uint include_attributes, uint exclude_attributes); + void writeExtraFunctions(QTextStream &s, const AbstractMetaClass *d_class); + void writeToStringFunction(QTextStream &s, const AbstractMetaClass *d_class); + void writeCloneFunction(QTextStream &s, const AbstractMetaClass *d_class); + void writeFunctionAttributes(QTextStream &s, const AbstractMetaFunction *d_function, + uint included_attributes = 0, uint excluded_attributes = 0, + uint options = 0); + void writeConstructorContents(QTextStream &s, const AbstractMetaFunction *d_function); + void writeFunctionArguments(QTextStream &s, const AbstractMetaFunction *d_function, + int count = -1, uint options = 0); + void writeJavaCallThroughContents(QTextStream &s, const AbstractMetaFunction *d_function, uint attributes = 0); + void writeOwnershipForContainer(QTextStream &s, TypeSystem::Ownership ownership, AbstractMetaArgument *arg); + void writeOwnershipForContainer(QTextStream &s, TypeSystem::Ownership ownership, AbstractMetaType *type, + const QString &arg_name); + void writePrivateNativeFunction(QTextStream &s, const AbstractMetaFunction *d_function); + void writeJavaLangObjectOverrideFunctions(QTextStream &s, const AbstractMetaClass *cls); + void writeReferenceCount(QTextStream &s, const ReferenceCount &refCount, const QString &argumentName); + void retrieveModifications(const AbstractMetaFunction *f, const AbstractMetaClass *d_class, + uint *exclude_attributes, uint *include_attributes) const; + QString functionSignature(const AbstractMetaFunction *d_function, + uint included_attributes, + uint excluded_attributes, + Option option = NoOption, + int arg_count = -1); + void setupForFunction(const AbstractMetaFunction *d_function, + uint *included_attributes, uint *excluded_attributes) const; + + virtual QString subDirectoryForClass(const AbstractMetaClass *d_class) const + { return subDirectoryForPackage(d_class->package()); } + + virtual QString fileNameForClass(const AbstractMetaClass *d_class) const; + + bool isComparable(const AbstractMetaClass *cls) const; + +#if 0 + void write1_dot_5_enum(QTextStream &s, const AbstractMetaEnum *d_enum); +#endif + + bool shouldGenerate(const AbstractMetaClass *d_class) const { + return !d_class->typeEntry()->isContainer() && !d_class->typeEntry()->isVariant() + && (d_class->typeEntry()->codeGeneration() & TypeEntry::GenerateTargetLang); + } + + QString documentationDirectory() const { return m_doc_directory; } + void setDocumentationDirectory(const QString &docDir) { m_doc_directory = docDir; } + + bool documentationEnabled() const { return m_docs_enabled; } + void setDocumentationEnabled(bool e) { m_docs_enabled = e; } + void generate(); + + inline bool nativeJumpTable() const { return m_native_jump_table; } + inline void setNativeJumpTable(bool n) { m_native_jump_table = n; } + + void writeShellVirtualFunction(QTextStream &s, const AbstractMetaFunction *function, + const AbstractMetaClass *implementor, int id); + void marshallFromCppToD(QTextStream &s, const ComplexTypeEntry* ctype); + +private: + QString subDirectoryForPackage(const QString &package) const { return QString(package).replace(".", "/"); } + void writeInstantiatedType(QTextStream &s, const AbstractMetaType *abstractMetaType) const; + + // qtd + void addTypeEntry(const AbstractMetaClass *d_class, const AbstractMetaFunction *function, QSet<const TypeEntry*> &typeEntries); + void fillRequiredImports(const AbstractMetaClass *d_class); + void addInstantiations(const AbstractMetaType* d_type); + void writeRequiredImports(QTextStream &s, const AbstractMetaClass *d_class); + const TypeEntry* fixedTypeEntry(const TypeEntry *type); + + void writeDestructor(QTextStream &s, const AbstractMetaClass *d_class); + void writeOwnershipMethods(QTextStream &s, const AbstractMetaClass *d_class); + void writeSignalHandlers(QTextStream &s, const AbstractMetaClass *d_class); + void writeEnumAlias(QTextStream &s, const AbstractMetaEnum *d_enum); + void writeSignalConnectors(QTextStream &s, const AbstractMetaClass *d_class, AbstractMetaFunctionList signal_funcs); +// void writeMarshallFunction(QTextStream &s, const AbstractMetaClass *d_class); + + int m_recursive; + bool m_isRecursive; + QSet<const TypeEntry*> typeEntries; // imports + QSet<const TypeEntry*> typeEntriesEnums; // imports for enums + QSet<QString> excludedTypes2; + +protected: + void writeImportString(QTextStream &s, const TypeEntry* typeEntry); + + QSet<QString> excludedTypes; + QString m_package_name; + QString m_doc_directory; + DocParser *m_doc_parser; + bool m_docs_enabled; + bool m_native_jump_table; + QList<const AbstractMetaFunction *> m_nativepointer_functions; + QList<const AbstractMetaFunction *> m_resettable_object_functions; + QList<const AbstractMetaFunction *> m_reference_count_candidate_functions; +}; + +class ClassFromEntry : Generator +{ + Q_OBJECT + +private: + ClassFromEntry(); + QHash<const TypeEntry *, AbstractMetaClass *> classFromEntry; + static ClassFromEntry* m_instance; + +public: + static AbstractMetaClass* get(const TypeEntry *te); +}; +#endif // DGENERATOR_H