summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-02-23 17:43:40 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-02-23 17:43:52 +0100
commite609e9a70176d5cad7c823f60ab2a7f736d32e41 (patch)
treedeee593ad3061063aca36eed984f4bc34f7a3cd2
parent69dfa3566ceadc08d5f9be4dceae65b5b6ceafee (diff)
downloadqt-creator-e609e9a70176d5cad7c823f60ab2a7f736d32e41.tar.gz
Simplified ObjC selectors in the AST.
-rw-r--r--src/libs/cplusplus/FindUsages.cpp19
-rw-r--r--src/libs/cplusplus/FindUsages.h3
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp4
-rw-r--r--src/shared/cplusplus/AST.cpp29
-rw-r--r--src/shared/cplusplus/AST.h91
-rw-r--r--src/shared/cplusplus/ASTClone.cpp41
-rw-r--r--src/shared/cplusplus/ASTMatch0.cpp40
-rw-r--r--src/shared/cplusplus/ASTMatcher.cpp60
-rw-r--r--src/shared/cplusplus/ASTMatcher.h3
-rw-r--r--src/shared/cplusplus/ASTPatternBuilder.h12
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp37
-rw-r--r--src/shared/cplusplus/ASTVisitor.h6
-rw-r--r--src/shared/cplusplus/ASTfwd.h2
-rw-r--r--src/shared/cplusplus/CheckDeclarator.cpp16
-rw-r--r--src/shared/cplusplus/CheckName.cpp31
-rw-r--r--src/shared/cplusplus/CheckName.h4
-rw-r--r--src/shared/cplusplus/Parser.cpp44
-rw-r--r--src/shared/cplusplus/Semantic.cpp3
-rw-r--r--src/shared/cplusplus/Semantic.h1
-rw-r--r--tests/auto/cplusplus/ast/tst_ast.cpp19
-rw-r--r--tests/auto/cplusplus/semantic/tst_semantic.cpp7
21 files changed, 177 insertions, 295 deletions
diff --git a/src/libs/cplusplus/FindUsages.cpp b/src/libs/cplusplus/FindUsages.cpp
index a8d0e456b6..83a6b57135 100644
--- a/src/libs/cplusplus/FindUsages.cpp
+++ b/src/libs/cplusplus/FindUsages.cpp
@@ -463,29 +463,26 @@ bool FindUsages::visit(SimpleDeclarationAST *ast)
return false;
}
-bool FindUsages::visit(ObjCSelectorWithoutArgumentsAST *ast)
+bool FindUsages::visit(ObjCSelectorAST *ast)
{
- const Identifier *id = identifier(ast->name_token);
+#if 1
+ const Identifier *id = ast->name->identifier();
if (id == _id) {
LookupContext context = currentContext(ast);
- const QList<Symbol *> candidates = context.resolve(ast->selector_name);
- reportResult(ast->name_token, candidates);
+ const QList<Symbol *> candidates = context.resolve(ast->name);
+ reportResult(ast->firstToken(), candidates);
}
-
- return false;
-}
-
-bool FindUsages::visit(ObjCSelectorWithArgumentsAST *ast)
-{
+#else
for (ObjCSelectorArgumentListAST *iter = ast->selector_argument_list; iter;
iter = iter->next) {
const Identifier *id = identifier(iter->value->name_token);
if (id == _id) {
LookupContext context = currentContext(iter->value);
- const QList<Symbol *> candidates = context.resolve(ast->selector_name);
+ const QList<Symbol *> candidates = context.resolve(ast->name);
reportResult(iter->value->name_token, candidates);
}
}
+#endif
return false;
}
diff --git a/src/libs/cplusplus/FindUsages.h b/src/libs/cplusplus/FindUsages.h
index 313676fc90..ef964deb9e 100644
--- a/src/libs/cplusplus/FindUsages.h
+++ b/src/libs/cplusplus/FindUsages.h
@@ -99,8 +99,7 @@ protected:
virtual bool visit(ExpressionOrDeclarationStatementAST *ast);
virtual bool visit(FunctionDeclaratorAST *ast);
virtual bool visit(SimpleDeclarationAST *);
- virtual bool visit(ObjCSelectorWithoutArgumentsAST *ast);
- virtual bool visit(ObjCSelectorWithArgumentsAST *ast);
+ virtual bool visit(ObjCSelectorAST *ast);
private:
const Identifier *_id;
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 2425fef422..4102043e74 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -803,12 +803,12 @@ bool ResolveExpression::visit(ObjCMessageExpressionAST *ast)
}
}
- if (klassName&&ast->selector && ast->selector->selector_name) {
+ if (klassName&&ast->selector && ast->selector->name) {
ResolveObjCClass resolveObjCClass;
QList<Symbol *> resolvedSymbols = resolveObjCClass(klassName, result, _context);
foreach (Symbol *resolvedSymbol, resolvedSymbols)
if (ObjCClass *klass = resolvedSymbol->asObjCClass())
- _results.append(resolveMember(ast->selector->selector_name, klass));
+ _results.append(resolveMember(ast->selector->name, klass));
}
}
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index c85e4a7b6f..91631c8a05 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1498,6 +1498,15 @@ unsigned SimpleNameAST::lastToken() const
return identifier_token + 1;
}
+unsigned ObjCSelectorAST::firstToken() const
+{
+ return selector_argument_list->firstToken();
+}
+
+unsigned ObjCSelectorAST::lastToken() const
+{
+ return selector_argument_list->lastToken();
+}
unsigned SimpleSpecifierAST::firstToken() const
{
@@ -2089,16 +2098,6 @@ unsigned ObjCEncodeExpressionAST::lastToken() const
return encode_token + 1;
}
-unsigned ObjCSelectorWithoutArgumentsAST::firstToken() const
-{
- return name_token;
-}
-
-unsigned ObjCSelectorWithoutArgumentsAST::lastToken() const
-{
- return name_token + 1;
-}
-
unsigned ObjCSelectorArgumentAST::firstToken() const
{
return name_token;
@@ -2112,16 +2111,6 @@ unsigned ObjCSelectorArgumentAST::lastToken() const
return name_token + 1;
}
-unsigned ObjCSelectorWithArgumentsAST::firstToken() const
-{
- return selector_argument_list->firstToken();
-}
-
-unsigned ObjCSelectorWithArgumentsAST::lastToken() const
-{
- return selector_argument_list->lastToken();
-}
-
unsigned ObjCSelectorExpressionAST::firstToken() const
{
return selector_token;
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index cccba947ee..9b30e6c8ca 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -238,8 +238,6 @@ public:
virtual ObjCSelectorAST *asObjCSelector() { return 0; }
virtual ObjCSelectorArgumentAST *asObjCSelectorArgument() { return 0; }
virtual ObjCSelectorExpressionAST *asObjCSelectorExpression() { return 0; }
- virtual ObjCSelectorWithArgumentsAST *asObjCSelectorWithArguments() { return 0; }
- virtual ObjCSelectorWithoutArgumentsAST *asObjCSelectorWithoutArguments() { return 0; }
virtual ObjCSynchronizedStatementAST *asObjCSynchronizedStatement() { return 0; }
virtual ObjCSynthesizedPropertiesDeclarationAST *asObjCSynthesizedPropertiesDeclaration() { return 0; }
virtual ObjCSynthesizedPropertyAST *asObjCSynthesizedProperty() { return 0; }
@@ -371,15 +369,41 @@ public:
virtual PostfixDeclaratorAST *clone(MemoryPool *pool) const = 0;
};
-class CPLUSPLUS_EXPORT ObjCSelectorAST: public AST
+class CPLUSPLUS_EXPORT ObjCSelectorArgumentAST: public AST
{
-public: // annotation
- const Name *selector_name;
+public:
+ unsigned name_token;
+ unsigned colon_token;
+
+public:
+ virtual ObjCSelectorArgumentAST *asObjCSelectorArgument() { return this; }
+
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+ virtual ObjCSelectorArgumentAST *clone(MemoryPool *pool) const;
+
+protected:
+ virtual void accept0(ASTVisitor *visitor);
+ virtual bool match0(AST *, ASTMatcher *);
+};
+
+class CPLUSPLUS_EXPORT ObjCSelectorAST: public NameAST
+{
+public:
+ ObjCSelectorArgumentListAST *selector_argument_list;
public:
virtual ObjCSelectorAST *asObjCSelector() { return this; }
- virtual ObjCSelectorAST *clone(MemoryPool *pool) const = 0;
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+ virtual ObjCSelectorAST *clone(MemoryPool *pool) const;
+
+protected:
+ virtual void accept0(ASTVisitor *visitor);
+ virtual bool match0(AST *, ASTMatcher *);
};
class CPLUSPLUS_EXPORT SimpleSpecifierAST: public SpecifierAST
@@ -2766,61 +2790,6 @@ protected:
virtual bool match0(AST *, ASTMatcher *);
};
-class CPLUSPLUS_EXPORT ObjCSelectorWithoutArgumentsAST: public ObjCSelectorAST
-{
-public:
- unsigned name_token;
-
-public:
- virtual ObjCSelectorWithoutArgumentsAST *asObjCSelectorWithoutArguments() { return this; }
-
- virtual unsigned firstToken() const;
- virtual unsigned lastToken() const;
-
- virtual ObjCSelectorWithoutArgumentsAST *clone(MemoryPool *pool) const;
-
-protected:
- virtual void accept0(ASTVisitor *visitor);
- virtual bool match0(AST *, ASTMatcher *);
-};
-
-class CPLUSPLUS_EXPORT ObjCSelectorArgumentAST: public AST
-{
-public:
- unsigned name_token;
- unsigned colon_token;
-
-public:
- virtual ObjCSelectorArgumentAST *asObjCSelectorArgument() { return this; }
-
- virtual unsigned firstToken() const;
- virtual unsigned lastToken() const;
-
- virtual ObjCSelectorArgumentAST *clone(MemoryPool *pool) const;
-
-protected:
- virtual void accept0(ASTVisitor *visitor);
- virtual bool match0(AST *, ASTMatcher *);
-};
-
-class CPLUSPLUS_EXPORT ObjCSelectorWithArgumentsAST: public ObjCSelectorAST
-{
-public:
- ObjCSelectorArgumentListAST *selector_argument_list;
-
-public:
- virtual ObjCSelectorWithArgumentsAST *asObjCSelectorWithArguments() { return this; }
-
- virtual unsigned firstToken() const;
- virtual unsigned lastToken() const;
-
- virtual ObjCSelectorWithArgumentsAST *clone(MemoryPool *pool) const;
-
-protected:
- virtual void accept0(ASTVisitor *visitor);
- virtual bool match0(AST *, ASTMatcher *);
-};
-
class CPLUSPLUS_EXPORT ObjCSelectorExpressionAST: public ExpressionAST
{
public:
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index 984b7d9526..4b9ee11468 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -40,6 +40,23 @@
using namespace CPlusPlus;
+ObjCSelectorArgumentAST *ObjCSelectorArgumentAST::clone(MemoryPool *pool) const
+{
+ ObjCSelectorArgumentAST *ast = new (pool) ObjCSelectorArgumentAST;
+ ast->name_token = name_token;
+ ast->colon_token = colon_token;
+ return ast;
+}
+
+ObjCSelectorAST *ObjCSelectorAST::clone(MemoryPool *pool) const
+{
+ ObjCSelectorAST *ast = new (pool) ObjCSelectorAST;
+ for (ObjCSelectorArgumentListAST *iter = selector_argument_list, **ast_iter = &ast->selector_argument_list;
+ iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
+ *ast_iter = new (pool) ObjCSelectorArgumentListAST((iter->value) ? iter->value->clone(pool) : 0);
+ return ast;
+}
+
SimpleSpecifierAST *SimpleSpecifierAST::clone(MemoryPool *pool) const
{
SimpleSpecifierAST *ast = new (pool) SimpleSpecifierAST;
@@ -1351,30 +1368,6 @@ ObjCEncodeExpressionAST *ObjCEncodeExpressionAST::clone(MemoryPool *pool) const
return ast;
}
-ObjCSelectorWithoutArgumentsAST *ObjCSelectorWithoutArgumentsAST::clone(MemoryPool *pool) const
-{
- ObjCSelectorWithoutArgumentsAST *ast = new (pool) ObjCSelectorWithoutArgumentsAST;
- ast->name_token = name_token;
- return ast;
-}
-
-ObjCSelectorArgumentAST *ObjCSelectorArgumentAST::clone(MemoryPool *pool) const
-{
- ObjCSelectorArgumentAST *ast = new (pool) ObjCSelectorArgumentAST;
- ast->name_token = name_token;
- ast->colon_token = colon_token;
- return ast;
-}
-
-ObjCSelectorWithArgumentsAST *ObjCSelectorWithArgumentsAST::clone(MemoryPool *pool) const
-{
- ObjCSelectorWithArgumentsAST *ast = new (pool) ObjCSelectorWithArgumentsAST;
- for (ObjCSelectorArgumentListAST *iter = selector_argument_list, **ast_iter = &ast->selector_argument_list;
- iter; iter = iter->next, ast_iter = &(*ast_iter)->next)
- *ast_iter = new (pool) ObjCSelectorArgumentListAST((iter->value) ? iter->value->clone(pool) : 0);
- return ast;
-}
-
ObjCSelectorExpressionAST *ObjCSelectorExpressionAST::clone(MemoryPool *pool) const
{
ObjCSelectorExpressionAST *ast = new (pool) ObjCSelectorExpressionAST;
diff --git a/src/shared/cplusplus/ASTMatch0.cpp b/src/shared/cplusplus/ASTMatch0.cpp
index 8ffc5e6cbd..86c0db3b68 100644
--- a/src/shared/cplusplus/ASTMatch0.cpp
+++ b/src/shared/cplusplus/ASTMatch0.cpp
@@ -41,6 +41,22 @@
using namespace CPlusPlus;
+bool ObjCSelectorArgumentAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+ if (ObjCSelectorArgumentAST *_other = pattern->asObjCSelectorArgument())
+ return matcher->match(this, _other);
+
+ return false;
+}
+
+bool ObjCSelectorAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+ if (ObjCSelectorAST *_other = pattern->asObjCSelector())
+ return matcher->match(this, _other);
+
+ return false;
+}
+
bool SimpleSpecifierAST::match0(AST *pattern, ASTMatcher *matcher)
{
if (SimpleSpecifierAST *_other = pattern->asSimpleSpecifier())
@@ -937,30 +953,6 @@ bool ObjCEncodeExpressionAST::match0(AST *pattern, ASTMatcher *matcher)
return false;
}
-bool ObjCSelectorWithoutArgumentsAST::match0(AST *pattern, ASTMatcher *matcher)
-{
- if (ObjCSelectorWithoutArgumentsAST *_other = pattern->asObjCSelectorWithoutArguments())
- return matcher->match(this, _other);
-
- return false;
-}
-
-bool ObjCSelectorArgumentAST::match0(AST *pattern, ASTMatcher *matcher)
-{
- if (ObjCSelectorArgumentAST *_other = pattern->asObjCSelectorArgument())
- return matcher->match(this, _other);
-
- return false;
-}
-
-bool ObjCSelectorWithArgumentsAST::match0(AST *pattern, ASTMatcher *matcher)
-{
- if (ObjCSelectorWithArgumentsAST *_other = pattern->asObjCSelectorWithArguments())
- return matcher->match(this, _other);
-
- return false;
-}
-
bool ObjCSelectorExpressionAST::match0(AST *pattern, ASTMatcher *matcher)
{
if (ObjCSelectorExpressionAST *_other = pattern->asObjCSelectorExpression())
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index e891d606ce..0c22933218 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -47,6 +47,31 @@ ASTMatcher::ASTMatcher()
ASTMatcher::~ASTMatcher()
{ }
+bool ASTMatcher::match(ObjCSelectorArgumentAST *node, ObjCSelectorArgumentAST *pattern)
+{
+ (void) node;
+ (void) pattern;
+
+ pattern->name_token = node->name_token;
+
+ pattern->colon_token = node->colon_token;
+
+ return true;
+}
+
+bool ASTMatcher::match(ObjCSelectorAST *node, ObjCSelectorAST *pattern)
+{
+ (void) node;
+ (void) pattern;
+
+ if (! pattern->selector_argument_list)
+ pattern->selector_argument_list = node->selector_argument_list;
+ else if (! AST::match(node->selector_argument_list, pattern->selector_argument_list, this))
+ return false;
+
+ return true;
+}
+
bool ASTMatcher::match(SimpleSpecifierAST *node, SimpleSpecifierAST *pattern)
{
(void) node;
@@ -2272,41 +2297,6 @@ bool ASTMatcher::match(ObjCEncodeExpressionAST *node, ObjCEncodeExpressionAST *p
return true;
}
-bool ASTMatcher::match(ObjCSelectorWithoutArgumentsAST *node, ObjCSelectorWithoutArgumentsAST *pattern)
-{
- (void) node;
- (void) pattern;
-
- pattern->name_token = node->name_token;
-
- return true;
-}
-
-bool ASTMatcher::match(ObjCSelectorArgumentAST *node, ObjCSelectorArgumentAST *pattern)
-{
- (void) node;
- (void) pattern;
-
- pattern->name_token = node->name_token;
-
- pattern->colon_token = node->colon_token;
-
- return true;
-}
-
-bool ASTMatcher::match(ObjCSelectorWithArgumentsAST *node, ObjCSelectorWithArgumentsAST *pattern)
-{
- (void) node;
- (void) pattern;
-
- if (! pattern->selector_argument_list)
- pattern->selector_argument_list = node->selector_argument_list;
- else if (! AST::match(node->selector_argument_list, pattern->selector_argument_list, this))
- return false;
-
- return true;
-}
-
bool ASTMatcher::match(ObjCSelectorExpressionAST *node, ObjCSelectorExpressionAST *pattern)
{
(void) node;
diff --git a/src/shared/cplusplus/ASTMatcher.h b/src/shared/cplusplus/ASTMatcher.h
index d0b1e1cfff..7d4f5b5b96 100644
--- a/src/shared/cplusplus/ASTMatcher.h
+++ b/src/shared/cplusplus/ASTMatcher.h
@@ -146,14 +146,13 @@ public:
virtual bool match(ObjCProtocolDeclarationAST *node, ObjCProtocolDeclarationAST *pattern);
virtual bool match(ObjCProtocolForwardDeclarationAST *node, ObjCProtocolForwardDeclarationAST *pattern);
virtual bool match(ObjCProtocolRefsAST *node, ObjCProtocolRefsAST *pattern);
+ virtual bool match(ObjCSelectorAST *node, ObjCSelectorAST *pattern);
virtual bool match(ObjCMessageExpressionAST *node, ObjCMessageExpressionAST *pattern);
virtual bool match(ObjCMessageArgumentAST *node, ObjCMessageArgumentAST *pattern);
virtual bool match(ObjCProtocolExpressionAST *node, ObjCProtocolExpressionAST *pattern);
virtual bool match(ObjCTypeNameAST *node, ObjCTypeNameAST *pattern);
virtual bool match(ObjCEncodeExpressionAST *node, ObjCEncodeExpressionAST *pattern);
- virtual bool match(ObjCSelectorWithoutArgumentsAST *node, ObjCSelectorWithoutArgumentsAST *pattern);
virtual bool match(ObjCSelectorArgumentAST *node, ObjCSelectorArgumentAST *pattern);
- virtual bool match(ObjCSelectorWithArgumentsAST *node, ObjCSelectorWithArgumentsAST *pattern);
virtual bool match(ObjCSelectorExpressionAST *node, ObjCSelectorExpressionAST *pattern);
virtual bool match(ObjCInstanceVariablesDeclarationAST *node, ObjCInstanceVariablesDeclarationAST *pattern);
virtual bool match(ObjCVisibilityDeclarationAST *node, ObjCVisibilityDeclarationAST *pattern);
diff --git a/src/shared/cplusplus/ASTPatternBuilder.h b/src/shared/cplusplus/ASTPatternBuilder.h
index aa95d8fe35..5d8da60a00 100644
--- a/src/shared/cplusplus/ASTPatternBuilder.h
+++ b/src/shared/cplusplus/ASTPatternBuilder.h
@@ -788,24 +788,12 @@ public:
return __ast;
}
- ObjCSelectorWithoutArgumentsAST *ObjCSelectorWithoutArguments()
- {
- ObjCSelectorWithoutArgumentsAST *__ast = new (&pool) ObjCSelectorWithoutArgumentsAST;
- return __ast;
- }
-
ObjCSelectorArgumentAST *ObjCSelectorArgument()
{
ObjCSelectorArgumentAST *__ast = new (&pool) ObjCSelectorArgumentAST;
return __ast;
}
- ObjCSelectorWithArgumentsAST *ObjCSelectorWithArguments()
- {
- ObjCSelectorWithArgumentsAST *__ast = new (&pool) ObjCSelectorWithArgumentsAST;
- return __ast;
- }
-
ObjCSelectorExpressionAST *ObjCSelectorExpression(ObjCSelectorAST *selector = 0)
{
ObjCSelectorExpressionAST *__ast = new (&pool) ObjCSelectorExpressionAST;
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index b7fccf6e48..92e38f8265 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -41,6 +41,21 @@
using namespace CPlusPlus;
+void ObjCSelectorArgumentAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ }
+ visitor->endVisit(this);
+}
+
+void ObjCSelectorAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ accept(selector_argument_list, visitor);
+ }
+ visitor->endVisit(this);
+}
+
void SimpleSpecifierAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
@@ -995,28 +1010,6 @@ void ObjCEncodeExpressionAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this);
}
-void ObjCSelectorWithoutArgumentsAST::accept0(ASTVisitor *visitor)
-{
- if (visitor->visit(this)) {
- }
- visitor->endVisit(this);
-}
-
-void ObjCSelectorArgumentAST::accept0(ASTVisitor *visitor)
-{
- if (visitor->visit(this)) {
- }
- visitor->endVisit(this);
-}
-
-void ObjCSelectorWithArgumentsAST::accept0(ASTVisitor *visitor)
-{
- if (visitor->visit(this)) {
- accept(selector_argument_list, visitor);
- }
- visitor->endVisit(this);
-}
-
void ObjCSelectorExpressionAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index aedf129594..e343c4e9be 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -211,14 +211,13 @@ public:
virtual bool visit(ObjCProtocolDeclarationAST *) { return true; }
virtual bool visit(ObjCProtocolForwardDeclarationAST *) { return true; }
virtual bool visit(ObjCProtocolRefsAST *) { return true; }
+ virtual bool visit(ObjCSelectorAST *) { return true; }
virtual bool visit(ObjCMessageExpressionAST *) { return true; }
virtual bool visit(ObjCMessageArgumentAST *) { return true; }
virtual bool visit(ObjCProtocolExpressionAST *) { return true; }
virtual bool visit(ObjCTypeNameAST *) { return true; }
virtual bool visit(ObjCEncodeExpressionAST *) { return true; }
- virtual bool visit(ObjCSelectorWithoutArgumentsAST *) { return true; }
virtual bool visit(ObjCSelectorArgumentAST *) { return true; }
- virtual bool visit(ObjCSelectorWithArgumentsAST *) { return true; }
virtual bool visit(ObjCSelectorExpressionAST *) { return true; }
virtual bool visit(ObjCInstanceVariablesDeclarationAST *) { return true; }
virtual bool visit(ObjCVisibilityDeclarationAST *) { return true; }
@@ -342,14 +341,13 @@ public:
virtual void endVisit(ObjCProtocolDeclarationAST *) { }
virtual void endVisit(ObjCProtocolForwardDeclarationAST *) { }
virtual void endVisit(ObjCProtocolRefsAST *) { }
+ virtual void endVisit(ObjCSelectorAST *) { }
virtual void endVisit(ObjCMessageExpressionAST *) { }
virtual void endVisit(ObjCMessageArgumentAST *) { }
virtual void endVisit(ObjCProtocolExpressionAST *) { }
virtual void endVisit(ObjCTypeNameAST *) { }
virtual void endVisit(ObjCEncodeExpressionAST *) { }
- virtual void endVisit(ObjCSelectorWithoutArgumentsAST *) { }
virtual void endVisit(ObjCSelectorArgumentAST *) { }
- virtual void endVisit(ObjCSelectorWithArgumentsAST *) { }
virtual void endVisit(ObjCSelectorExpressionAST *) { }
virtual void endVisit(ObjCInstanceVariablesDeclarationAST *) { }
virtual void endVisit(ObjCVisibilityDeclarationAST *) { }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index 9bce5ec76e..4ea1d04c9d 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -145,8 +145,6 @@ class ObjCProtocolRefsAST;
class ObjCSelectorAST;
class ObjCSelectorArgumentAST;
class ObjCSelectorExpressionAST;
-class ObjCSelectorWithArgumentsAST;
-class ObjCSelectorWithoutArgumentsAST;
class ObjCSynchronizedStatementAST;
class ObjCSynthesizedPropertiesDeclarationAST;
class ObjCSynthesizedPropertyAST;
diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp
index 860e7d3078..688fc405b2 100644
--- a/src/shared/cplusplus/CheckDeclarator.cpp
+++ b/src/shared/cplusplus/CheckDeclarator.cpp
@@ -263,7 +263,7 @@ bool CheckDeclarator::visit(ObjCMethodPrototypeAST *ast)
semantic()->check(ast->selector, _scope);
- ObjCMethod *method = control()->newObjCMethod(location, ast->selector->selector_name);
+ ObjCMethod *method = control()->newObjCMethod(location, ast->selector->name);
ast->symbol = method;
method->setScope(_scope);
method->setVisibility(semantic()->currentVisibility());
@@ -271,17 +271,15 @@ bool CheckDeclarator::visit(ObjCMethodPrototypeAST *ast)
if (semantic()->isObjCClassMethod(tokenKind(ast->method_type_token)))
method->setStorage(Symbol::Static);
- if (ast->selector->asObjCSelectorWithArguments()) {
- for (ObjCMessageArgumentDeclarationListAST *it = ast->argument_list; it; it = it->next) {
- ObjCMessageArgumentDeclarationAST *argDecl = it->value;
+ for (ObjCMessageArgumentDeclarationListAST *it = ast->argument_list; it; it = it->next) {
+ ObjCMessageArgumentDeclarationAST *argDecl = it->value;
- semantic()->check(argDecl, method->arguments());
- }
-
- if (ast->dot_dot_dot_token)
- method->setVariadic(true);
+ semantic()->check(argDecl, method->arguments());
}
+ if (ast->dot_dot_dot_token)
+ method->setVariadic(true);
+
_fullySpecifiedType = FullySpecifiedType(method);
return false;
diff --git a/src/shared/cplusplus/CheckName.cpp b/src/shared/cplusplus/CheckName.cpp
index 98b5adea25..38675d5c09 100644
--- a/src/shared/cplusplus/CheckName.cpp
+++ b/src/shared/cplusplus/CheckName.cpp
@@ -100,17 +100,6 @@ const Name *CheckName::check(NestedNameSpecifierListAST *nested_name_specifier_l
return switchName(previousName);
}
-const Name *CheckName::check(ObjCSelectorAST *args, Scope *scope)
-{
- const Name *previousName = switchName(0);
- Scope *previousScope = switchScope(scope);
-
- accept(args);
-
- (void) switchScope(previousScope);
- return switchName(previousName);
-}
-
void CheckName::check(ObjCMessageArgumentDeclarationAST *arg, Scope *scope)
{
const Name *previousName = switchName(0);
@@ -375,21 +364,7 @@ bool CheckName::visit(TemplateIdAST *ast)
return false;
}
-bool CheckName::visit(ObjCSelectorWithoutArgumentsAST *ast)
-{
- if (ast->name_token) {
- std::vector<const Name *> names;
- const Identifier *id = control()->findOrInsertIdentifier(spell(ast->name_token));
- const NameId *nameId = control()->nameId(id);
- names.push_back(nameId);
- _name = control()->selectorNameId(&names[0], names.size(), false);
- ast->selector_name = _name;
- }
-
- return false;
-}
-
-bool CheckName::visit(ObjCSelectorWithArgumentsAST *ast)
+bool CheckName::visit(ObjCSelectorAST *ast)
{
std::vector<const Name *> names;
for (ObjCSelectorArgumentListAST *it = ast->selector_argument_list; it; it = it->next) {
@@ -405,7 +380,7 @@ bool CheckName::visit(ObjCSelectorWithArgumentsAST *ast)
if (!names.empty()) {
_name = control()->selectorNameId(&names[0], names.size(), true);
- ast->selector_name = _name;
+ ast->name = _name;
}
return false;
@@ -431,5 +406,3 @@ bool CheckName::visit(ObjCMessageArgumentDeclarationAST *ast)
return false;
}
-
-
diff --git a/src/shared/cplusplus/CheckName.h b/src/shared/cplusplus/CheckName.h
index 1484cb7848..54398356e3 100644
--- a/src/shared/cplusplus/CheckName.h
+++ b/src/shared/cplusplus/CheckName.h
@@ -63,7 +63,6 @@ public:
const Name *check(NameAST *name, Scope *scope);
const Name *check(NestedNameSpecifierListAST *name, Scope *scope);
- const Name *check(ObjCSelectorAST *args, Scope *scope);
void check(ObjCMessageArgumentDeclarationAST *arg, Scope *scope);
protected:
@@ -80,8 +79,7 @@ protected:
virtual bool visit(TemplateIdAST *ast);
// ObjC
- virtual bool visit(ObjCSelectorWithoutArgumentsAST *ast);
- virtual bool visit(ObjCSelectorWithArgumentsAST *ast);
+ virtual bool visit(ObjCSelectorAST *ast);
virtual bool visit(ObjCMessageArgumentDeclarationAST *ast);
private:
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 08ff9615d1..a7a70a4534 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -3620,7 +3620,7 @@ bool Parser::parseObjCSelectorExpression(ExpressionAST *&node)
unsigned identifier_token = 0;
match(T_IDENTIFIER, &identifier_token);
if (LA() == T_COLON) {
- ObjCSelectorWithArgumentsAST *args = new (_pool) ObjCSelectorWithArgumentsAST;
+ ObjCSelectorAST *args = new (_pool) ObjCSelectorAST;
ast->selector = args;
ObjCSelectorArgumentListAST *last = new (_pool) ObjCSelectorArgumentListAST;
args->selector_argument_list = last;
@@ -3636,9 +3636,11 @@ bool Parser::parseObjCSelectorExpression(ExpressionAST *&node)
match(T_COLON, &last->value->colon_token);
}
} else {
- ObjCSelectorWithoutArgumentsAST *args = new (_pool) ObjCSelectorWithoutArgumentsAST;
+ ObjCSelectorAST *args = new (_pool) ObjCSelectorAST;
ast->selector = args;
- args->name_token = identifier_token;
+ args->selector_argument_list = new (_pool) ObjCSelectorArgumentListAST;
+ args->selector_argument_list->value = new (_pool) ObjCSelectorArgumentAST;
+ args->selector_argument_list->value->name_token = identifier_token;
}
match(T_RPAREN, &ast->rparen_token);
@@ -3727,7 +3729,7 @@ bool Parser::parseObjCMessageArguments(ObjCSelectorAST *&selNode, ObjCMessageArg
}
}
- ObjCSelectorWithArgumentsAST *selWithArgs = new (_pool) ObjCSelectorWithArgumentsAST;
+ ObjCSelectorAST *selWithArgs = new (_pool) ObjCSelectorAST;
selWithArgs->selector_argument_list = selAst;
selNode = selWithArgs;
@@ -3738,8 +3740,10 @@ bool Parser::parseObjCMessageArguments(ObjCSelectorAST *&selNode, ObjCMessageArg
unsigned name_token = 0;
if (!parseObjCSelector(name_token))
return false;
- ObjCSelectorWithoutArgumentsAST *sel = new (_pool) ObjCSelectorWithoutArgumentsAST;
- sel->name_token = name_token;
+ ObjCSelectorAST *sel = new (_pool) ObjCSelectorAST;
+ sel->selector_argument_list = new (_pool) ObjCSelectorArgumentListAST;
+ sel->selector_argument_list->value = new (_pool) ObjCSelectorArgumentAST;
+ sel->selector_argument_list->value->name_token = name_token;
selNode = sel;
argNode = 0;
return true;
@@ -5127,7 +5131,7 @@ bool Parser::parseObjCMethodPrototype(ObjCMethodPrototypeAST *&node)
ObjCMessageArgumentDeclarationAST *declaration = 0;
parseObjCKeywordDeclaration(argument, declaration);
- ObjCSelectorWithArgumentsAST *sel = new (_pool) ObjCSelectorWithArgumentsAST;
+ ObjCSelectorAST *sel = new (_pool) ObjCSelectorAST;
ast->selector = sel;
ObjCSelectorArgumentListAST *lastSel = new (_pool) ObjCSelectorArgumentListAST;
sel->selector_argument_list = lastSel;
@@ -5160,8 +5164,10 @@ bool Parser::parseObjCMethodPrototype(ObjCMethodPrototypeAST *&node)
parseParameterDeclaration(parameter_declaration);
}
} else if (lookAtObjCSelector()) {
- ObjCSelectorWithoutArgumentsAST *sel = new (_pool) ObjCSelectorWithoutArgumentsAST;
- parseObjCSelector(sel->name_token);
+ ObjCSelectorAST *sel = new (_pool) ObjCSelectorAST;
+ sel->selector_argument_list = new (_pool) ObjCSelectorArgumentListAST;
+ sel->selector_argument_list->value = new (_pool) ObjCSelectorArgumentAST;
+ parseObjCSelector(sel->selector_argument_list->value->name_token);
ast->selector = sel;
} else {
_translationUnit->error(cursor(), "expected a selector");
@@ -5206,21 +5212,23 @@ bool Parser::parseObjCPropertyAttribute(ObjCPropertyAttributeAST *&node)
case Token_getter: {
node->attribute_identifier_token = consumeToken();
match(T_EQUAL, &node->equals_token);
- ObjCSelectorWithoutArgumentsAST *selector = new (_pool) ObjCSelectorWithoutArgumentsAST;
- match(T_IDENTIFIER, &selector->name_token);
- node->method_selector = selector;
+ ObjCSelectorAST *sel = new (_pool) ObjCSelectorAST;
+ sel->selector_argument_list = new (_pool) ObjCSelectorArgumentListAST;
+ sel->selector_argument_list->value = new (_pool) ObjCSelectorArgumentAST;
+ match(T_IDENTIFIER, &sel->selector_argument_list->value->name_token);
+ node->method_selector = sel;
return true;
}
case Token_setter: {
node->attribute_identifier_token = consumeToken();
match(T_EQUAL, &node->equals_token);
- ObjCSelectorWithArgumentsAST *selector = new (_pool) ObjCSelectorWithArgumentsAST;
- selector->selector_argument_list = new (_pool) ObjCSelectorArgumentListAST;
- selector->selector_argument_list->value = new (_pool) ObjCSelectorArgumentAST;
- match(T_IDENTIFIER, &selector->selector_argument_list->value->name_token);
- match(T_COLON, &selector->selector_argument_list->value->colon_token);
- node->method_selector = selector;
+ ObjCSelectorAST *sel = new (_pool) ObjCSelectorAST;
+ sel->selector_argument_list = new (_pool) ObjCSelectorArgumentListAST;
+ sel->selector_argument_list->value = new (_pool) ObjCSelectorArgumentAST;
+ match(T_IDENTIFIER, &sel->selector_argument_list->value->name_token);
+ match(T_COLON, &sel->selector_argument_list->value->colon_token);
+ node->method_selector = sel;
return true;
}
diff --git a/src/shared/cplusplus/Semantic.cpp b/src/shared/cplusplus/Semantic.cpp
index d8d6d6617e..9e66304203 100644
--- a/src/shared/cplusplus/Semantic.cpp
+++ b/src/shared/cplusplus/Semantic.cpp
@@ -160,9 +160,6 @@ const Name *Semantic::check(NameAST *name, Scope *scope)
const Name *Semantic::check(NestedNameSpecifierListAST *name, Scope *scope)
{ return d->checkName->check(name, scope); }
-const Name *Semantic::check(ObjCSelectorAST *args, Scope *scope)
-{ return d->checkName->check(args, scope); }
-
bool Semantic::skipFunctionBodies() const
{ return d->skipFunctionBodies; }
diff --git a/src/shared/cplusplus/Semantic.h b/src/shared/cplusplus/Semantic.h
index 60f82b892e..af11f7a2b4 100644
--- a/src/shared/cplusplus/Semantic.h
+++ b/src/shared/cplusplus/Semantic.h
@@ -87,7 +87,6 @@ public:
const Name *check(NestedNameSpecifierListAST *name, Scope *scope);
- const Name *check(ObjCSelectorAST *args, Scope *scope);
FullySpecifiedType check(ObjCTypeNameAST *typeName, Scope *scope);
void check(ObjCMessageArgumentDeclarationAST *arg, Scope *scope);
diff --git a/tests/auto/cplusplus/ast/tst_ast.cpp b/tests/auto/cplusplus/ast/tst_ast.cpp
index 14e82b6e8b..2873c3689c 100644
--- a/tests/auto/cplusplus/ast/tst_ast.cpp
+++ b/tests/auto/cplusplus/ast/tst_ast.cpp
@@ -741,8 +741,9 @@ void tst_AST::objc_method_attributes_1()
QCOMPARE(unit->tokenKind(foo->method_type_token), (int) T_MINUS);
QVERIFY(foo->type_name);
QVERIFY(foo->selector);
- QVERIFY(foo->selector->asObjCSelectorWithoutArguments());
- QCOMPARE(unit->spell(foo->selector->asObjCSelectorWithoutArguments()->name_token), "foo");
+ QVERIFY(foo->selector->selector_argument_list->value);
+ QVERIFY(!foo->selector->selector_argument_list->next);
+ QCOMPARE(unit->spell(foo->selector->selector_argument_list->value->name_token), "foo");
QVERIFY(foo->attribute_list);
QVERIFY(foo->attribute_list->value);
QVERIFY(! (foo->attribute_list->next));
@@ -767,8 +768,10 @@ void tst_AST::objc_method_attributes_1()
QCOMPARE(unit->tokenKind(bar->method_type_token), (int) T_PLUS);
QVERIFY(bar->type_name);
QVERIFY(bar->selector);
- QVERIFY(bar->selector->asObjCSelectorWithoutArguments());
- QCOMPARE(unit->spell(bar->selector->asObjCSelectorWithoutArguments()->name_token), "bar");
+ QVERIFY(bar->selector->selector_argument_list);
+ QVERIFY(bar->selector->selector_argument_list->value);
+ QVERIFY(!bar->selector->selector_argument_list->next);
+ QCOMPARE(unit->spell(bar->selector->selector_argument_list->value->name_token), "bar");
QVERIFY(bar->attribute_list);
QVERIFY(bar->attribute_list->value);
QVERIFY(! (bar->attribute_list->next));
@@ -954,9 +957,11 @@ void tst_AST::objc_msg_send_expression()
QVERIFY(msgExpr->argument_list == 0);
QVERIFY(msgExpr->selector);
- ObjCSelectorWithoutArgumentsAST *sel = msgExpr->selector->asObjCSelectorWithoutArguments();
- QVERIFY(sel);
- QCOMPARE(QLatin1String(unit->identifier(sel->name_token)->chars()), QLatin1String("description"));
+ ObjCSelectorArgumentListAST *args = msgExpr->selector->selector_argument_list;
+ QVERIFY(args);
+ QVERIFY(args->value);
+ QVERIFY(! args->next);
+ QCOMPARE(QLatin1String(unit->identifier(args->value->name_token)->chars()), QLatin1String("description"));
}
}
diff --git a/tests/auto/cplusplus/semantic/tst_semantic.cpp b/tests/auto/cplusplus/semantic/tst_semantic.cpp
index 2f6bcf4743..8823faf0c8 100644
--- a/tests/auto/cplusplus/semantic/tst_semantic.cpp
+++ b/tests/auto/cplusplus/semantic/tst_semantic.cpp
@@ -667,8 +667,7 @@ public:
return selectors;
}
- virtual bool visit(ObjCSelectorWithArgumentsAST *ast) {selectors.append(ast); return false;}
- virtual bool visit(ObjCSelectorWithoutArgumentsAST *ast) {selectors.append(ast); return false;}
+ virtual bool visit(ObjCSelectorAST *ast) {selectors.append(ast); return false;}
private:
QList<ObjCSelectorAST *> selectors;
@@ -694,10 +693,10 @@ void tst_Semantic::objcSelector_2()
QList<ObjCSelectorAST*>selectors = CollectSelectors(doc->unit)();
QCOMPARE(selectors.size(), 2);
- ObjCSelectorWithArgumentsAST *sel = selectors.at(1)->asObjCSelectorWithArguments();
+ ObjCSelectorAST *sel = selectors.at(1)->asObjCSelector();
QVERIFY(sel);
- const SelectorNameId *selId = sel->selector_name->asSelectorNameId();
+ const SelectorNameId *selId = sel->name->asSelectorNameId();
QVERIFY(selId);
QCOMPARE(selId->nameCount(), 3U);
QCOMPARE(selId->nameAt(0)->identifier()->chars(), "a");