aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty/cplusplus
diff options
context:
space:
mode:
authorOrgad Shaneh <orgad.shaneh@audiocodes.com>2016-07-31 23:53:01 +0300
committerOrgad Shaneh <orgads@gmail.com>2016-08-19 13:34:38 +0000
commite9197468083e98392f11ee51100734243a435f91 (patch)
tree28bef2a518b9fb9239deb0d9a774fb662fc093c6 /src/libs/3rdparty/cplusplus
parente920921f277fd8cbde509f92c5b3913f228da1c0 (diff)
C++: Store template typename argument declarator type
Differentiate class from typename. Used by a follow-up commit for pretty printing, preserving the original declarator. Change-Id: I496505f5062abb69d5552e5422db256d49d164c4 Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
Diffstat (limited to 'src/libs/3rdparty/cplusplus')
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.cpp2
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.cpp2
-rw-r--r--src/libs/3rdparty/cplusplus/Symbols.h3
3 files changed, 7 insertions, 0 deletions
diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp
index a97c71ec5c..1f082a6ec8 100644
--- a/src/libs/3rdparty/cplusplus/Bind.cpp
+++ b/src/libs/3rdparty/cplusplus/Bind.cpp
@@ -2388,9 +2388,11 @@ bool Bind::visit(TypenameTypeParameterAST *ast)
// unsigned dot_dot_dot_token = ast->dot_dot_dot_token;
const Name *name = this->name(ast->name);
ExpressionTy type_id = this->expression(ast->type_id);
+ CPlusPlus::Kind classKey = translationUnit()->tokenKind(ast->classkey_token);
TypenameArgument *arg = control()->newTypenameArgument(sourceLocation, name);
arg->setType(type_id);
+ arg->setClassDeclarator(classKey == T_CLASS);
ast->symbol = arg;
_scope->addMember(arg);
return false;
diff --git a/src/libs/3rdparty/cplusplus/Symbols.cpp b/src/libs/3rdparty/cplusplus/Symbols.cpp
index 6a69ca2dc4..253bb04788 100644
--- a/src/libs/3rdparty/cplusplus/Symbols.cpp
+++ b/src/libs/3rdparty/cplusplus/Symbols.cpp
@@ -171,11 +171,13 @@ void Argument::visitSymbol0(SymbolVisitor *visitor)
TypenameArgument::TypenameArgument(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
: Symbol(translationUnit, sourceLocation, name)
+ , _isClassDeclarator(false)
{ }
TypenameArgument::TypenameArgument(Clone *clone, Subst *subst, TypenameArgument *original)
: Symbol(clone, subst, original)
, _type(clone->type(original->_type, subst))
+ , _isClassDeclarator(original->_isClassDeclarator)
{ }
TypenameArgument::~TypenameArgument()
diff --git a/src/libs/3rdparty/cplusplus/Symbols.h b/src/libs/3rdparty/cplusplus/Symbols.h
index a545644cfa..4cd8141beb 100644
--- a/src/libs/3rdparty/cplusplus/Symbols.h
+++ b/src/libs/3rdparty/cplusplus/Symbols.h
@@ -187,6 +187,8 @@ public:
virtual ~TypenameArgument();
void setType(const FullySpecifiedType &type);
+ void setClassDeclarator(bool isClassDecl) { _isClassDeclarator = isClassDecl; }
+ bool isClassDeclarator() const { return _isClassDeclarator; }
// Symbol's interface
virtual FullySpecifiedType type() const;
@@ -202,6 +204,7 @@ protected:
private:
FullySpecifiedType _type;
+ bool _isClassDeclarator;
};
class CPLUSPLUS_EXPORT Block: public Scope