diff options
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r-- | src/shared/cplusplus/AST.cpp | 4 | ||||
-rw-r--r-- | src/shared/cplusplus/AST.h | 4 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTClone.cpp | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatcher.cpp | 2 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 7 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.h | 2 |
6 files changed, 15 insertions, 5 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index 3d5f80a7f5..bfe4d2d325 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -3687,6 +3687,8 @@ unsigned TemplateDeclarationAST::lastToken() const /** \generated */ unsigned TemplateIdAST::firstToken() const { + if (template_token) + return template_token; if (identifier_token) return identifier_token; if (less_token) @@ -3711,6 +3713,8 @@ unsigned TemplateIdAST::lastToken() const return less_token + 1; if (identifier_token) return identifier_token + 1; + if (template_token) + return template_token + 1; return 0; } diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 227eb21483..8db76fb459 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -2214,6 +2214,7 @@ protected: class CPLUSPLUS_EXPORT TemplateIdAST: public NameAST { public: + unsigned template_token; unsigned identifier_token; unsigned less_token; ExpressionListAST *template_argument_list; @@ -2221,7 +2222,8 @@ public: public: TemplateIdAST() - : identifier_token(0) + : template_token(0) + , identifier_token(0) , less_token(0) , template_argument_list(0) , greater_token(0) diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp index 996d4dbda5..9b837e1384 100644 --- a/src/shared/cplusplus/ASTClone.cpp +++ b/src/shared/cplusplus/ASTClone.cpp @@ -802,6 +802,7 @@ DestructorNameAST *DestructorNameAST::clone(MemoryPool *pool) const TemplateIdAST *TemplateIdAST::clone(MemoryPool *pool) const { TemplateIdAST *ast = new (pool) TemplateIdAST; + ast->template_token = template_token; ast->identifier_token = identifier_token; ast->less_token = less_token; for (ExpressionListAST *iter = template_argument_list, **ast_iter = &ast->template_argument_list; diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp index 2b4c88bf93..5737bf0f53 100644 --- a/src/shared/cplusplus/ASTMatcher.cpp +++ b/src/shared/cplusplus/ASTMatcher.cpp @@ -1347,6 +1347,8 @@ bool ASTMatcher::match(TemplateIdAST *node, TemplateIdAST *pattern) (void) node; (void) pattern; + pattern->template_token = node->template_token; + pattern->identifier_token = node->identifier_token; pattern->less_token = node->less_token; diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 07b0a018a5..ad20ef7af4 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -419,14 +419,14 @@ bool Parser::parseClassOrNamespaceName(NameAST *&node) } } else if (LA() == T_TEMPLATE) { unsigned template_token = consumeToken(); - if (parseTemplateId(node)) + if (parseTemplateId(node, template_token)) return true; rewind(template_token); } return false; } -bool Parser::parseTemplateId(NameAST *&node) +bool Parser::parseTemplateId(NameAST *&node, unsigned template_token) { DEBUG_THIS_RULE(); @@ -434,6 +434,7 @@ bool Parser::parseTemplateId(NameAST *&node) if (LA() == T_IDENTIFIER && LA(2) == T_LESS) { TemplateIdAST *ast = new (_pool) TemplateIdAST; + ast->template_token = template_token; ast->identifier_token = consumeToken(); ast->less_token = consumeToken(); if (LA() == T_GREATER || parseTemplateArgumentList( @@ -2642,7 +2643,7 @@ bool Parser::parseUnqualifiedName(NameAST *&node, bool acceptTemplateId) return true; } else if (LA() == T_TEMPLATE) { unsigned template_token = consumeToken(); - if (parseTemplateId(node)) + if (parseTemplateId(node, template_token)) return true; rewind(template_token); } diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index 4b19f1cf10..11743346a4 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -147,7 +147,7 @@ public: bool parseMemInitializerList(MemInitializerListAST *&node); bool parseMemberSpecification(DeclarationAST *&node); bool parseMultiplicativeExpression(ExpressionAST *&node); - bool parseTemplateId(NameAST *&node); + bool parseTemplateId(NameAST *&node, unsigned template_token = 0); bool parseClassOrNamespaceName(NameAST *&node); bool parseNameId(NameAST *&node); bool parseName(NameAST *&node, bool acceptTemplateId = true); |