From 9732e0c744e45a67094fc6ce08bdadb1f9a08d4a Mon Sep 17 00:00:00 2001 From: Hugo Lima Date: Mon, 17 Aug 2009 17:32:08 -0300 Subject: The genesis... --- doxygenparser.cpp | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 doxygenparser.cpp (limited to 'doxygenparser.cpp') diff --git a/doxygenparser.cpp b/doxygenparser.cpp new file mode 100644 index 000000000..ccf14a916 --- /dev/null +++ b/doxygenparser.cpp @@ -0,0 +1,151 @@ +/* + * This file is part of the API Extractor project. + * + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + * + * Contact: PySide team + * + * 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 + +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; + } +} + +} + +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); + + 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() + "\"]"; + } 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; + } + } + } + query += "/../detaileddescription"; + QString doc = getDocumentation(xquery, query, DocModificationList()); + func->setDocumentation(doc); + } + + //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() + "\"]/../detaileddescription"; + QString doc = getDocumentation(xquery, query, DocModificationList()); + meta_enum->setDocumentation(doc); + } +} -- cgit v1.2.3