diff options
Diffstat (limited to 'generators/qtdoc')
-rw-r--r-- | generators/qtdoc/CMakeLists.txt | 5 | ||||
-rw-r--r-- | generators/qtdoc/main.cpp | 34 | ||||
-rw-r--r-- | generators/qtdoc/qtdocgenerator.cpp | 61 | ||||
-rw-r--r-- | generators/qtdoc/qtdocgenerator.h | 1 |
4 files changed, 96 insertions, 5 deletions
diff --git a/generators/qtdoc/CMakeLists.txt b/generators/qtdoc/CMakeLists.txt index fb71784ab..804600e58 100644 --- a/generators/qtdoc/CMakeLists.txt +++ b/generators/qtdoc/CMakeLists.txt @@ -4,7 +4,12 @@ set(qtdoc_generator_SRC qtdocgenerator.cpp ) +add_executable(docgenerator main.cpp) +target_link_libraries(docgenerator ${QT_QTCORE_LIBRARY}) + add_library(qtdoc_generator SHARED ${qtdoc_generator_SRC}) target_link_libraries(qtdoc_generator ${APIEXTRACTOR_LIBRARY} ${QT_QTCORE_LIBRARY} genrunner) install(TARGETS qtdoc_generator DESTINATION ${LIB_INSTALL_DIR}) +install(TARGETS docgenerator DESTINATION bin) + diff --git a/generators/qtdoc/main.cpp b/generators/qtdoc/main.cpp new file mode 100644 index 000000000..c513147d3 --- /dev/null +++ b/generators/qtdoc/main.cpp @@ -0,0 +1,34 @@ +/* + * This file is part of the Boost Python Generator project. + * + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + * + * Contact: PySide team <contact@pyside.org> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + */ + +#include <QtCore> + +int main(int argc, char *argv[]) +{ + QStringList args; + args.append("--generatorSet=qtdoc"); + for (int i = 1; i < argc; i++) + args.append(argv[i]); + return QProcess::execute("generatorrunner", args); +} + diff --git a/generators/qtdoc/qtdocgenerator.cpp b/generators/qtdoc/qtdocgenerator.cpp index 4070ddefc..a5a1a5243 100644 --- a/generators/qtdoc/qtdocgenerator.cpp +++ b/generators/qtdoc/qtdocgenerator.cpp @@ -129,6 +129,38 @@ QString QtXmlToSphinx::popOutputBuffer() return strcpy; } +QString QtXmlToSphinx::resolveContextForMethod(const QString& methodName) +{ + QString currentClass = m_context.split(".").last(); + + const AbstractMetaClass* metaClass = 0; + foreach (const AbstractMetaClass* cls, m_generator->classes()) { + if (cls->name() == currentClass) { + metaClass = cls; + break; + } + } + + if (metaClass) { + QList<const AbstractMetaFunction*> funcList; + foreach (const AbstractMetaFunction* func, metaClass->queryFunctionsByName(methodName)) { + if (methodName == func->name()) + funcList.append(func); + } + + const AbstractMetaClass* implementingClass = 0; + foreach (const AbstractMetaFunction* func, funcList) { + implementingClass = func->implementingClass(); + if (implementingClass->name() == currentClass) + break; + } + + if (implementingClass) + return implementingClass->name(); + } + + return QLatin1String("~") + m_context; +} QString QtXmlToSphinx::transform(const QString& doc) { @@ -484,12 +516,20 @@ void QtXmlToSphinx::handleLinkTag(QXmlStreamReader& reader) if (l_type == "function" && !m_context.isEmpty()) { l_linktag = " :meth:`"; QStringList rawlinklist = l_linkref.split("."); - if (rawlinklist.size() == 1 || rawlinklist[0] == m_context) - l_linkref.prepend("~" + m_context + '.'); + if (rawlinklist.size() == 1 || rawlinklist.first() == m_context) { + QString context = resolveContextForMethod(rawlinklist.last()); + l_linkref.prepend(context + '.'); + } } else if (l_type == "function" && m_context.isEmpty()) { l_linktag = " :func:`"; } else if (l_type == "class") { l_linktag = " :class:`"; + QStringList rawlinklist = l_linkref.split("."); + QStringList splittedContext = m_context.split("."); + if (rawlinklist.size() == 1 || rawlinklist.first() == splittedContext.last()) { + splittedContext.removeLast(); + l_linkref.prepend('~' + splittedContext.join(".") + '.'); + } } else if (l_type == "enum") { l_linktag = " :attr:`"; } else if (l_type == "page" && l_linkref == m_generator->moduleName()) { @@ -762,7 +802,7 @@ QTextStream& operator<<(QTextStream& s, const QtXmlToSphinx::Table &table) } static QString getClassName(const AbstractMetaClass *cppClass) { - return cppClass->name().replace("::", "."); + return QString(cppClass->typeEntry()->qualifiedCppName()).replace("::", "."); } static QString getFuncName(const AbstractMetaFunction *cppFunc) { @@ -913,9 +953,18 @@ QString QtDocGenerator::parseFunctionDeclaration(const QString &doc, const Abstr QString methName = data.mid(0, data.indexOf("(")); QString methArgs = data.mid(data.indexOf("(")); - data = QString("def :meth:`%1<%2.%3>` %4") + QString scope = cppClass->name(); + QStringList splittedMethName = methName.split("."); + + if (splittedMethName.first() == scope) { + splittedMethName.removeFirst(); + methName = splittedMethName.join("."); + } + scope.append("."); + + data = QString("def :meth:`%1<%2%3>` %4") .arg(methName) - .arg(cppClass->name()) + .arg(scope) .arg(methName) .arg(methArgs); @@ -1183,6 +1232,8 @@ void QtDocGenerator::writeFunctionSignature(QTextStream& s, const AbstractMetaCl { if (!func->isConstructor()) s << getClassName(cppClass) << '.'; + else if (func->implementingClass() && func->implementingClass()->enclosingClass()) + s << func->implementingClass()->enclosingClass()->name() << '.'; s << getFuncName(func) << "(" << parseArgDocStyle(cppClass, func) << ")"; } diff --git a/generators/qtdoc/qtdocgenerator.h b/generators/qtdoc/qtdocgenerator.h index 8174a971e..8f39e72c8 100644 --- a/generators/qtdoc/qtdocgenerator.h +++ b/generators/qtdoc/qtdocgenerator.h @@ -90,6 +90,7 @@ public: } private: + QString resolveContextForMethod(const QString& methodName); QString transform(const QString& doc); void handleHeadingTag(QXmlStreamReader& reader); |