diff options
Diffstat (limited to 'src/tools/qdoc/cppcodeparser.cpp')
-rw-r--r-- | src/tools/qdoc/cppcodeparser.cpp | 134 |
1 files changed, 59 insertions, 75 deletions
diff --git a/src/tools/qdoc/cppcodeparser.cpp b/src/tools/qdoc/cppcodeparser.cpp index f12fb70227..ab79f8f320 100644 --- a/src/tools/qdoc/cppcodeparser.cpp +++ b/src/tools/qdoc/cppcodeparser.cpp @@ -250,16 +250,11 @@ void CppCodeParser::doneParsingHeaderFiles() /*! This is called after all the source files (i.e., not the - header files) have been parsed. It traverses the tree to - resolve property links, normalize overload signatures, and - do other housekeeping of the database. + header files) have been parsed. Currently nothing to do. */ void CppCodeParser::doneParsingSourceFiles() { - qdb_->primaryTreeRoot()->normalizeOverloads(); - qdb_->fixInheritance(); - qdb_->resolveProperties(); - qdb_->primaryTreeRoot()->makeUndocumentedChildrenInternal(); + // contents moved to QdocDatabase::resolveIssues() } static QSet<QString> topicCommands_; @@ -408,7 +403,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, this way to allow the writer to refer to the entity without including the namespace qualifier. */ - Node::Type type = nodeTypeMap[command]; + Node::NodeType type = nodeTypeMap[command]; QStringList paths = arg.first.split(QLatin1Char(' ')); QStringList path = paths[0].split("::"); Node *node = 0; @@ -422,7 +417,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, lastPath_ = path; } - else if (node->isInnerNode()) { + else if (node->isAggregate()) { if (type == Node::Namespace) { NamespaceNode* ns = static_cast<NamespaceNode*>(node); ns->markSeen(); @@ -520,16 +515,6 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, else if (t == "ditamap") ptype = Node::DitaMapPage; } - -#if 0 - const Node* n = qdb_->checkForCollision(args[0]); - if (n) { - QString other = n->doc().location().fileName(); - doc.location().warning(tr("Name/title collision detected: '%1' in '\\%2'") - .arg(args[0]).arg(command), - tr("Also used here: %1").arg(other)); - } -#endif DocumentNode* dn = 0; if (ptype == Node::DitaMapPage) dn = new DitaMapNode(qdb_->primaryTreeRoot(), args[0]); @@ -572,7 +557,7 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, QmlTypeNode* qmlType = qdb_->findQmlType(module, qmlTypeName); if (qmlType) { bool attached = false; - Node::Type nodeType = Node::QmlMethod; + Node::NodeType nodeType = Node::QmlMethod; if ((command == COMMAND_QMLSIGNAL) || (command == COMMAND_JSSIGNAL)) nodeType = Node::QmlSignal; @@ -870,7 +855,8 @@ const QSet<QString>& CppCodeParser::otherMetaCommands() << COMMAND_QMLINSTANTIATES << COMMAND_QMLDEFAULT << COMMAND_QMLREADONLY - << COMMAND_QMLABSTRACT; + << COMMAND_QMLABSTRACT + << COMMAND_ABSTRACT; } return otherMetaCommands_; } @@ -887,22 +873,18 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc, { QString arg = argLocPair.first; if (command == COMMAND_INHEADERFILE) { - if (node != 0 && node->isInnerNode()) { - ((InnerNode *) node)->addInclude(arg); + if (node != 0 && node->isAggregate()) { + ((Aggregate *) node)->addInclude(arg); } else { - doc.location().warning(tr("Ignored '\\%1'") - .arg(COMMAND_INHEADERFILE)); + doc.location().warning(tr("Ignored '\\%1'").arg(COMMAND_INHEADERFILE)); } } else if (command == COMMAND_OVERLOAD) { - if (node != 0 && node->type() == Node::Function) { - ((FunctionNode *) node)->setOverload(true); - } - else { - doc.location().warning(tr("Ignored '\\%1'") - .arg(COMMAND_OVERLOAD)); - } + if (node && node->isFunction()) + ((FunctionNode *) node)->setOverloadFlag(true); + else + doc.location().warning(tr("Ignored '\\%1'").arg(COMMAND_OVERLOAD)); } else if (command == COMMAND_REIMP) { if (node != 0 && node->parent() && !node->parent()->isInternal()) { @@ -928,12 +910,10 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc, "because its base function is private " "or internal").arg(COMMAND_REIMP).arg(node->name())); } - func->setReimp(true); + func->setReimplemented(true); } else { - doc.location().warning(tr("Ignored '\\%1' in %2") - .arg(COMMAND_REIMP) - .arg(node->name())); + doc.location().warning(tr("Ignored '\\%1' in %2").arg(COMMAND_REIMP).arg(node->name())); } } } @@ -943,7 +923,7 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc, if (!n) doc.location().warning(tr("Cannot find '%1' in '\\%2'").arg(arg).arg(COMMAND_RELATES)); else - node->setRelates(static_cast<InnerNode*>(n)); + node->setRelates(static_cast<Aggregate*>(n)); } else if (command == COMMAND_CONTENTSPAGE) { setLink(node, Node::ContentsLink, arg); @@ -1014,7 +994,7 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc, } } } - else if (command == COMMAND_QMLABSTRACT) { + else if ((command == COMMAND_QMLABSTRACT) || (command == COMMAND_ABSTRACT)) { if (node->isQmlType() || node->isJsType()) node->setAbstract(true); } @@ -1051,7 +1031,7 @@ void CppCodeParser::reset() tokenizer = 0; tok = 0; access = Node::Public; - metaness = FunctionNode::Plain; + metaness_ = FunctionNode::Plain; lastPath_.clear(); physicalModuleName.clear(); } @@ -1353,7 +1333,7 @@ bool CppCodeParser::matchParameter(FunctionNode *func) return true; } -bool CppCodeParser::matchFunctionDecl(InnerNode *parent, +bool CppCodeParser::matchFunctionDecl(Aggregate *parent, QStringList *parentPathPtr, FunctionNode **funcPtr, const QString &templateStuff, @@ -1378,7 +1358,7 @@ bool CppCodeParser::matchFunctionDecl(InnerNode *parent, } FunctionNode::Virtualness vir = FunctionNode::NonVirtual; if (match(Tok_virtual)) { - vir = FunctionNode::ImpureVirtual; + vir = FunctionNode::NormalVirtual; if (matchCompat()) compat = true; } @@ -1516,7 +1496,7 @@ bool CppCodeParser::matchFunctionDecl(InnerNode *parent, if (compat) func->setStatus(Node::Compat); - func->setMetaness(metaness); + func->setMetaness(metaness_); if (parent) { if (name == parent->name()) { func->setMetaness(FunctionNode::Ctor); @@ -1616,7 +1596,7 @@ bool CppCodeParser::matchBaseList(ClassNode *classe, bool isClass) sufficient for Qt because there are no cases of class nesting more than one level deep. */ -bool CppCodeParser::matchClassDecl(InnerNode *parent, +bool CppCodeParser::matchClassDecl(Aggregate *parent, const QString &templateStuff) { bool isClass = (tok == Tok_class); @@ -1631,7 +1611,7 @@ bool CppCodeParser::matchClassDecl(InnerNode *parent, if (tok == Tok_Gulbrandsen) { Node* n = parent->findChildNode(previousLexeme(),Node::Class); if (n) { - parent = static_cast<InnerNode*>(n); + parent = static_cast<Aggregate*>(n); if (parent) { readToken(); if (tok != Tok_Ident) @@ -1663,17 +1643,17 @@ bool CppCodeParser::matchClassDecl(InnerNode *parent, Node::Access outerAccess = access; access = isClass ? Node::Private : Node::Public; - FunctionNode::Metaness outerMetaness = metaness; - metaness = FunctionNode::Plain; + FunctionNode::Metaness outerMetaness = metaness_; + metaness_ = FunctionNode::Plain; bool matches = (matchDeclList(classe) && match(Tok_RightBrace) && match(Tok_Semicolon)); access = outerAccess; - metaness = outerMetaness; + metaness_ = outerMetaness; return matches; } -bool CppCodeParser::matchNamespaceDecl(InnerNode *parent) +bool CppCodeParser::matchNamespaceDecl(Aggregate *parent) { readToken(); // skip 'namespace' if (tok != Tok_Ident) @@ -1712,7 +1692,7 @@ bool CppCodeParser::matchNamespaceDecl(InnerNode *parent) member function is added to \a parent as an unresolved \c using clause. */ -bool CppCodeParser::matchUsingDecl(InnerNode* parent) +bool CppCodeParser::matchUsingDecl(Aggregate* parent) { bool usingNamespace = false; readToken(); // skip 'using' @@ -1774,17 +1754,25 @@ bool CppCodeParser::matchUsingDecl(InnerNode* parent) return true; } -bool CppCodeParser::matchEnumItem(InnerNode *parent, EnumNode *enume) +bool CppCodeParser::matchEnumItem(Aggregate *parent, EnumNode *enume) { if (!match(Tok_Ident)) return false; QString name = previousLexeme(); CodeChunk val; + int parenLevel = 0; if (match(Tok_Equal)) { - while (tok != Tok_Comma && tok != Tok_RightBrace && - tok != Tok_Eoi) { + while (tok != Tok_RightBrace && tok != Tok_Eoi) { + if (tok == Tok_LeftParen) + parenLevel++; + else if (tok == Tok_RightParen) + parenLevel--; + else if (tok == Tok_Comma) { + if (parenLevel <= 0) + break; + } val.append(lexeme()); readToken(); } @@ -1825,7 +1813,7 @@ bool CppCodeParser::matchEnumItem(InnerNode *parent, EnumNode *enume) return true; } -bool CppCodeParser::matchEnumDecl(InnerNode *parent) +bool CppCodeParser::matchEnumDecl(Aggregate *parent) { QString name; @@ -1856,7 +1844,7 @@ bool CppCodeParser::matchEnumDecl(InnerNode *parent) return match(Tok_RightBrace) && match(Tok_Semicolon); } -bool CppCodeParser::matchTypedefDecl(InnerNode *parent) +bool CppCodeParser::matchTypedefDecl(Aggregate *parent) { CodeChunk dataType; QString name; @@ -1876,7 +1864,7 @@ bool CppCodeParser::matchTypedefDecl(InnerNode *parent) return true; } -bool CppCodeParser::matchProperty(InnerNode *parent) +bool CppCodeParser::matchProperty(Aggregate *parent) { int expected_tok = Tok_LeftParen; if (match(Tok_Q_PRIVATE_PROPERTY)) { @@ -1989,7 +1977,7 @@ bool CppCodeParser::matchProperty(InnerNode *parent) /*! Parse a C++ declaration. */ -bool CppCodeParser::matchDeclList(InnerNode *parent) +bool CppCodeParser::matchDeclList(Aggregate *parent) { ExtraFuncData extra; QString templateStuff; @@ -2030,28 +2018,28 @@ bool CppCodeParser::matchDeclList(InnerNode *parent) case Tok_private: readToken(); access = Node::Private; - metaness = FunctionNode::Plain; + metaness_ = FunctionNode::Plain; break; case Tok_protected: readToken(); access = Node::Protected; - metaness = FunctionNode::Plain; + metaness_ = FunctionNode::Plain; break; case Tok_public: readToken(); access = Node::Public; - metaness = FunctionNode::Plain; + metaness_ = FunctionNode::Plain; break; case Tok_signals: case Tok_Q_SIGNALS: readToken(); access = Node::Public; - metaness = FunctionNode::Signal; + metaness_ = FunctionNode::Signal; break; case Tok_slots: case Tok_Q_SLOTS: readToken(); - metaness = FunctionNode::Slot; + metaness_ = FunctionNode::Slot; break; case Tok_Q_OBJECT: readToken(); @@ -2069,29 +2057,25 @@ bool CppCodeParser::matchDeclList(InnerNode *parent) case Tok_Q_DECLARE_SEQUENTIAL_ITERATOR: readToken(); if (match(Tok_LeftParen) && match(Tok_Ident)) - sequentialIteratorClasses.insert(previousLexeme(), - location().fileName()); + sequentialIteratorClasses.insert(previousLexeme(), location().fileName()); match(Tok_RightParen); break; case Tok_Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR: readToken(); if (match(Tok_LeftParen) && match(Tok_Ident)) - mutableSequentialIteratorClasses.insert(previousLexeme(), - location().fileName()); + mutableSequentialIteratorClasses.insert(previousLexeme(), location().fileName()); match(Tok_RightParen); break; case Tok_Q_DECLARE_ASSOCIATIVE_ITERATOR: readToken(); if (match(Tok_LeftParen) && match(Tok_Ident)) - associativeIteratorClasses.insert(previousLexeme(), - location().fileName()); + associativeIteratorClasses.insert(previousLexeme(), location().fileName()); match(Tok_RightParen); break; case Tok_Q_DECLARE_MUTABLE_ASSOCIATIVE_ITERATOR: readToken(); if (match(Tok_LeftParen) && match(Tok_Ident)) - mutableAssociativeIteratorClasses.insert(previousLexeme(), - location().fileName()); + mutableAssociativeIteratorClasses.insert(previousLexeme(), location().fileName()); match(Tok_RightParen); break; case Tok_Q_DECLARE_FLAGS: @@ -2256,15 +2240,15 @@ bool CppCodeParser::matchDocsAndStuff() processOtherMetaCommands(*d, *n); (*n)->setDoc(*d); checkModuleInclusion(*n); - if ((*n)->isInnerNode() && ((InnerNode *)*n)->includes().isEmpty()) { - InnerNode *m = static_cast<InnerNode *>(*n); + if ((*n)->isAggregate() && ((Aggregate *)*n)->includes().isEmpty()) { + Aggregate *m = static_cast<Aggregate *>(*n); while (m->parent() && m->physicalModuleName().isEmpty()) { m = m->parent(); } if (m == *n) - ((InnerNode *)*n)->addInclude((*n)->name()); + ((Aggregate *)*n)->addInclude((*n)->name()); else - ((InnerNode *)*n)->setIncludes(m->includes()); + ((Aggregate *)*n)->setIncludes(m->includes()); } ++d; ++n; @@ -2346,8 +2330,8 @@ bool CppCodeParser::makeFunctionNode(const QString& signature, */ FunctionNode* CppCodeParser::makeFunctionNode(const Doc& doc, const QString& sig, - InnerNode* parent, - Node::Type type, + Aggregate* parent, + Node::NodeType type, bool attached, QString qdoctag) { |