summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-03-23 14:03:05 +0100
committerRoberto Raggi <roberto.raggi@nokia.com>2010-03-23 14:13:22 +0100
commiteebf498aaef5551b1863d61ffb5f46507093339b (patch)
tree5ba4f8e3040bfdec464a1c70bef13cfae5feb551 /src/shared/cplusplus
parentae715143606c1c432aa6f934578c10c3eee69f76 (diff)
downloadqt-creator-eebf498aaef5551b1863d61ffb5f46507093339b.tar.gz
Parse C++0x type-parameters.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp5
-rw-r--r--src/shared/cplusplus/AST.h4
-rw-r--r--src/shared/cplusplus/ASTClone.cpp2
-rw-r--r--src/shared/cplusplus/ASTMatcher.cpp4
-rw-r--r--src/shared/cplusplus/Parser.cpp4
5 files changed, 19 insertions, 0 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index c419ef8438..d5b605116d 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1727,6 +1727,9 @@ unsigned TemplateTypeParameterAST::lastToken() const
else if (name)
return name->lastToken();
+ else if (dot_dot_dot_token)
+ return dot_dot_dot_token + 1;
+
else if (class_token)
return class_token + 1;
@@ -1895,6 +1898,8 @@ unsigned TypenameTypeParameterAST::lastToken() const
return equal_token + 1;
else if (name)
return name->lastToken();
+ else if (dot_dot_dot_token)
+ return dot_dot_dot_token + 1;
return classkey_token + 1;
}
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 2bcb33add1..f0bbb04314 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -3215,6 +3215,7 @@ class CPLUSPLUS_EXPORT TypenameTypeParameterAST: public DeclarationAST
{
public:
unsigned classkey_token;
+ unsigned dot_dot_dot_token;
NameAST *name;
unsigned equal_token;
ExpressionAST *type_id;
@@ -3225,6 +3226,7 @@ public: // annotations
public:
TypenameTypeParameterAST()
: classkey_token(0)
+ , dot_dot_dot_token(0)
, name(0)
, equal_token(0)
, type_id(0)
@@ -3251,6 +3253,7 @@ public:
DeclarationListAST *template_parameter_list;
unsigned greater_token;
unsigned class_token;
+ unsigned dot_dot_dot_token;
NameAST *name;
unsigned equal_token;
ExpressionAST *type_id;
@@ -3265,6 +3268,7 @@ public:
, template_parameter_list(0)
, greater_token(0)
, class_token(0)
+ , dot_dot_dot_token(0)
, name(0)
, equal_token(0)
, type_id(0)
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index f33524e364..011d6ec230 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -1210,6 +1210,7 @@ TypenameTypeParameterAST *TypenameTypeParameterAST::clone(MemoryPool *pool) cons
{
TypenameTypeParameterAST *ast = new (pool) TypenameTypeParameterAST;
ast->classkey_token = classkey_token;
+ ast->dot_dot_dot_token = dot_dot_dot_token;
if (name)
ast->name = name->clone(pool);
ast->equal_token = equal_token;
@@ -1228,6 +1229,7 @@ TemplateTypeParameterAST *TemplateTypeParameterAST::clone(MemoryPool *pool) cons
*ast_iter = new (pool) DeclarationListAST((iter->value) ? iter->value->clone(pool) : 0);
ast->greater_token = greater_token;
ast->class_token = class_token;
+ ast->dot_dot_dot_token = dot_dot_dot_token;
if (name)
ast->name = name->clone(pool);
ast->equal_token = equal_token;
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index 84623bb610..3fe3a8d410 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -2017,6 +2017,8 @@ bool ASTMatcher::match(TypenameTypeParameterAST *node, TypenameTypeParameterAST
pattern->classkey_token = node->classkey_token;
+ pattern->dot_dot_dot_token = node->dot_dot_dot_token;
+
if (! pattern->name)
pattern->name = node->name;
else if (! AST::match(node->name, pattern->name, this))
@@ -2050,6 +2052,8 @@ bool ASTMatcher::match(TemplateTypeParameterAST *node, TemplateTypeParameterAST
pattern->class_token = node->class_token;
+ pattern->dot_dot_dot_token = node->dot_dot_dot_token;
+
if (! pattern->name)
pattern->name = node->name;
else if (! AST::match(node->name, pattern->name, this))
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index e08fce0416..e9fac60fb3 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -1494,6 +1494,8 @@ bool Parser::parseTypenameTypeParameter(DeclarationAST *&node)
if (LA() == T_CLASS || LA() == T_TYPENAME) {
TypenameTypeParameterAST *ast = new (_pool) TypenameTypeParameterAST;
ast->classkey_token = consumeToken();
+ if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT)
+ ast->dot_dot_dot_token = consumeToken();
parseName(ast->name);
if (LA() == T_EQUAL) {
ast->equal_token = consumeToken();
@@ -1518,6 +1520,8 @@ bool Parser::parseTemplateTypeParameter(DeclarationAST *&node)
ast->greater_token = consumeToken();
if (LA() == T_CLASS)
ast->class_token = consumeToken();
+ if (_cxx0xEnabled && LA() == T_DOT_DOT_DOT)
+ ast->dot_dot_dot_token = consumeToken();
// parse optional name
parseName(ast->name);