aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus
diff options
context:
space:
mode:
authorDmitry Ashkadov <dmitry.ashkadov@gmail.com>2014-11-13 22:18:53 +0300
committerOrgad Shaneh <orgads@gmail.com>2016-06-22 17:47:59 +0000
commit43075f5fb165e764f11abd35c4cc06cbda969a20 (patch)
treeec7a69d1a1a4d72bb7d3d0a9eb2d342b7afcc650 /src/libs/3rdparty/cplusplus
parentc0f3094866923f27692e654f94cd55546f5c87d5 (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.cpp8
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.cpp6
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.h10
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;