diff options
author | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-13 10:48:37 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-13 10:48:37 -0300 |
commit | 14e2207a58e79360bd48507b5e386ec944d8dd74 (patch) | |
tree | 2e903282fef303d610ebfb6b7913e9a0b5a84825 /ApiExtractor/doxygenparser.cpp | |
parent | 744d018dd857543f93f3961cf9e7f70adcc7ce65 (diff) |
Move ApiExtractor into ApiExtractor directory to ease the merge into Shiboken.
Diffstat (limited to 'ApiExtractor/doxygenparser.cpp')
-rw-r--r-- | ApiExtractor/doxygenparser.cpp | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/ApiExtractor/doxygenparser.cpp b/ApiExtractor/doxygenparser.cpp new file mode 100644 index 000000000..09cdd3865 --- /dev/null +++ b/ApiExtractor/doxygenparser.cpp @@ -0,0 +1,185 @@ +/* + * This file is part of the API Extractor 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 "doxygenparser.h" +#include "abstractmetalang.h" +#include "reporthandler.h" + +#include <QtXmlPatterns/QXmlQuery> + +namespace +{ + +QString getSectionKindAttr(const AbstractMetaFunction* func) +{ + if (func->isSignal()) { + return QLatin1String("signal"); + } else { + QString kind = func->isPublic() ? QLatin1String("public") : QLatin1String("protected"); + if (func->isStatic()) + kind += QLatin1String("-static"); + else if (func->isSlot()) + kind += QLatin1String("-slot"); + return kind; + } +} + +} + +Documentation DoxygenParser::retrieveModuleDocumentation() +{ + return retrieveModuleDocumentation(packageName()); +} + +void DoxygenParser::fillDocumentation(AbstractMetaClass* metaClass) +{ + if (!metaClass) + return; + + QString doxyFileSuffix; + if (metaClass->enclosingClass()) { + doxyFileSuffix += metaClass->enclosingClass()->name(); + doxyFileSuffix += "_1_1"; // FIXME: Check why _1_1!! + } + doxyFileSuffix += metaClass->name(); + doxyFileSuffix += ".xml"; + + const char* prefixes[] = { "class", "struct", "namespace" }; + const int numPrefixes = sizeof(prefixes) / sizeof(const char*); + bool isProperty = false; + + QString doxyFilePath; + for (int i = 0; i < numPrefixes; ++i) { + doxyFilePath = documentationDataDirectory() + "/" + prefixes[i] + doxyFileSuffix; + if (QFile::exists(doxyFilePath)) + break; + doxyFilePath.clear(); + } + + if (doxyFilePath.isEmpty()) { + ReportHandler::warning("Can't find doxygen file for class " + + metaClass->name() + ", tried: " + + documentationDataDirectory() + "/{struct|class|namespace}" + + doxyFileSuffix); + return; + } + QXmlQuery xquery; + xquery.setFocus(QUrl(doxyFilePath)); + + // Get class documentation + QString classDoc = getDocumentation(xquery, "/doxygen/compounddef/detaileddescription", + metaClass->typeEntry()->docModifications()); + if (classDoc.isEmpty()) { + ReportHandler::warning("Can't find documentation for class \"" + + metaClass->name() + "\"."); + } + metaClass->setDocumentation(classDoc); + + //Functions Documentation + AbstractMetaFunctionList funcs = metaClass->functionsInTargetLang(); + foreach (AbstractMetaFunction *func, funcs) { + if (!func || func->isPrivate()) + continue; + + QString query = "/doxygen/compounddef/sectiondef"; + // properties + if (func->isPropertyReader() || func->isPropertyWriter() + || func->isPropertyResetter()) { + query += "[@kind=\"property\"]/memberdef/name[text()=\"" + + func->propertySpec()->name() + "\"]"; + isProperty = true; + } else { // normal methods + QString kind = getSectionKindAttr(func); + query += "[@kind=\"" + kind + "-func\"]/memberdef/name[text()=\"" + + func->originalName() + "\"]"; + + if (func->arguments().isEmpty()) { + QString args = func->isConstant() ? "() const " : "()"; + query += "/../argsstring[text()=\"" + args + "\"]"; + } else { + int i = 1; + foreach (AbstractMetaArgument* arg, func->arguments()) { + QString type; + if (!arg->type()->isPrimitive()) { + query += "/../param[" + QString::number(i) + "]/type/ref[text()=\"" + + arg->type()->name() + "\"]/../.."; + } else { + query += "/../param[" + QString::number(i) + "]/type[text()=\"" + + arg->type()->name() + "\"]/.."; + } + ++i; + } + } + } + if (!isProperty) { + query += "/../detaileddescription"; + } else { + query = "(" + query; + query += "/../detaileddescription)[1]"; + } + QString doc = getDocumentation(xquery, query, DocModificationList()); + func->setDocumentation(doc); + isProperty = false; + } + + //Fields + AbstractMetaFieldList fields = metaClass->fields(); + foreach (AbstractMetaField *field, fields) { + if (field->isPrivate()) + return; + + QString query = "/doxygen/compounddef/sectiondef/memberdef/name[text()=\"" + + field->name() + "\"]/../detaileddescription"; + QString doc = getDocumentation(xquery, query, DocModificationList()); + field->setDocumentation(doc); + } + + //Enums + AbstractMetaEnumList enums = metaClass->enums(); + foreach (AbstractMetaEnum *meta_enum, enums) { + QString query = "/doxygen/compounddef/sectiondef/memberdef[@kind=\"enum\"]/name[text()=\"" + meta_enum->name() + "\"]/.."; + QString doc = getDocumentation(xquery, query, DocModificationList()); + meta_enum->setDocumentation(doc); + } + +} + +Documentation DoxygenParser::retrieveModuleDocumentation(const QString& name){ + + QString sourceFile = documentationDataDirectory() + '/' + "indexpage.xml"; + + if (!QFile::exists(sourceFile)) { + ReportHandler::warning("Can't find doxygen XML file for module " + + name + ", tried: " + + sourceFile); + return Documentation(); + } + + QXmlQuery xquery; + xquery.setFocus(QUrl(sourceFile)); + + // Module documentation + QString query = "/doxygen/compounddef/detaileddescription"; + return Documentation(getDocumentation(xquery, query, DocModificationList())); +} + |