diff options
author | Rainer Keller <Rainer.Keller@qt.io> | 2017-01-11 13:39:15 +0100 |
---|---|---|
committer | Rainer Keller <Rainer.Keller@qt.io> | 2017-01-12 11:23:29 +0000 |
commit | b7ccfd3c107e2edc3823cd79cf67d8e4e34f668b (patch) | |
tree | fbc725d6f97b3498fad5e4f6e1051f25a32aca69 | |
parent | 980fbea7adb3d31b8017f844bc8856612d3f7cff (diff) | |
download | qttools-b7ccfd3c107e2edc3823cd79cf67d8e4e34f668b.tar.gz |
qdoc: Implement C++11 'override' specifier support
Change-Id: Iad837dbdaf492eff77ced4d93dc05095e1d89400
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Reviewed-by: Michael Winkelmann <Michael.winkelmann@qt.io>
Reviewed-by: Karsten Heimrich <karsten.heimrich@qt.io>
-rw-r--r-- | src/qdoc/cppcodemarker.cpp | 4 | ||||
-rw-r--r-- | src/qdoc/cppcodeparser.cpp | 8 | ||||
-rw-r--r-- | src/qdoc/node.cpp | 2 | ||||
-rw-r--r-- | src/qdoc/node.h | 4 | ||||
-rw-r--r-- | src/qdoc/qdocindexfiles.cpp | 4 | ||||
-rw-r--r-- | src/qdoc/qdoctagfiles.cpp | 2 | ||||
-rw-r--r-- | src/qdoc/tokenizer.cpp | 2 | ||||
-rw-r--r-- | src/qdoc/tokenizer.h | 1 |
8 files changed, 23 insertions, 4 deletions
diff --git a/src/qdoc/cppcodemarker.cpp b/src/qdoc/cppcodemarker.cpp index bdc369612..8eac38629 100644 --- a/src/qdoc/cppcodemarker.cpp +++ b/src/qdoc/cppcodemarker.cpp @@ -178,6 +178,8 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, synopsis.prepend("virtual "); if (func->isFinal()) synopsis.append(" final"); + if (func->isOverride()) + synopsis.append(" override"); if (func->isPureVirtual()) synopsis.append(" = 0"); else if (func->isDeleted()) @@ -200,6 +202,8 @@ QString CppCodeMarker::markedUpSynopsis(const Node *node, } else if (!func->isNonvirtual()) { if (func->isFinal()) bracketed += "final"; + if (func->isOverride()) + bracketed += "override"; if (func->isPureVirtual()) bracketed += "pure"; bracketed += "virtual"; diff --git a/src/qdoc/cppcodeparser.cpp b/src/qdoc/cppcodeparser.cpp index c7d1e3507..740216b1f 100644 --- a/src/qdoc/cppcodeparser.cpp +++ b/src/qdoc/cppcodeparser.cpp @@ -1314,8 +1314,8 @@ bool CppCodeParser::matchDataType(CodeChunk *dataType, QString *var, bool qProp) if (varComment.exactMatch(previousLexeme())) *var = varComment.cap(1); } - else if (qProp && (match(Tok_default) || match(Tok_final))) { - // Hack to make 'default' and 'final' work again in Q_PROPERTY + 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(); } } @@ -1587,6 +1587,7 @@ bool CppCodeParser::matchFunctionDecl(Aggregate *parent, // look for const bool matchedConst = match(Tok_const); bool matchFinal = match(Tok_final); + bool matchOverride = match(Tok_override); bool isDeleted = false; bool isDefaulted = false; @@ -1706,6 +1707,7 @@ bool CppCodeParser::matchFunctionDecl(Aggregate *parent, func->setIsDeleted(isDeleted); func->setIsDefaulted(isDefaulted); func->setFinal(matchFinal); + func->setOverride(matchOverride); if (isQPrivateSignal) func->setPrivateSignal(); } @@ -2073,7 +2075,7 @@ bool CppCodeParser::matchProperty(Aggregate *parent) property->setDataType(dataType.toString()); while (tok != Tok_RightParen && tok != Tok_Eoi) { - if (!match(Tok_Ident) && !match(Tok_default) && !match(Tok_final)) + if (!match(Tok_Ident) && !match(Tok_default) && !match(Tok_final) && !match(Tok_override)) return false; QString key = previousLexeme(); QString value; diff --git a/src/qdoc/node.cpp b/src/qdoc/node.cpp index 2babb94ab..6d83ba631 100644 --- a/src/qdoc/node.cpp +++ b/src/qdoc/node.cpp @@ -2042,6 +2042,7 @@ FunctionNode::FunctionNode(Aggregate *parent, const QString& name) isDeleted_(false), isDefaulted_(false), isFinal_(false), + isOverride_(false), reimplementedFrom_(0) { setGenus(Node::CPP); @@ -2068,6 +2069,7 @@ FunctionNode::FunctionNode(NodeType type, Aggregate *parent, const QString& name isDeleted_(false), isDefaulted_(false), isFinal_(false), + isOverride_(false), reimplementedFrom_(0) { setGenus(Node::QML); diff --git a/src/qdoc/node.h b/src/qdoc/node.h index efe8c4896..2de9e2e5b 100644 --- a/src/qdoc/node.h +++ b/src/qdoc/node.h @@ -985,6 +985,9 @@ public: void setFinal(bool b) { isFinal_ = b; } bool isFinal() const { return isFinal_; } + void setOverride(bool b) { isOverride_ = b; } + bool isOverride() const { return isOverride_; } + private: void addAssociatedProperty(PropertyNode* property); @@ -1004,6 +1007,7 @@ private: bool isDeleted_ : 1; bool isDefaulted_ : 1; bool isFinal_ : 1; + bool isOverride_ : 1; unsigned char overloadNumber_; QVector<Parameter> parameters_; const FunctionNode* reimplementedFrom_; diff --git a/src/qdoc/qdocindexfiles.cpp b/src/qdoc/qdocindexfiles.cpp index 03f9c9811..d5fa06c67 100644 --- a/src/qdoc/qdocindexfiles.cpp +++ b/src/qdoc/qdocindexfiles.cpp @@ -493,6 +493,7 @@ void QDocIndexFiles::readIndexSection(QXmlStreamReader& reader, functionNode->setIsDeleted(attributes.value(QLatin1String("delete")) == QLatin1String("true")); functionNode->setIsDefaulted(attributes.value(QLatin1String("default")) == QLatin1String("true")); functionNode->setFinal(attributes.value(QLatin1String("final")) == QLatin1String("true")); + functionNode->setOverride(attributes.value(QLatin1String("override")) == QLatin1String("true")); if (attributes.value(QLatin1String("overload")) == QLatin1String("true")) { functionNode->setOverloadFlag(true); functionNode->setOverloadNumber(attributes.value(QLatin1String("overload-number")).toUInt()); @@ -1189,6 +1190,7 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, writer.writeAttribute("delete", functionNode->isDeleted() ? "true" : "false"); writer.writeAttribute("default", functionNode->isDefaulted() ? "true" : "false"); writer.writeAttribute("final", functionNode->isFinal() ? "true" : "false"); + writer.writeAttribute("override", functionNode->isOverride() ? "true" : "false"); if (functionNode->isOverload()) writer.writeAttribute("overload-number", QString::number(functionNode->overloadNumber())); if (functionNode->relates()) { @@ -1215,6 +1217,8 @@ bool QDocIndexFiles::generateIndexSection(QXmlStreamWriter& writer, signature += " const"; if (functionNode->isFinal()) signature += " final"; + if (functionNode->isOverride()) + signature += " override"; if (functionNode->isPureVirtual()) signature += " = 0"; else if (functionNode->isDeleted()) diff --git a/src/qdoc/qdoctagfiles.cpp b/src/qdoc/qdoctagfiles.cpp index 24423765e..528d310ca 100644 --- a/src/qdoc/qdoctagfiles.cpp +++ b/src/qdoc/qdoctagfiles.cpp @@ -275,6 +275,8 @@ void QDocTagFiles::generateTagFileMembers(QXmlStreamWriter& writer, const Aggreg signature += " const"; if (functionNode->isFinal()) signature += " final"; + if (functionNode->isOverride()) + signature += " override"; if (functionNode->isPureVirtual()) signature += " = 0"; else if (functionNode->isDeleted()) diff --git a/src/qdoc/tokenizer.cpp b/src/qdoc/tokenizer.cpp index b80f6167b..3a1003b83 100644 --- a/src/qdoc/tokenizer.cpp +++ b/src/qdoc/tokenizer.cpp @@ -54,7 +54,7 @@ static const char *kwords[] = { "private", "protected", "public", "short", "signals", "signed", "slots", "static", "struct", "template", "typedef", "typename", "union", "unsigned", "using", "virtual", "void", "volatile", - "__int64", "default", "delete", "final", + "__int64", "default", "delete", "final", "override", "Q_OBJECT", "Q_OVERRIDE", "Q_PROPERTY", diff --git a/src/qdoc/tokenizer.h b/src/qdoc/tokenizer.h index 767045762..4ef3195ed 100644 --- a/src/qdoc/tokenizer.h +++ b/src/qdoc/tokenizer.h @@ -62,6 +62,7 @@ enum { Tok_Eoi, Tok_Ampersand, Tok_Aster, Tok_Caret, Tok_LeftParen, Tok_static, Tok_struct, Tok_template, Tok_typedef, Tok_typename, Tok_union, Tok_unsigned, Tok_using, Tok_virtual, Tok_void, Tok_volatile, Tok_int64, Tok_default, Tok_delete, Tok_final, + Tok_override, Tok_Q_OBJECT, Tok_Q_OVERRIDE, Tok_Q_PROPERTY, Tok_Q_PRIVATE_PROPERTY, Tok_Q_DECLARE_SEQUENTIAL_ITERATOR, Tok_Q_DECLARE_MUTABLE_SEQUENTIAL_ITERATOR, |