diff options
Diffstat (limited to 'src/qdoc/cppcodemarker.cpp')
-rw-r--r-- | src/qdoc/cppcodemarker.cpp | 687 |
1 files changed, 11 insertions, 676 deletions
diff --git a/src/qdoc/cppcodemarker.cpp b/src/qdoc/cppcodemarker.cpp index e1a5040dd..8b334736f 100644 --- a/src/qdoc/cppcodemarker.cpp +++ b/src/qdoc/cppcodemarker.cpp @@ -30,9 +30,7 @@ cppcodemarker.cpp */ -#include "atom.h" #include "cppcodemarker.h" -#include "node.h" #include "text.h" #include "tree.h" #include <qdebug.h> @@ -113,7 +111,7 @@ QString CppCodeMarker::markedUpCode(const QString &code, QString CppCodeMarker::markedUpSynopsis(const Node *node, const Node * /* relative */, - SynopsisStyle style) + Sections::Style style) { const int MaxEnumValues = 6; const FunctionNode *func; @@ -126,11 +124,11 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, QString name; name = taggedNode(node); - if (style != Detailed) + if (style != Sections::Detailed) name = linkTag(node, name); name = "<@name>" + name + "</@name>"; - if ((style == Detailed) && !node->parent()->name().isEmpty() && + if ((style == Sections::Detailed) && !node->parent()->name().isEmpty() && (node->type() != Node::Property) && !node->isQmlNode() && !node->isJsNode()) name.prepend(taggedNode(node->parent()) + "::"); @@ -147,7 +145,7 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, case Node::QmlMethod: func = (const FunctionNode *) node; - if (style != Subpage && !func->returnType().isEmpty()) + if (style != Sections::Subpage && !func->returnType().isEmpty()) synopsis = typified(func->returnType(), true); synopsis += name; if (!func->isMacroWithoutParams()) { @@ -161,9 +159,9 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, if (hasName) synopsis += typified((*p).dataType(), true); const QString ¶mName = hasName ? (*p).name() : (*p).dataType(); - if (style != Subpage || !hasName) + if (style != Sections::Subpage || !hasName) synopsis += "<@param>" + protect(paramName) + "</@param>"; - if (style != Subpage && !(*p).defaultValue().isEmpty()) + if (style != Sections::Subpage && !(*p).defaultValue().isEmpty()) synopsis += " = " + protect((*p).defaultValue()); ++p; } @@ -173,7 +171,7 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, if (func->isConst()) synopsis += " const"; - if (style == Summary || style == Accessors) { + if (style == Sections::Summary || style == Sections::Accessors) { if (!func->isNonvirtual()) synopsis.prepend("virtual "); if (func->isFinal()) @@ -191,7 +189,7 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, else if (func->isRefRef()) synopsis.append(" &&"); } - else if (style == Subpage) { + else if (style == Sections::Subpage) { if (!func->returnType().isEmpty() && func->returnType() != "void") synopsis += " : " + typified(func->returnType()); } @@ -239,7 +237,7 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, case Node::Enum: enume = static_cast<const EnumNode *>(node); synopsis = "enum " + name; - if (style == Summary) { + if (style == Sections::Summary) { synopsis += " { "; QStringList documentedItems = enume->doc().enumItemNames(); @@ -290,7 +288,7 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, break; case Node::Variable: variable = static_cast<const VariableNode *>(node); - if (style == Subpage) { + if (style == Sections::Subpage) { synopsis = name + " : " + typified(variable->dataType()); } else { @@ -302,7 +300,7 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, synopsis = name; } - if (style == Summary) { + if (style == Sections::Summary) { if (node->status() == Node::Preliminary) { extra += "(preliminary) "; } @@ -455,434 +453,6 @@ QString CppCodeMarker::functionEndRegExp(const QString& /* funcName */) return "^\\}$"; } -QList<Section> CppCodeMarker::sections(const Aggregate *aggregate, - SynopsisStyle style, - Status status) -{ - QList<Section> sections; - - bool documentAll = true; - if (aggregate->isClass()) { - if (aggregate->parent() && !aggregate->name().isEmpty() && !aggregate->hasDoc()) - documentAll = false; - if (style == Summary) { - FastSection privateFunctions(aggregate, - "Private Functions", - QString(), - "private function", - "private functions"); - FastSection privateSlots(aggregate, "Private Slots", QString(), "private slot", "private slots"); - FastSection privateTypes(aggregate, "Private Types", QString(), "private type", "private types"); - FastSection protectedFunctions(aggregate, - "Protected Functions", - QString(), - "protected function", - "protected functions"); - FastSection protectedSlots(aggregate, - "Protected Slots", - QString(), - "protected slot", - "protected slots"); - FastSection protectedTypes(aggregate, - "Protected Types", - QString(), - "protected type", - "protected types"); - FastSection protectedVariables(aggregate, - "Protected Variables", - QString(), - "protected type", - "protected variables"); - FastSection publicFunctions(aggregate, - "Public Functions", - QString(), - "public function", - "public functions"); - FastSection publicSignals(aggregate, "Signals", QString(), "signal", "signals"); - FastSection publicSlots(aggregate, "Public Slots", QString(), "public slot", "public slots"); - FastSection publicTypes(aggregate, "Public Types", QString(), "public type", "public types"); - FastSection publicVariables(aggregate, - "Public Variables", - QString(), - "public variable", - "public variables"); - FastSection properties(aggregate, "Properties", QString(), "property", "properties"); - FastSection relatedNonMembers(aggregate, - "Related Non-Members", - QString(), - "related non-member", - "related non-members"); - FastSection staticPrivateMembers(aggregate, - "Static Private Members", - QString(), - "static private member", - "static private members"); - FastSection staticProtectedMembers(aggregate, - "Static Protected Members", - QString(), - "static protected member", - "static protected members"); - FastSection staticPublicMembers(aggregate, - "Static Public Members", - QString(), - "static public member", - "static public members"); - FastSection macros(aggregate, "Macros", QString(), "macro", "macros"); - - NodeList::ConstIterator r = aggregate->relatedNodes().constBegin(); - while (r != aggregate->relatedNodes().constEnd()) { - if ((*r)->isFunction()) { - FunctionNode *func = static_cast<FunctionNode *>(*r); - if (func->isMacro()) - insert(macros, *r, style, status); - else - insert(relatedNonMembers, *r, style, status); - } - else { - insert(relatedNonMembers, *r, style, status); - } - ++r; - } - - QStack<const Aggregate *> stack; - stack.push(aggregate); - while (!stack.isEmpty()) { - const Aggregate* ancestor = stack.pop(); - - NodeList::ConstIterator c = ancestor->childNodes().constBegin(); - while (c != ancestor->childNodes().constEnd()) { - if (!documentAll && !(*c)->hasDoc()) { - ++c; - continue; - } - bool isSlot = false; - bool isSignal = false; - bool isStatic = false; - if ((*c)->isFunction()) { - const FunctionNode *func = (const FunctionNode *) *c; - isSlot = (func->isSlot()); - isSignal = (func->isSignal()); - isStatic = func->isStatic(); - if (func->hasAssociatedProperties() && !func->hasActiveAssociatedProperty()) { - ++c; - continue; - } - else if (func->isIgnored()) { - ++c; - continue; - } - } - else if ((*c)->isVariable()) { - const VariableNode *var = static_cast<const VariableNode *>(*c); - isStatic = var->isStatic(); - } - else if ((*c)->isTypedef()) { - if ((*c)->name() == QLatin1String("QtGadgetHelper")) { - ++c; - continue; - } - } - - switch ((*c)->access()) { - case Node::Public: - if (isSlot) { - insert(publicSlots, *c, style, status); - } - else if (isSignal) { - insert(publicSignals, *c, style, status); - } - else if (isStatic) { - if ((*c)->type() != Node::Variable || !(*c)->doc().isEmpty()) - insert(staticPublicMembers,*c,style,status); - } - else if ((*c)->type() == Node::Property) { - insert(properties, *c, style, status); - } - else if ((*c)->type() == Node::Variable) { - if (!(*c)->doc().isEmpty()) - insert(publicVariables, *c, style, status); - } - else if ((*c)->type() == Node::Function) { - if (!insertReimpFunc(publicFunctions,*c,status)) { - insert(publicFunctions, *c, style, status); - } - } - else if ((*c)->type() != Node::SharedComment) { - insert(publicTypes, *c, style, status); - } - break; - case Node::Protected: - if (isSlot) { - insert(protectedSlots, *c, style, status); - } - else if (isStatic) { - if ((*c)->type() != Node::Variable || !(*c)->doc().isEmpty()) - insert(staticProtectedMembers,*c,style,status); - } - else if ((*c)->type() == Node::Variable) { - if (!(*c)->doc().isEmpty()) - insert(protectedVariables,*c,style,status); - } - else if ((*c)->type() == Node::Function) { - if (!insertReimpFunc(protectedFunctions,*c,status)) { - insert(protectedFunctions, *c, style, status); - } - } - else { - insert(protectedTypes, *c, style, status); - } - break; - case Node::Private: - if (isSlot) { - insert(privateSlots, *c, style, status); - } - else if (isStatic) { - if ((*c)->type() != Node::Variable || !(*c)->doc().isEmpty()) - insert(staticPrivateMembers,*c,style,status); - } - else if ((*c)->type() == Node::Function) { - if (!insertReimpFunc(privateFunctions,*c,status)) { - insert(privateFunctions, *c, style, status); - } - } - else { - insert(privateTypes,*c,style,status); - } - } - ++c; - } - - if (ancestor->isClass()) { - const ClassNode* cn = static_cast<const ClassNode*>(ancestor); - QList<RelatedClass>::ConstIterator r = cn->baseClasses().constBegin(); - while (r != cn->baseClasses().constEnd()) { - if ((*r).node_) - stack.prepend((*r).node_); - ++r; - } - } - } - append(sections, publicTypes); - append(sections, properties); - append(sections, publicFunctions); - append(sections, publicSlots); - append(sections, publicSignals); - append(sections, publicVariables); - append(sections, staticPublicMembers); - append(sections, protectedTypes); - append(sections, protectedFunctions); - append(sections, protectedSlots); - append(sections, protectedVariables); - append(sections, staticProtectedMembers); - append(sections, privateTypes); - append(sections, privateFunctions); - append(sections, privateSlots); - append(sections, staticPrivateMembers); - append(sections, relatedNonMembers); - append(sections, macros); - } - else if (style == Detailed) { - FastSection memberFunctions(aggregate,"Member Function Documentation","func","member","members"); - FastSection memberTypes(aggregate,"Member Type Documentation","types","member","members"); - FastSection memberVariables(aggregate,"Member Variable Documentation","vars","member","members"); - FastSection properties(aggregate,"Property Documentation","prop","member","members"); - FastSection relatedNonMembers(aggregate,"Related Non-Members","relnonmem","member","members"); - FastSection macros(aggregate,"Macro Documentation","macros","member","members"); - - NodeList::ConstIterator r = aggregate->relatedNodes().constBegin(); - while (r != aggregate->relatedNodes().constEnd()) { - if ((*r)->isFunction()) { - FunctionNode *func = static_cast<FunctionNode *>(*r); - if (func->isMacro()) - insert(macros, *r, style, status); - else if (!func->isSharingComment()) - insert(relatedNonMembers, *r, style, status); - } - else { - insert(relatedNonMembers, *r, style, status); - } - ++r; - } - - NodeList::ConstIterator c = aggregate->childNodes().constBegin(); - while (c != aggregate->childNodes().constEnd()) { - if ((*c)->isSharingComment()) { - // do nothing - } else if (!documentAll && !(*c)->hasDoc()) { - ++c; - continue; - } else if ((*c)->isEnumType() || (*c)->isTypedef()) { - if ((*c)->name() == QLatin1String("QtGadgetHelper")) { - ++c; - continue; - } - insert(memberTypes, *c, style, status); - } else if ((*c)->isProperty()) { - insert(properties, *c, style, status); - } else if ((*c)->isVariable()) { - if (!(*c)->doc().isEmpty()) - insert(memberVariables, *c, style, status); - } else if ((*c)->isFunction()) { - FunctionNode *function = static_cast<FunctionNode *>(*c); - if (function->isIgnored()) { - ++c; - continue; - } - if (!function->isSharingComment()) { - if (!function->hasAssociatedProperties() || !function->doc().isEmpty()) - insert(memberFunctions, function, style, status); - } - } else if ((*c)->isSharedCommentNode()) { - SharedCommentNode *scn = static_cast<SharedCommentNode *>(*c); - if (!scn->doc().isEmpty()) - insert(memberFunctions, scn, style, status); - } - ++c; - } - - append(sections, memberTypes); - append(sections, properties); - append(sections, memberFunctions); - append(sections, memberVariables); - append(sections, relatedNonMembers); - append(sections, macros); - } - else { - FastSection all(aggregate,QString(),QString(),"member","members"); - - QStack<const Aggregate*> stack; - stack.push(aggregate); - - while (!stack.isEmpty()) { - const Aggregate* ancestor = stack.pop(); - NodeList::ConstIterator c = ancestor->childNodes().constBegin(); - while (c != ancestor->childNodes().constEnd()) { - if ((*c)->access() != Node::Private && (*c)->type() != Node::Property) - insert(all, *c, style, status); - ++c; - } - - if (ancestor->isClass()) { - const ClassNode* cn = static_cast<const ClassNode*>(ancestor); - QList<RelatedClass>::ConstIterator r = cn->baseClasses().constBegin(); - while (r != cn->baseClasses().constEnd()) { - if ((*r).node_) - stack.prepend((*r).node_); - ++r; - } - } - } - append(sections, all); - } - } else if (style == Summary || style == Detailed) { - FastSection namespaces(aggregate, - "Namespaces", - style == Detailed ? "nmspace" : QString(), - "namespace", - "namespaces"); - FastSection classes(aggregate, - "Classes", - style == Detailed ? "classes" : QString(), - "class", - "classes"); - FastSection types(aggregate, - style == Summary ? "Types" : "Type Documentation", - style == Detailed ? "types" : QString(), - "type", - "types"); - FastSection variables(aggregate, - style == Summary ? "Variables" : "Variable Documentation", - style == Detailed ? "vars" : QString(), - "variable", - "variables"); - FastSection staticVariables(aggregate, - "Static Variables", - QString(), - "static variable", - "static variables"); - FastSection functions(aggregate, - style == Summary ? - "Functions" : "Function Documentation", - style == Detailed ? "func" : QString(), - "function", - "functions"); - FastSection macros(aggregate, - style == Summary ? - "Macros" : "Macro Documentation", - style == Detailed ? "macros" : QString(), - "macro", - "macros"); - - NodeList nodeList = aggregate->childNodes(); - nodeList += aggregate->relatedNodes(); - if (aggregate->isNamespace()) { - const NamespaceNode* ns = static_cast<const NamespaceNode*>(aggregate); - if (!ns->hasDoc()) - documentAll = false; - if (style == Summary) { - if (!ns->orphans().isEmpty()) - nodeList += ns->orphans(); - } - } - NodeList::ConstIterator n = nodeList.constBegin(); - while (n != nodeList.constEnd()) { - if (documentAll || (*n)->hasDoc()) { - switch ((*n)->type()) { - case Node::Namespace: - insert(namespaces, *n, style, status); - break; - case Node::Class: - insert(classes, *n, style, status); - break; - case Node::Enum: - case Node::Typedef: - insert(types, *n, style, status); - break; - case Node::Function: - { - FunctionNode *func = static_cast<FunctionNode *>(*n); - if (func->isMacro()) - insert(macros, *n, style, status); - else - insert(functions, *n, style, status); - } - break; - case Node::Variable: - { - const VariableNode* var = static_cast<const VariableNode*>(*n); - if (!var->doc().isEmpty()) { - if (var->isStatic()) - insert(staticVariables,*n,style,status); - else - insert(variables, *n, style, status); - } - } - break; - case Node::SharedComment: - { - SharedCommentNode *scn = static_cast<SharedCommentNode *>(*n); - if (!scn->doc().isEmpty()) - insert(functions, scn, style, status); - } - break; - default: - break; - } - } - ++n; - } - append(sections, namespaces); - append(sections, classes); - append(sections, types); - append(sections, variables); - append(sections, staticVariables); - append(sections, functions); - append(sections, macros); - } - - return sections; -} - /* @char @class @@ -1148,239 +718,4 @@ QString CppCodeMarker::addMarkUp(const QString &in, return out; } -/*! - This function is for documenting QML properties. It returns - the list of documentation sections for the children of the - \a aggregate. - */ -QList<Section> CppCodeMarker::qmlSections(Aggregate* aggregate, SynopsisStyle style, Status status) -{ - QList<Section> sections; - if (aggregate) { - if (style == Summary) { - FastSection qmlproperties(aggregate, - "Properties", - QString(), - "property", - "properties"); - FastSection qmlattachedproperties(aggregate, - "Attached Properties", - QString(), - "attached property", - "attached properties"); - FastSection qmlsignals(aggregate, - "Signals", - QString(), - "signal", - "signals"); - FastSection qmlsignalhandlers(aggregate, - "Signal Handlers", - QString(), - "signal handler", - "signal handlers"); - FastSection qmlattachedsignals(aggregate, - "Attached Signals", - QString(), - "attached signal", - "attached signals"); - FastSection qmlmethods(aggregate, - "Methods", - QString(), - "method", - "methods"); - FastSection qmlattachedmethods(aggregate, - "Attached Methods", - QString(), - "attached method", - "attached methods"); - - Aggregate* qcn = aggregate; - while (qcn != 0) { - NodeList::ConstIterator c = qcn->childNodes().constBegin(); - while (c != qcn->childNodes().constEnd()) { - if ((*c)->status() == Node::Internal) { - ++c; - continue; - } - if ((*c)->isQmlPropertyGroup() || (*c)->isJsPropertyGroup()) { - insert(qmlproperties, *c, style, status); - } - else if ((*c)->isQmlProperty() || (*c)->isJsProperty()) { - const QmlPropertyNode* pn = static_cast<const QmlPropertyNode*>(*c); - if (pn->isAttached()) - insert(qmlattachedproperties,*c,style, status); - else { - insert(qmlproperties,*c,style, status); - } - } - else if ((*c)->isQmlSignal() || (*c)->isJsSignal()) { - const FunctionNode* sn = static_cast<const FunctionNode*>(*c); - if (sn->isAttached()) - insert(qmlattachedsignals,*c,style, status); - else - insert(qmlsignals,*c,style, status); - } - else if ((*c)->isQmlSignalHandler() || (*c)->isJsSignalHandler()) { - insert(qmlsignalhandlers,*c,style, status); - } - else if ((*c)->isQmlMethod() || (*c)->isJsMethod()) { - const FunctionNode* mn = static_cast<const FunctionNode*>(*c); - if (mn->isAttached()) - insert(qmlattachedmethods,*c,style, status); - else - insert(qmlmethods,*c,style, status); - } - ++c; - } - if (qcn->qmlBaseNode() != 0) { - qcn = static_cast<QmlTypeNode*>(qcn->qmlBaseNode()); - if (!qcn->isAbstract()) - qcn = 0; - } - else - qcn = 0; - } - append(sections,qmlproperties); - append(sections,qmlattachedproperties); - append(sections,qmlsignals); - append(sections,qmlsignalhandlers); - append(sections,qmlattachedsignals); - append(sections,qmlmethods); - append(sections,qmlattachedmethods); - } - else if (style == Detailed) { - FastSection qmlproperties(aggregate, "Property Documentation","qmlprop","member","members"); - FastSection qmlattachedproperties(aggregate,"Attached Property Documentation","qmlattprop", - "member","members"); - FastSection qmlsignals(aggregate,"Signal Documentation","qmlsig","signal","signals"); - FastSection qmlsignalhandlers(aggregate,"Signal Handler Documentation","qmlsighan","signal handler","signal handlers"); - FastSection qmlattachedsignals(aggregate,"Attached Signal Documentation","qmlattsig", - "signal","signals"); - FastSection qmlmethods(aggregate,"Method Documentation","qmlmeth","member","members"); - FastSection qmlattachedmethods(aggregate,"Attached Method Documentation","qmlattmeth", - "member","members"); - Aggregate* qcn = aggregate; - while (qcn != 0) { - NodeList::ConstIterator c = qcn->childNodes().constBegin(); - while (c != qcn->childNodes().constEnd()) { - if ((*c)->status() == Node::Internal) { - ++c; - continue; - } - if ((*c)->isQmlPropertyGroup() || (*c)->isJsPropertyGroup()) { - insert(qmlproperties,*c,style, status); - } - else if ((*c)->isQmlProperty() || (*c)->isJsProperty()) { - const QmlPropertyNode* pn = static_cast<const QmlPropertyNode*>(*c); - if (pn->isAttached()) - insert(qmlattachedproperties,*c,style, status); - else - insert(qmlproperties,*c,style, status); - } - else if ((*c)->isQmlSignal() || (*c)->isJsSignal()) { - const FunctionNode* sn = static_cast<const FunctionNode*>(*c); - if (sn->isAttached()) - insert(qmlattachedsignals,*c,style, status); - else - insert(qmlsignals,*c,style, status); - } - else if ((*c)->isQmlSignalHandler() || (*c)->isJsSignalHandler()) { - insert(qmlsignalhandlers,*c,style, status); - } - else if ((*c)->isQmlMethod() || (*c)->isJsMethod()) { - const FunctionNode* mn = static_cast<const FunctionNode*>(*c); - if (mn->isAttached()) - insert(qmlattachedmethods,*c,style, status); - else - insert(qmlmethods,*c,style, status); - } - ++c; - } - if (qcn->qmlBaseNode() != 0) { - qcn = static_cast<QmlTypeNode*>(qcn->qmlBaseNode()); - if (!qcn->isAbstract()) - qcn = 0; - } - else - qcn = 0; - } - append(sections,qmlproperties); - append(sections,qmlattachedproperties); - append(sections,qmlsignals); - append(sections,qmlsignalhandlers); - append(sections,qmlattachedsignals); - append(sections,qmlmethods); - append(sections,qmlattachedmethods); - } - else { - /* - This is where the list of all members including inherited - members is prepared. - */ - ClassMap* classMap = 0; - FastSection all(aggregate,QString(),QString(),"member","members"); - Aggregate* current = aggregate; - while (current != 0) { - /* - If the QML type is abstract, do not create - a new entry in the list for it. Instead, - add its members to the current entry. - - However, if the first class is abstract, - there is no current entry. In that case, - create a new entry in the list anyway. - I'm not sure that is correct, but it at - least can prevent a crash. - */ - if (!current->isAbstract() || !classMap) { - classMap = new ClassMap; - classMap->first = static_cast<const QmlTypeNode*>(current); - all.classMapList_.append(classMap); - } - NodeList::ConstIterator c = current->childNodes().constBegin(); - while (c != current->childNodes().constEnd()) { - if ((*c)->isQmlPropertyGroup() || (*c)->isJsPropertyGroup()) { - const QmlPropertyGroupNode* qpgn = static_cast<const QmlPropertyGroupNode*>(*c); - NodeList::ConstIterator p = qpgn->childNodes().constBegin(); - while (p != qpgn->childNodes().constEnd()) { - if ((*p)->isQmlProperty() || (*c)->isJsProperty()) { - QString key = (*p)->name(); - key = sortName(*p, &key); - all.memberMap.insert(key,*p); - classMap->second.insert(key,*p); - } - ++p; - } - } - else { - QString key = (*c)->name(); - key = sortName(*c, &key); - all.memberMap.insert(key,*c); - classMap->second.insert(key,*c); - } - ++c; - } - if (current->qmlBaseNode() == current) { - qDebug() << "qdoc internal error: circular type definition." - << "QML type" << current->name() - << "can't be its own base type"; - break; - } - current = current->qmlBaseNode(); - while (current) { - if (current->isAbstract()) - break; - if (current->isInternal()) - current = current->qmlBaseNode(); - else - break; - } - } - append(sections, all, true); - } - } - - return sections; -} - QT_END_NAMESPACE |