aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/3rdparty
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2012-02-16 10:54:44 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2012-02-23 08:39:34 +0100
commit368d5926cab83e8e64f01483f3005ac4d8c4d2d6 (patch)
tree53b5f94e6babbc242584fdd42a4473312a36e9ac /src/libs/3rdparty
parentc9999a9382ecf5ca2571b4b032e50673c3080f42 (diff)
C++: handle destructor names with template parameters.
Change-Id: I74b4fd5e043db935abc18345b303d294b71e8fc2 Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com> Reviewed-by: Erik Verbruggen <erik.verbruggen@nokia.com>
Diffstat (limited to 'src/libs/3rdparty')
-rw-r--r--src/libs/3rdparty/cplusplus/AST.cpp10
-rw-r--r--src/libs/3rdparty/cplusplus/AST.h4
-rw-r--r--src/libs/3rdparty/cplusplus/ASTClone.cpp3
-rw-r--r--src/libs/3rdparty/cplusplus/ASTMatcher.cpp5
-rw-r--r--src/libs/3rdparty/cplusplus/ASTPatternBuilder.h3
-rw-r--r--src/libs/3rdparty/cplusplus/ASTVisit.cpp1
-rw-r--r--src/libs/3rdparty/cplusplus/Bind.cpp5
-rw-r--r--src/libs/3rdparty/cplusplus/Control.cpp8
-rw-r--r--src/libs/3rdparty/cplusplus/Control.h2
-rw-r--r--src/libs/3rdparty/cplusplus/Names.cpp13
-rw-r--r--src/libs/3rdparty/cplusplus/Names.h6
-rw-r--r--src/libs/3rdparty/cplusplus/Parser.cpp2
12 files changed, 37 insertions, 25 deletions
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) {