diff options
Diffstat (limited to 'src/qdoc/cppcodeparser.cpp')
-rw-r--r-- | src/qdoc/cppcodeparser.cpp | 643 |
1 files changed, 99 insertions, 544 deletions
diff --git a/src/qdoc/cppcodeparser.cpp b/src/qdoc/cppcodeparser.cpp index c80ab745b..a889c988e 100644 --- a/src/qdoc/cppcodeparser.cpp +++ b/src/qdoc/cppcodeparser.cpp @@ -33,10 +33,8 @@ #include <qfile.h> #include <stdio.h> #include <errno.h> -#include "codechunk.h" #include "config.h" #include "cppcodeparser.h" -#include "tokenizer.h" #include "qdocdatabase.h" #include <qdebug.h> #include "generator.h" @@ -45,23 +43,20 @@ QT_BEGIN_NAMESPACE /* qmake ignore Q_OBJECT */ -static bool inMacroCommand_ = false; QStringList CppCodeParser::exampleFiles; QStringList CppCodeParser::exampleDirs; QSet<QString> CppCodeParser::excludeDirs; QSet<QString> CppCodeParser::excludeFiles; static QSet<QString> topicCommands_; -static QSet<QString> otherMetaCommands_; +static QSet<QString> metaCommands_; /*! The constructor initializes some regular expressions - and calls reset(). + and initializes the tokenizer variables. */ CppCodeParser::CppCodeParser() - : varComment("/\\*\\s*([a-zA-Z_0-9]+)\\s*\\*/"), sep("(?:<[^>]+>)?::") { - reset(); if (topicCommands_.isEmpty()) { topicCommands_ << COMMAND_CLASS << COMMAND_DITAMAP @@ -100,22 +95,16 @@ CppCodeParser::CppCodeParser() << COMMAND_JSBASICTYPE << COMMAND_JSMODULE; } - if (otherMetaCommands_.isEmpty()) { - otherMetaCommands_ = commonMetaCommands(); - otherMetaCommands_ << COMMAND_INHEADERFILE - << COMMAND_OVERLOAD - << COMMAND_REIMP - << COMMAND_RELATES - << COMMAND_CONTENTSPAGE - << COMMAND_NEXTPAGE - << COMMAND_PREVIOUSPAGE - << COMMAND_STARTPAGE - << COMMAND_QMLINHERITS - << COMMAND_QMLINSTANTIATES - << COMMAND_QMLDEFAULT - << COMMAND_QMLREADONLY - << COMMAND_QMLABSTRACT - << COMMAND_ABSTRACT; + if (metaCommands_.isEmpty()) { + metaCommands_ = commonMetaCommands(); + metaCommands_ << COMMAND_CONTENTSPAGE + << COMMAND_INHEADERFILE + << COMMAND_NEXTPAGE + << COMMAND_OVERLOAD + << COMMAND_PREVIOUSPAGE + << COMMAND_QMLINSTANTIATES + << COMMAND_REIMP + << COMMAND_RELATES; } } @@ -238,8 +227,6 @@ Node* CppCodeParser::processTopicCommand(const Doc& doc, doc.location().warning(tr("Cannot find '%1' specified with '\\%2' in any header file") .arg(arg.first).arg(command)); } - lastPath_ = path; - } else if (node->isAggregate()) { if (type == Node::Namespace) { @@ -556,48 +543,60 @@ void CppCodeParser::processQmlProperties(const Doc& doc, Returns the set of strings representing the common metacommands plus some other metacommands. */ -const QSet<QString>& CppCodeParser::otherMetaCommands() +const QSet<QString>& CppCodeParser::metaCommands() { - return otherMetaCommands_; + return metaCommands_; } /*! Process the metacommand \a command in the context of the \a node associated with the topic command and the \a doc. \a arg is the argument to the metacommand. + + \a node is guaranteed to be non-null. */ -void CppCodeParser::processOtherMetaCommand(const Doc& doc, - const QString& command, - const ArgLocPair& argLocPair, - Node *node) +void CppCodeParser::processMetaCommand(const Doc &doc, + const QString &command, + const ArgLocPair &argLocPair, + Node *node) { QString arg = argLocPair.first; if (command == COMMAND_INHEADERFILE) { - if (node != 0 && node->isAggregate()) { - ((Aggregate *) node)->addInclude(arg); - } - else { + if (node->isAggregate()) + static_cast<Aggregate*>(node)->addIncludeFile(arg); + else doc.location().warning(tr("Ignored '\\%1'").arg(COMMAND_INHEADERFILE)); - } } else if (command == COMMAND_OVERLOAD) { - if (node && (node->isFunction() || node->isSharedCommentNode())) - node->setOverloadFlag(true); + /* + Note that this might set the overload flag of the + primary function. This is ok because the overload + flags and overload numbers will be resolved later + in resolveOverloadNumbers(). + */ + if (node->isFunction()) + static_cast<FunctionNode*>(node)->setOverloadFlag(); + else if (node->isSharedCommentNode()) + static_cast<SharedCommentNode*>(node)->setOverloadFlags(); else doc.location().warning(tr("Ignored '\\%1'").arg(COMMAND_OVERLOAD)); } else if (command == COMMAND_REIMP) { - if (node != 0 && node->parent() && !node->parent()->isInternal()) { + if (node->parent() && !node->parent()->isInternal()) { if (node->isFunction()) { - FunctionNode *func = (FunctionNode *) node; - if (func->reimplementedFrom().isEmpty() && isWorthWarningAbout(doc)) { + FunctionNode *fn = static_cast<FunctionNode*>(node); + // The clang visitor class will have set the + // qualified name of the ovverridden function. + // If the name of the overridden function isn't + // set, issue a warning. + if (fn->overridesThis().isEmpty() && isWorthWarningAbout(doc)) { doc.location().warning(tr("Cannot find base function for '\\%1' in %2()") .arg(COMMAND_REIMP).arg(node->name()), tr("The function either doesn't exist in any " "base class with the same signature or it " "exists but isn't virtual.")); } - func->setReimplemented(true); + fn->setReimpFlag(); } else { doc.location().warning(tr("Ignored '\\%1' in %2").arg(COMMAND_REIMP).arg(node->name())); @@ -606,20 +605,42 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc, } else if (command == COMMAND_RELATES) { QStringList path = arg.split("::"); - Node* n = qdb_->findRelatesNode(path); - if (!n) { - // Store just a string to write to the index file - if (Generator::preparing()) - node->setRelates(arg); - else - doc.location().warning(tr("Cannot find '%1' in '\\%2'").arg(arg).arg(COMMAND_RELATES)); + Aggregate *aggregate = qdb_->findRelatesNode(path); + if (!aggregate) + aggregate = new ProxyNode(node->root(), arg); - } - else if (node->parent() != n) - node->setRelates(static_cast<PageNode*>(n)); - else - doc.location().warning(tr("Invalid use of '\\%1' (already a member of '%2')") + if (node->parent() == aggregate) { // node is already a child of aggregate + doc.location().warning(tr("Invalid '\\%1' (already a member of '%2')") .arg(COMMAND_RELATES, arg)); + } else { + if (node->isAggregate()) { + doc.location().warning(tr("Invalid '\\%1' not allowed in '\\%2'") + .arg(COMMAND_RELATES, node->nodeTypeString())); + } else if (!node->isRelatedNonmember() && + !node->parent()->name().isEmpty() && + !node->parent()->isHeader()) { + if (!doc.isInternal()) { + doc.location().warning(tr("Invalid '\\%1' ('%2' must be global)") + .arg(COMMAND_RELATES, node->name())); + } + } else if (!node->isRelatedNonmember() && !node->parent()->isHeader()) { + aggregate->adoptChild(node); + node->setRelatedNonmember(true); + } else { + /* + There are multiple \relates commands. This + one is not the first, so clone the node as + a child of aggregate. + */ + Node *clone = node->clone(aggregate); + if (clone == nullptr) { + doc.location().warning(tr("Invalid '\\%1' (multiple uses not allowed in '%2')") + .arg(COMMAND_RELATES, node->nodeTypeString())); + } else { + clone->setRelatedNonmember(true); + } + } + } } else if (command == COMMAND_CONTENTSPAGE) { setLink(node, Node::ContentsLink, arg); @@ -653,38 +674,10 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc, doc.location().warning(tr("\\instantiates is only allowed in \\qmltype")); } else if (command == COMMAND_QMLDEFAULT) { - if (node->nodeType() == Node::QmlProperty) { - QmlPropertyNode* qpn = static_cast<QmlPropertyNode*>(node); - qpn->setDefault(); - } - else if (node->nodeType() == Node::QmlPropertyGroup) { - QmlPropertyGroupNode* qpgn = static_cast<QmlPropertyGroupNode*>(node); - NodeList::ConstIterator p = qpgn->childNodes().constBegin(); - while (p != qpgn->childNodes().constEnd()) { - if ((*p)->nodeType() == Node::QmlProperty) { - QmlPropertyNode* qpn = static_cast<QmlPropertyNode*>(*p); - qpn->setDefault(); - } - ++p; - } - } + node->markDefault(); } else if (command == COMMAND_QMLREADONLY) { - if (node->nodeType() == Node::QmlProperty) { - QmlPropertyNode* qpn = static_cast<QmlPropertyNode*>(node); - qpn->setReadOnly(1); - } - else if (node->nodeType() == Node::QmlPropertyGroup) { - QmlPropertyGroupNode* qpgn = static_cast<QmlPropertyGroupNode*>(node); - NodeList::ConstIterator p = qpgn->childNodes().constBegin(); - while (p != qpgn->childNodes().constEnd()) { - if ((*p)->nodeType() == Node::QmlProperty) { - QmlPropertyNode* qpn = static_cast<QmlPropertyNode*>(*p); - qpn->setReadOnly(1); - } - ++p; - } - } + node->markReadOnly(1); } else if ((command == COMMAND_QMLABSTRACT) || (command == COMMAND_ABSTRACT)) { if (node->isQmlType() || node->isJsType()) @@ -711,21 +704,8 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc, if (!node->isInternal()) node->setStatus(Node::Preliminary); } else if (command == COMMAND_INTERNAL) { - if (!showInternal()) { - node->setAccess(Node::Private); - node->setStatus(Node::Internal); - if (node->nodeType() == Node::QmlPropertyGroup) { - const QmlPropertyGroupNode* qpgn = static_cast<const QmlPropertyGroupNode*>(node); - NodeList::ConstIterator p = qpgn->childNodes().constBegin(); - while (p != qpgn->childNodes().constEnd()) { - if ((*p)->nodeType() == Node::QmlProperty) { - (*p)->setAccess(Node::Private); - (*p)->setStatus(Node::Internal); - } - ++p; - } - } - } + if (!showInternal()) + node->markInternal(); } else if (command == COMMAND_REENTRANT) { node->setThreadSafeness(Node::Reentrant); } else if (command == COMMAND_SINCE) { @@ -755,20 +735,21 @@ void CppCodeParser::processOtherMetaCommand(const Doc& doc, } /*! - The topic command has been processed resulting in the \a doc - and \a node passed in here. Process the other meta commands, - which are found in \a doc, in the context of the topic \a node. + The topic command has been processed, and now \a doc and + \a node are passed to this function to get the metacommands + from \a doc and process them one at a time. \a node is the + node where \a doc resides. */ -void CppCodeParser::processOtherMetaCommands(const Doc& doc, Node *node) +void CppCodeParser::processMetaCommands(const Doc &doc, Node *node) { - QStringList metaCommands = doc.metaCommandsUsed().toList(); - metaCommands.sort(); - QStringList::ConstIterator cmd = metaCommands.constBegin(); - while (cmd != metaCommands.constEnd()) { + QStringList metaCommandsUsed = doc.metaCommandsUsed().toList(); + metaCommandsUsed.sort(); // TODO: why are these sorted? mws 24/12/2018 + QStringList::ConstIterator cmd = metaCommandsUsed.constBegin(); + while (cmd != metaCommandsUsed.constEnd()) { ArgList args = doc.metaCommandArgs(*cmd); ArgList::ConstIterator arg = args.constBegin(); while (arg != args.constEnd()) { - processOtherMetaCommand(doc, *cmd, *arg, node); + processMetaCommand(doc, *cmd, *arg, node); ++arg; } ++cmd; @@ -776,435 +757,9 @@ void CppCodeParser::processOtherMetaCommands(const Doc& doc, Node *node) } /*! - Resets the C++ code parser to its default initialized state. - */ -void CppCodeParser::reset() -{ - tokenizer = 0; - tok = 0; - access = Node::Public; - metaness_ = FunctionNode::Plain; - lastPath_.clear(); - physicalModuleName.clear(); -} - -/*! - Get the next token from the file being parsed and store it - in the token variable. - */ -void CppCodeParser::readToken() -{ - tok = tokenizer->getToken(); -} - -/*! - Return the current location in the file being parsed, - i.e. the file name, line number, and column number. - */ -const Location& CppCodeParser::location() -{ - return tokenizer->location(); -} - -/*! - Return the previous string read from the file being parsed. - */ -QString CppCodeParser::previousLexeme() -{ - return tokenizer->previousLexeme(); -} - -/*! - Return the current string string from the file being parsed. - */ -QString CppCodeParser::lexeme() -{ - return tokenizer->lexeme(); -} - -bool CppCodeParser::match(int target) -{ - if (tok == target) { - readToken(); - return true; - } - return false; -} - -/*! - Skip to \a target. If \a target is found before the end - of input, return true. Otherwise return false. - */ -bool CppCodeParser::skipTo(int target) -{ - while ((tok != Tok_Eoi) && (tok != target)) - readToken(); - return tok == target; -} - -bool CppCodeParser::matchModuleQualifier(QString& name) -{ - bool matches = (lexeme() == QString('.')); - if (matches) { - do { - name += lexeme(); - readToken(); - } while ((tok == Tok_Ident) || (lexeme() == QString('.'))); - } - return matches; -} - -bool CppCodeParser::matchTemplateAngles(CodeChunk *dataType) -{ - bool matches = (tok == Tok_LeftAngle); - if (matches) { - int leftAngleDepth = 0; - int parenAndBraceDepth = 0; - do { - if (tok == Tok_LeftAngle) { - leftAngleDepth++; - } - else if (tok == Tok_RightAngle) { - leftAngleDepth--; - } - else if (tok == Tok_LeftParen || tok == Tok_LeftBrace) { - ++parenAndBraceDepth; - } - else if (tok == Tok_RightParen || tok == Tok_RightBrace) { - if (--parenAndBraceDepth < 0) - return false; - } - if (dataType != 0) - dataType->append(lexeme()); - readToken(); - } while (leftAngleDepth > 0 && tok != Tok_Eoi); - } - return matches; -} - -bool CppCodeParser::matchDataType(CodeChunk *dataType, QString *var, bool qProp) -{ - /* - This code is really hard to follow... sorry. The loop is there to match - Alpha::Beta::Gamma::...::Omega. - */ - for (;;) { - bool virgin = true; - - if (tok != Tok_Ident) { - /* - There is special processing for 'Foo::operator int()' - and such elsewhere. This is the only case where we - return something with a trailing gulbrandsen ('Foo::'). - */ - if (tok == Tok_operator) - return true; - - /* - People may write 'const unsigned short' or - 'short unsigned const' or any other permutation. - */ - while (match(Tok_const) || match(Tok_volatile)) - dataType->append(previousLexeme()); - QString pending; - while (tok == Tok_signed || tok == Tok_int || tok == Tok_unsigned || - tok == Tok_short || tok == Tok_long || tok == Tok_int64) { - if (tok == Tok_signed) - pending = lexeme(); - else { - if (tok == Tok_unsigned && !pending.isEmpty()) - dataType->append(pending); - pending.clear(); - dataType->append(lexeme()); - } - readToken(); - virgin = false; - } - if (!pending.isEmpty()) { - dataType->append(pending); - pending.clear(); - } - while (match(Tok_const) || match(Tok_volatile)) - dataType->append(previousLexeme()); - - if (match(Tok_Tilde)) - dataType->append(previousLexeme()); - } - - if (virgin) { - if (match(Tok_Ident)) { - /* - This is a hack until we replace this "parser" - with the real one used in Qt Creator. - */ - if (!inMacroCommand_ && lexeme() == "(" && - ((previousLexeme() == "QT_PREPEND_NAMESPACE") || (previousLexeme() == "NS"))) { - readToken(); - readToken(); - dataType->append(previousLexeme()); - readToken(); - } - else - dataType->append(previousLexeme()); - } - else if (match(Tok_void) || match(Tok_int) || match(Tok_char) || - match(Tok_double) || match(Tok_Ellipsis)) { - dataType->append(previousLexeme()); - } - else { - return false; - } - } - else if (match(Tok_int) || match(Tok_char) || match(Tok_double)) { - dataType->append(previousLexeme()); - } - - matchTemplateAngles(dataType); - - while (match(Tok_const) || match(Tok_volatile)) - dataType->append(previousLexeme()); - - if (match(Tok_Gulbrandsen)) - dataType->append(previousLexeme()); - else - break; - } - - while (match(Tok_Ampersand) || match(Tok_Aster) || match(Tok_const) || - match(Tok_Caret) || match(Tok_Ellipsis)) - dataType->append(previousLexeme()); - - if (match(Tok_LeftParenAster)) { - /* - A function pointer. This would be rather hard to handle without a - tokenizer hack, because a type can be followed with a left parenthesis - in some cases (e.g., 'operator int()'). The tokenizer recognizes '(*' - as a single token. - */ - dataType->append(" "); // force a space after the type - dataType->append(previousLexeme()); - dataType->appendHotspot(); - if (var != 0 && match(Tok_Ident)) - *var = previousLexeme(); - if (!match(Tok_RightParen)) - return false; - dataType->append(previousLexeme()); - if (!match(Tok_LeftParen)) - return false; - dataType->append(previousLexeme()); - - /* parse the parameters. Ignore the parameter name from the type */ - while (tok != Tok_RightParen && tok != Tok_Eoi) { - QString dummy; - if (!matchDataType(dataType, &dummy)) - return false; - if (match(Tok_Comma)) - dataType->append(previousLexeme()); - } - if (!match(Tok_RightParen)) - return false; - dataType->append(previousLexeme()); - } - else { - /* - The common case: Look for an optional identifier, then for - some array brackets. - */ - dataType->appendHotspot(); - - if (var != 0) { - if (match(Tok_Ident)) { - *var = previousLexeme(); - } - else if (match(Tok_Comment)) { - /* - A neat hack: Commented-out parameter names are - recognized by qdoc. It's impossible to illustrate - here inside a C-style comment, because it requires - an asterslash. It's also impossible to illustrate - inside a C++-style comment, because the explanation - does not fit on one line. - */ - if (varComment.exactMatch(previousLexeme())) - *var = varComment.cap(1); - } - else if (match(Tok_LeftParen)) { - *var = "("; - while (tok != Tok_RightParen && tok != Tok_Eoi) { - (*var).append(lexeme()); - readToken(); - } - (*var).append(")"); - readToken(); - if (match(Tok_LeftBracket)) { - (*var).append("["); - while (tok != Tok_RightBracket && tok != Tok_Eoi) { - (*var).append(lexeme()); - readToken(); - } - (*var).append("]"); - readToken(); - } - } - else if (qProp && (match(Tok_default) || match(Tok_final) || match(Tok_override))) { - // Hack to make 'default', 'final' and 'override' work again in Q_PROPERTY - *var = previousLexeme(); - } - } - - if (tok == Tok_LeftBracket) { - int bracketDepth0 = tokenizer->bracketDepth(); - while ((tokenizer->bracketDepth() >= bracketDepth0 && - tok != Tok_Eoi) || - tok == Tok_RightBracket) { - dataType->append(lexeme()); - readToken(); - } - } - } - return true; -} - -/*! - Parse the next function parameter, if there is one, and - append it to parameter vector \a pvect. Return true if - a parameter is parsed and appended to \a pvect. - Otherwise return false. - */ -bool CppCodeParser::matchParameter(QVector<Parameter>& pvect, bool& isQPrivateSignal) -{ - if (match(Tok_QPrivateSignal)) { - isQPrivateSignal = true; - return true; - } - - Parameter p; - CodeChunk chunk; - if (!matchDataType(&chunk, &p.name_)) { - return false; - } - p.dataType_ = chunk.toString(); - chunk.clear(); - match(Tok_Comment); - if (match(Tok_Equal)) { - int pdepth = tokenizer->parenDepth(); - while (tokenizer->parenDepth() >= pdepth && - (tok != Tok_Comma || (tokenizer->parenDepth() > pdepth)) && - tok != Tok_Eoi) { - chunk.append(lexeme()); - readToken(); - } - } - p.defaultValue_ = chunk.toString(); - pvect.append(p); - return true; -} - -/*! - Match a C++ \c using clause. Return \c true if the match - is successful. Otherwise false. - - If the \c using clause is for a namespace, an open namespace - <is inserted for qdoc to look in to find things. - - If the \c using clause is a base class member function, the - member function is added to \a parent as an unresolved - \c using clause. - */ -bool CppCodeParser::matchUsingDecl(Aggregate* parent) -{ - bool usingNamespace = false; - readToken(); // skip 'using' - - if (tok == Tok_namespace) { - usingNamespace = true; - readToken(); - } - - int openLeftAngles = 0; - int openLeftParens = 0; - bool usingOperator = false; - QString name; - while (tok != Tok_Semicolon) { - if ((tok != Tok_Ident) && (tok != Tok_Gulbrandsen)) { - if (tok == Tok_LeftAngle) { - ++openLeftAngles; - } - else if (tok == Tok_RightAngle) { - if (openLeftAngles <= 0) - return false; - --openLeftAngles; - } - else if (tok == Tok_Comma) { - if (openLeftAngles <= 0) - return false; - } - else if (tok == Tok_operator) { - usingOperator = true; - } - else if (tok == Tok_SomeOperator) { - if (!usingOperator) - return false; - } - else if (tok == Tok_LeftParen) { - ++openLeftParens; - } - else if (tok == Tok_RightParen) { - if (openLeftParens <= 0) - return false; - --openLeftParens; - } - else { - return false; - } - } - name += lexeme(); - readToken(); - } - - if (usingNamespace) { - // 'using namespace Foo;'. - qdb_->insertOpenNamespace(name); - } - else if (parent && parent->isClass()) { - ClassNode* cn = static_cast<ClassNode*>(parent); - cn->addUnresolvedUsingClause(name); - } - return true; -} - -/*! - This function uses a Tokenizer to parse the \a parameters of a - function into the parameter vector \a {pvect}. - */ -bool CppCodeParser::parseParameters(const QString& parameters, - QVector<Parameter>& pvect, - bool& isQPrivateSignal) -{ - Tokenizer* outerTokenizer = tokenizer; - int outerTok = tok; - - QByteArray latin1 = parameters.toLatin1(); - Tokenizer stringTokenizer(Location(), latin1); - stringTokenizer.setParsingFnOrMacro(true); - tokenizer = &stringTokenizer; - readToken(); - - inMacroCommand_ = false; - do { - if (!matchParameter(pvect, isQPrivateSignal)) - return false; - } while (match(Tok_Comma)); - - tokenizer = outerTokenizer; - tok = outerTok; - return true; -} - -/*! Parse QML/JS signal/method topic commands. */ -Node* CppCodeParser::parseOtherFuncArg(const QString& topic, const Location& location, const QString& funcArg) +FunctionNode *CppCodeParser::parseOtherFuncArg(const QString &topic, const Location &location, const QString &funcArg) { QString funcName; QString returnType; @@ -1224,7 +779,7 @@ Node* CppCodeParser::parseOtherFuncArg(const QString& topic, const Location& loc if (colonSplit.size() < 2) { QString msg = "Unrecognizable QML module/component qualifier for " + funcArg; location.warning(tr(msg.toLatin1().data())); - return 0; + return nullptr; } QString moduleName; QString elementName; @@ -1240,7 +795,7 @@ Node* CppCodeParser::parseOtherFuncArg(const QString& topic, const Location& loc if (!aggregate) aggregate = qdb_->findQmlBasicType(moduleName, elementName); if (!aggregate) - return 0; + return nullptr; QString params; QStringList leftParenSplit = funcArg.split('('); @@ -1266,7 +821,7 @@ Node* CppCodeParser::parseOtherFuncArg(const QString& topic, const Location& loc FunctionNode for the macro. Otherwise return null. \a location is used for reporting errors. */ -Node* CppCodeParser::parseMacroArg(const Location& location, const QString& macroArg) +FunctionNode *CppCodeParser::parseMacroArg(const Location &location, const QString ¯oArg) { QStringList leftParenSplit = macroArg.split('('); if (leftParenSplit.isEmpty()) @@ -1276,7 +831,7 @@ Node* CppCodeParser::parseMacroArg(const Location& location, const QString& macr QStringList blankSplit = leftParenSplit[0].split(' '); if (blankSplit.size() > 0) { macroName = blankSplit.last(); - oldMacroNode = static_cast<FunctionNode*>(qdb_->findMacroNode(macroName)); + oldMacroNode = qdb_->findMacroNode(macroName); } QString returnType; if (blankSplit.size() > 1) { @@ -1495,25 +1050,25 @@ void CppCodeParser::processTopicArgs(const Doc &doc, const QString &topic, NodeL } } -void CppCodeParser::processOtherMetaCommands(NodeList &nodes, DocList& docs) +void CppCodeParser::processMetaCommands(NodeList &nodes, DocList &docs) { NodeList::Iterator n = nodes.begin(); QList<Doc>::Iterator d = docs.begin(); while (n != nodes.end()) { if (*n != nullptr) { - processOtherMetaCommands(*d, *n); + processMetaCommands(*d, *n); (*n)->setDoc(*d); checkModuleInclusion(*n); if ((*n)->isAggregate()) { Aggregate *aggregate = static_cast<Aggregate *>(*n); - if (aggregate->includes().isEmpty()) { + if (aggregate->includeFiles().isEmpty()) { Aggregate *parent = aggregate; while (parent->physicalModuleName().isEmpty() && (parent->parent() != nullptr)) parent = parent->parent(); if (parent == aggregate) - aggregate->addInclude(aggregate->name()); + aggregate->addIncludeFile(aggregate->name()); else - aggregate->setIncludes(parent->includes()); + aggregate->setIncludeFiles(parent->includeFiles()); } } } |