diff options
author | Dmitry Ashkadov <dmitry.ashkadov@gmail.com> | 2014-11-13 22:18:53 +0300 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2016-06-22 17:47:59 +0000 |
commit | 43075f5fb165e764f11abd35c4cc06cbda969a20 (patch) | |
tree | ec7a69d1a1a4d72bb7d3d0a9eb2d342b7afcc650 /src/libs/3rdparty/cplusplus | |
parent | c0f3094866923f27692e654f94cd55546f5c87d5 (diff) |
C++: Add support of ref-qualifier for functions.
Now the ref-qualifier (& or &&) of the function declaration
is propagated to GUI. For example, 'Refactor' -> 'Add Definition'
preserves the ref-qualifier.
Change-Id: I8ac4e1cad4e44985e94230aabbd9858a7e929fee
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r-- | src/libs/3rdparty/cplusplus/Bind.cpp | 8 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.cpp | 6 | ||||
-rw-r--r-- | src/libs/3rdparty/cplusplus/Symbols.h | 10 |
3 files changed, 24 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index d8f9861e7d..a97c71ec5c 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -3255,6 +3255,14 @@ bool Bind::visit(FunctionDeclaratorAST *ast) fun->setOverride(type.isOverride()); fun->setFinal(type.isFinal()); + // propagate ref-qualifier + if (ast->ref_qualifier_token) { + const Kind kind = tokenAt(ast->ref_qualifier_token).kind(); + CPP_CHECK(kind == T_AMPER || kind == T_AMPER_AMPER); // & or && are only allowed + fun->setRefQualifier(kind == T_AMPER ? Function::LvalueRefQualifier : + Function::RvalueRefQualifier); + } + this->exceptionSpecification(ast->exception_specification, type); if (ast->as_cpp_initializer != 0) { fun->setAmbiguous(true); diff --git a/src/libs/3rdparty/cplusplus/Symbols.cpp b/src/libs/3rdparty/cplusplus/Symbols.cpp index f8a8440c09..6a69ca2dc4 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.cpp +++ b/src/libs/3rdparty/cplusplus/Symbols.cpp @@ -367,6 +367,12 @@ bool Function::isPureVirtual() const void Function::setPureVirtual(bool isPureVirtual) { f._isPureVirtual = isPureVirtual; } +Function::RefQualifier Function::refQualifier() const +{ return static_cast<RefQualifier>(f._refQualifier); } + +void Function::setRefQualifier(Function::RefQualifier refQualifier) +{ f._refQualifier = refQualifier; } + bool Function::isAmbiguous() const { return f._isAmbiguous; } diff --git a/src/libs/3rdparty/cplusplus/Symbols.h b/src/libs/3rdparty/cplusplus/Symbols.h index 826c816b69..a545644cfa 100644 --- a/src/libs/3rdparty/cplusplus/Symbols.h +++ b/src/libs/3rdparty/cplusplus/Symbols.h @@ -298,6 +298,12 @@ public: InvokableMethod }; + enum RefQualifier { + NoRefQualifier, // a function declared w/o & and && => *this may be lvalue or rvalue + LvalueRefQualifier, // a function declared with & => *this is lvalue + RvalueRefQualifier // a function declared with && => *this is rvalue + }; + public: Function(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name); Function(Clone *clone, Subst *subst, Function *original); @@ -344,6 +350,9 @@ public: bool isPureVirtual() const; void setPureVirtual(bool isPureVirtual); + RefQualifier refQualifier() const; + void setRefQualifier(RefQualifier refQualifier); + bool isSignatureEqualTo(const Function *other, Matcher *matcher = 0) const; bool isAmbiguous() const; // internal @@ -384,6 +393,7 @@ private: unsigned _isVolatile: 1; unsigned _isAmbiguous: 1; unsigned _methodKey: 3; + unsigned _refQualifier: 2; }; union { unsigned _flags; |