From 7a3fbf120a48b02e23057ea681f9c7df9af3dd93 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen <erik.verbruggen@nokia.com> Date: Mon, 22 Mar 2010 18:23:17 +0100 Subject: [PATCH] Added attributes to the elaborate-type-specifier AST node. --- src/shared/cplusplus/AST.cpp | 2 ++ src/shared/cplusplus/AST.h | 2 ++ src/shared/cplusplus/ASTClone.cpp | 3 +++ src/shared/cplusplus/ASTMatcher.cpp | 5 +++++ src/shared/cplusplus/ASTVisit.cpp | 1 + 5 files changed, 13 insertions(+) diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index d5b605116dc..785b8178d44 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -834,6 +834,8 @@ unsigned ElaboratedTypeSpecifierAST::lastToken() const { if (name) return name->lastToken(); + if (attribute_list) + return attribute_list->lastToken(); return classkey_token + 1; } diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index f0bbb04314b..11f038db5a6 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -1559,11 +1559,13 @@ class CPLUSPLUS_EXPORT ElaboratedTypeSpecifierAST: public SpecifierAST { public: unsigned classkey_token; + SpecifierListAST *attribute_list; NameAST *name; public: ElaboratedTypeSpecifierAST() : classkey_token(0) + , attribute_list(0) , name(0) {} diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp index 011d6ec230f..586d88e21a7 100644 --- a/src/shared/cplusplus/ASTClone.cpp +++ b/src/shared/cplusplus/ASTClone.cpp @@ -528,6 +528,9 @@ ElaboratedTypeSpecifierAST *ElaboratedTypeSpecifierAST::clone(MemoryPool *pool) { ElaboratedTypeSpecifierAST *ast = new (pool) ElaboratedTypeSpecifierAST; ast->classkey_token = classkey_token; + for (SpecifierListAST *iter = attribute_list, **ast_iter = &ast->attribute_list; + iter; iter = iter->next, ast_iter = &(*ast_iter)->next) + *ast_iter = new (pool) SpecifierListAST((iter->value) ? iter->value->clone(pool) : 0); if (name) ast->name = name->clone(pool); return ast; diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp index 3fe3a8d410c..42cbadcbdbf 100644 --- a/src/shared/cplusplus/ASTMatcher.cpp +++ b/src/shared/cplusplus/ASTMatcher.cpp @@ -874,6 +874,11 @@ bool ASTMatcher::match(ElaboratedTypeSpecifierAST *node, ElaboratedTypeSpecifier pattern->classkey_token = node->classkey_token; + if (! pattern->attribute_list) + pattern->attribute_list = node->attribute_list; + else if (! AST::match(node->attribute_list, pattern->attribute_list, this)) + return false; + if (! pattern->name) pattern->name = node->name; else if (! AST::match(node->name, pattern->name, this)) diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index 4c0a2e98d47..8216f87b488 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -391,6 +391,7 @@ void NamedTypeSpecifierAST::accept0(ASTVisitor *visitor) void ElaboratedTypeSpecifierAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { + accept(attribute_list, visitor); accept(name, visitor); } visitor->endVisit(this); -- GitLab