From 368d5926cab83e8e64f01483f3005ac4d8c4d2d6 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 16 Feb 2012 10:54:44 +0100 Subject: C++: handle destructor names with template parameters. Change-Id: I74b4fd5e043db935abc18345b303d294b71e8fc2 Reviewed-by: Tobias Hunger Reviewed-by: Erik Verbruggen --- src/libs/3rdparty/cplusplus/AST.cpp | 10 ++++++---- src/libs/3rdparty/cplusplus/AST.h | 4 ++-- src/libs/3rdparty/cplusplus/ASTClone.cpp | 3 ++- src/libs/3rdparty/cplusplus/ASTMatcher.cpp | 5 ++++- src/libs/3rdparty/cplusplus/ASTPatternBuilder.h | 3 ++- src/libs/3rdparty/cplusplus/ASTVisit.cpp | 1 + src/libs/3rdparty/cplusplus/Bind.cpp | 5 ++--- src/libs/3rdparty/cplusplus/Control.cpp | 8 ++++---- src/libs/3rdparty/cplusplus/Control.h | 2 +- src/libs/3rdparty/cplusplus/Names.cpp | 13 ++++++++----- src/libs/3rdparty/cplusplus/Names.h | 6 ++++-- src/libs/3rdparty/cplusplus/Parser.cpp | 2 +- 12 files changed, 37 insertions(+), 25 deletions(-) (limited to 'src/libs/3rdparty') diff --git a/src/libs/3rdparty/cplusplus/AST.cpp b/src/libs/3rdparty/cplusplus/AST.cpp index 1b557d2872..ccef3893db 100644 --- a/src/libs/3rdparty/cplusplus/AST.cpp +++ b/src/libs/3rdparty/cplusplus/AST.cpp @@ -963,16 +963,18 @@ unsigned DestructorNameAST::firstToken() const { if (tilde_token) return tilde_token; - if (identifier_token) - return identifier_token; + if (unqualified_name) + if (unsigned candidate = unqualified_name->firstToken()) + return candidate; return 0; } /** \generated */ unsigned DestructorNameAST::lastToken() const { - if (identifier_token) - return identifier_token + 1; + if (unqualified_name) + if (unsigned candidate = unqualified_name->lastToken()) + return candidate; if (tilde_token) return tilde_token + 1; return 1; diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index 9dbc2b0320..22bc1024fe 100644 --- a/src/libs/3rdparty/cplusplus/AST.h +++ b/src/libs/3rdparty/cplusplus/AST.h @@ -2286,12 +2286,12 @@ class CPLUSPLUS_EXPORT DestructorNameAST: public NameAST { public: unsigned tilde_token; - unsigned identifier_token; + NameAST *unqualified_name; public: DestructorNameAST() : tilde_token(0) - , identifier_token(0) + , unqualified_name(0) {} virtual DestructorNameAST *asDestructorName() { return this; } diff --git a/src/libs/3rdparty/cplusplus/ASTClone.cpp b/src/libs/3rdparty/cplusplus/ASTClone.cpp index 2478f4f7f2..0d08f48af8 100644 --- a/src/libs/3rdparty/cplusplus/ASTClone.cpp +++ b/src/libs/3rdparty/cplusplus/ASTClone.cpp @@ -833,7 +833,8 @@ DestructorNameAST *DestructorNameAST::clone(MemoryPool *pool) const { DestructorNameAST *ast = new (pool) DestructorNameAST; ast->tilde_token = tilde_token; - ast->identifier_token = identifier_token; + if (unqualified_name) + ast->unqualified_name = unqualified_name->clone(pool); return ast; } diff --git a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp index a7b19ba99f..0b09d086e0 100644 --- a/src/libs/3rdparty/cplusplus/ASTMatcher.cpp +++ b/src/libs/3rdparty/cplusplus/ASTMatcher.cpp @@ -1416,7 +1416,10 @@ bool ASTMatcher::match(DestructorNameAST *node, DestructorNameAST *pattern) pattern->tilde_token = node->tilde_token; - pattern->identifier_token = node->identifier_token; + if (! pattern->unqualified_name) + pattern->unqualified_name = node->unqualified_name; + else if (! AST::match(node->unqualified_name, pattern->unqualified_name, this)) + return false; return true; } diff --git a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h index e318a32f07..41ad4964b2 100644 --- a/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h +++ b/src/libs/3rdparty/cplusplus/ASTPatternBuilder.h @@ -549,9 +549,10 @@ public: return __ast; } - DestructorNameAST *DestructorName() + DestructorNameAST *DestructorName(NameAST *unqualified_name = 0) { DestructorNameAST *__ast = new (&pool) DestructorNameAST; + __ast->unqualified_name = unqualified_name; return __ast; } diff --git a/src/libs/3rdparty/cplusplus/ASTVisit.cpp b/src/libs/3rdparty/cplusplus/ASTVisit.cpp index 41cf0cf755..f30523ee53 100644 --- a/src/libs/3rdparty/cplusplus/ASTVisit.cpp +++ b/src/libs/3rdparty/cplusplus/ASTVisit.cpp @@ -606,6 +606,7 @@ void SimpleNameAST::accept0(ASTVisitor *visitor) void DestructorNameAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { + accept(unqualified_name, visitor); } visitor->endVisit(this); } diff --git a/src/libs/3rdparty/cplusplus/Bind.cpp b/src/libs/3rdparty/cplusplus/Bind.cpp index 5f37dafc83..d35ca86452 100644 --- a/src/libs/3rdparty/cplusplus/Bind.cpp +++ b/src/libs/3rdparty/cplusplus/Bind.cpp @@ -91,7 +91,7 @@ unsigned Bind::location(NameAST *name, unsigned defaultLocation) const return defaultLocation; else if (DestructorNameAST *dtor = name->asDestructorName()) - return dtor->identifier_token; + return location(dtor->unqualified_name, defaultLocation); else if (TemplateIdAST *templId = name->asTemplateId()) return templId->identifier_token; @@ -2624,8 +2624,7 @@ bool Bind::visit(SimpleNameAST *ast) bool Bind::visit(DestructorNameAST *ast) { - const Identifier *id = identifier(ast->identifier_token); - _name = control()->destructorNameId(id); + _name = control()->destructorNameId(name(ast->unqualified_name)); ast->name = _name; return false; } diff --git a/src/libs/3rdparty/cplusplus/Control.cpp b/src/libs/3rdparty/cplusplus/Control.cpp index 87c3b54fdf..6864b8aaa4 100644 --- a/src/libs/3rdparty/cplusplus/Control.cpp +++ b/src/libs/3rdparty/cplusplus/Control.cpp @@ -227,9 +227,9 @@ public: return templateNameIds.intern(TemplateNameId(id, first, last)); } - const DestructorNameId *findOrInsertDestructorNameId(const Identifier *id) + const DestructorNameId *findOrInsertDestructorNameId(const Name *name) { - return destructorNameIds.intern(DestructorNameId(id)); + return destructorNameIds.intern(DestructorNameId(name)); } const OperatorNameId *findOrInsertOperatorNameId(OperatorNameId::Kind kind) @@ -610,8 +610,8 @@ const TemplateNameId *Control::templateNameId(const Identifier *id, return d->findOrInsertTemplateNameId(id, args, args + argv); } -const DestructorNameId *Control::destructorNameId(const Identifier *id) -{ return d->findOrInsertDestructorNameId(id); } +const DestructorNameId *Control::destructorNameId(const Name *name) +{ return d->findOrInsertDestructorNameId(name); } const OperatorNameId *Control::operatorNameId(OperatorNameId::Kind kind) { return d->findOrInsertOperatorNameId(kind); } diff --git a/src/libs/3rdparty/cplusplus/Control.h b/src/libs/3rdparty/cplusplus/Control.h index b8c03a4cb7..024d120821 100644 --- a/src/libs/3rdparty/cplusplus/Control.h +++ b/src/libs/3rdparty/cplusplus/Control.h @@ -55,7 +55,7 @@ public: unsigned argc = 0); /// Returns the canonical destructor name id. - const DestructorNameId *destructorNameId(const Identifier *id); + const DestructorNameId *destructorNameId(const Name *name); /// Returns the canonical operator name id. const OperatorNameId *operatorNameId(OperatorNameId::Kind operatorId); diff --git a/src/libs/3rdparty/cplusplus/Names.cpp b/src/libs/3rdparty/cplusplus/Names.cpp index 9e11e421e7..9024b65a91 100644 --- a/src/libs/3rdparty/cplusplus/Names.cpp +++ b/src/libs/3rdparty/cplusplus/Names.cpp @@ -62,8 +62,8 @@ bool QualifiedNameId::isEqualTo(const Name *other) const return false; } -DestructorNameId::DestructorNameId(const Identifier *identifier) - : _identifier(identifier) +DestructorNameId::DestructorNameId(const Name *name) + : _name(name) { } DestructorNameId::~DestructorNameId() @@ -72,8 +72,11 @@ DestructorNameId::~DestructorNameId() void DestructorNameId::accept0(NameVisitor *visitor) const { visitor->visit(this); } +const Name *DestructorNameId::name() const +{ return _name; } + const Identifier *DestructorNameId::identifier() const -{ return _identifier; } +{ return _name->identifier(); } bool DestructorNameId::isEqualTo(const Name *other) const { @@ -81,8 +84,8 @@ bool DestructorNameId::isEqualTo(const Name *other) const const DestructorNameId *d = other->asDestructorNameId(); if (! d) return false; - const Identifier *l = identifier(); - const Identifier *r = d->identifier(); + const Name *l = name(); + const Name *r = d->name(); return l->isEqualTo(r); } return false; diff --git a/src/libs/3rdparty/cplusplus/Names.h b/src/libs/3rdparty/cplusplus/Names.h index aa4562922b..70c782591f 100644 --- a/src/libs/3rdparty/cplusplus/Names.h +++ b/src/libs/3rdparty/cplusplus/Names.h @@ -57,9 +57,11 @@ private: class CPLUSPLUS_EXPORT DestructorNameId: public Name { public: - DestructorNameId(const Identifier *identifier); + DestructorNameId(const Name *name); virtual ~DestructorNameId(); + virtual const Name *name() const; + virtual const Identifier *identifier() const; virtual bool isEqualTo(const Name *other) const; @@ -71,7 +73,7 @@ protected: virtual void accept0(NameVisitor *visitor) const; private: - const Identifier *_identifier; + const Name *_name; }; class CPLUSPLUS_EXPORT TemplateNameId: public Name diff --git a/src/libs/3rdparty/cplusplus/Parser.cpp b/src/libs/3rdparty/cplusplus/Parser.cpp index 8d08e39044..39578a7bec 100644 --- a/src/libs/3rdparty/cplusplus/Parser.cpp +++ b/src/libs/3rdparty/cplusplus/Parser.cpp @@ -2740,7 +2740,7 @@ bool Parser::parseUnqualifiedName(NameAST *&node, bool acceptTemplateId) if (LA() == T_TILDE && LA(2) == T_IDENTIFIER) { DestructorNameAST *ast = new (_pool) DestructorNameAST; ast->tilde_token = consumeToken(); - ast->identifier_token = consumeToken(); + parseUnqualifiedName(ast->unqualified_name); node = ast; return true; } else if (LA() == T_OPERATOR) { -- cgit v1.2.3