summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Keller <Rainer.Keller@qt.io>2017-01-11 13:39:15 +0100
committerRainer Keller <Rainer.Keller@qt.io>2017-01-12 11:23:29 +0000
commitb7ccfd3c107e2edc3823cd79cf67d8e4e34f668b (patch)
treefbc725d6f97b3498fad5e4f6e1051f25a32aca69
parent980fbea7adb3d31b8017f844bc8856612d3f7cff (diff)
downloadqttools-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.cpp4
-rw-r--r--src/qdoc/cppcodeparser.cpp8
-rw-r--r--src/qdoc/node.cpp2
-rw-r--r--src/qdoc/node.h4
-rw-r--r--src/qdoc/qdocindexfiles.cpp4
-rw-r--r--src/qdoc/qdoctagfiles.cpp2
-rw-r--r--src/qdoc/tokenizer.cpp2
-rw-r--r--src/qdoc/tokenizer.h1
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,