summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRoberto Raggi <roberto.raggi@nokia.com>2010-08-02 12:04:59 +0200
committerRoberto Raggi <roberto.raggi@nokia.com>2010-08-02 12:52:12 +0200
commit6324bf4460132225f682a59bc59794610c25924e (patch)
tree669c452d5867f3caf71a1a53d7eb9fb67a6785ff /src
parent6226cfe1fcbe33175e62950df656ff144e5276c0 (diff)
downloadqt-creator-6324bf4460132225f682a59bc59794610c25924e.tar.gz
Introduced IdExpressionAST.
Diffstat (limited to 'src')
-rw-r--r--src/libs/cplusplus/ResolveExpression.cpp6
-rw-r--r--src/libs/cplusplus/ResolveExpression.h1
-rw-r--r--src/plugins/cppeditor/cppquickfixes.cpp65
-rw-r--r--src/shared/cplusplus/AST.cpp18
-rw-r--r--src/shared/cplusplus/AST.h25
-rw-r--r--src/shared/cplusplus/ASTClone.cpp8
-rw-r--r--src/shared/cplusplus/ASTMatch0.cpp8
-rw-r--r--src/shared/cplusplus/ASTMatcher.cpp13
-rw-r--r--src/shared/cplusplus/ASTMatcher.h1
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp8
-rw-r--r--src/shared/cplusplus/ASTVisitor.h2
-rw-r--r--src/shared/cplusplus/ASTfwd.h1
-rw-r--r--src/shared/cplusplus/Parser.cpp4
13 files changed, 129 insertions, 31 deletions
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 8bbdb8f05a..246becd86b 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -136,6 +136,12 @@ void ResolveExpression::addResult(const FullySpecifiedType &ty, Scope *scope)
_results.append(item);
}
+bool ResolveExpression::visit(IdExpressionAST *ast)
+{
+ accept(ast->name);
+ return false;
+}
+
bool ResolveExpression::visit(BinaryExpressionAST *ast)
{
if (tokenKind(ast->binary_op_token) == T_COMMA && ast->right_expression && ast->right_expression->asQtMethod() != 0) {
diff --git a/src/libs/cplusplus/ResolveExpression.h b/src/libs/cplusplus/ResolveExpression.h
index c57f88201e..80d7213790 100644
--- a/src/libs/cplusplus/ResolveExpression.h
+++ b/src/libs/cplusplus/ResolveExpression.h
@@ -71,6 +71,7 @@ protected:
using ASTVisitor::visit;
+ virtual bool visit(IdExpressionAST *ast);
virtual bool visit(BinaryExpressionAST *ast);
virtual bool visit(CastExpressionAST *ast);
virtual bool visit(ConditionAST *ast);
diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp
index cd37c68505..36fbb5a380 100644
--- a/src/plugins/cppeditor/cppquickfixes.cpp
+++ b/src/plugins/cppeditor/cppquickfixes.cpp
@@ -863,13 +863,15 @@ public:
if (path.size() > 1) {
if (CallAST *call = path.at(path.size() - 2)->asCall()) {
if (call->base_expression) {
- if (SimpleNameAST *functionName = call->base_expression->asSimpleName()) {
- const QByteArray id(state.tokenAt(functionName->identifier_token).identifier->chars());
-
- if (id == "QT_TRANSLATE_NOOP" || id == "tr" || id == "trUtf8"
- || (type == TypeString && (id == "QLatin1String" || id == "QLatin1Literal"))
- || (type == TypeChar && id == "QLatin1Char"))
- return noResult(); // skip it
+ if (IdExpressionAST *idExpr = call->base_expression->asIdExpression()) {
+ if (SimpleNameAST *functionName = idExpr->name->asSimpleName()) {
+ const QByteArray id(state.tokenAt(functionName->identifier_token).identifier->chars());
+
+ if (id == "QT_TRANSLATE_NOOP" || id == "tr" || id == "trUtf8"
+ || (type == TypeString && (id == "QLatin1String" || id == "QLatin1Literal"))
+ || (type == TypeChar && id == "QLatin1Char"))
+ return noResult(); // skip it
+ }
}
}
}
@@ -958,14 +960,16 @@ public:
if (path.size() >= 2) {
if (CallAST *call = path.at(path.size() - 2)->asCall()) {
if (call->base_expression) {
- if (SimpleNameAST *functionName = call->base_expression->asSimpleName()) {
- const QByteArray id(state.tokenAt(functionName->identifier_token).identifier->chars());
-
- if (id == "tr" || id == "trUtf8"
- || id == "translate"
- || id == "QT_TRANSLATE_NOOP"
- || id == "QLatin1String" || id == "QLatin1Literal")
- return noResult(); // skip it
+ if (IdExpressionAST *idExpr = call->base_expression->asIdExpression()) {
+ if (SimpleNameAST *functionName = idExpr->name->asSimpleName()) {
+ const QByteArray id(state.tokenAt(functionName->identifier_token).identifier->chars());
+
+ if (id == "tr" || id == "trUtf8"
+ || id == "translate"
+ || id == "QT_TRANSLATE_NOOP"
+ || id == "QLatin1String" || id == "QLatin1Literal")
+ return noResult(); // skip it
+ }
}
}
}
@@ -1075,11 +1079,13 @@ public:
else if (path.size() > 1) {
if (CallAST *call = path.at(path.size() - 2)->asCall()) {
if (call->base_expression) {
- if (SimpleNameAST *functionName = call->base_expression->asSimpleName()) {
- const QByteArray id(state.tokenAt(functionName->identifier_token).identifier->chars());
+ if (IdExpressionAST *idExpr = call->base_expression->asIdExpression()) {
+ if (SimpleNameAST *functionName = idExpr->name->asSimpleName()) {
+ const QByteArray id(state.tokenAt(functionName->identifier_token).identifier->chars());
- if (id == "QLatin1String" || id == "QLatin1Literal")
- qlatin1Call = call;
+ if (id == "QLatin1String" || id == "QLatin1Literal")
+ qlatin1Call = call;
+ }
}
}
}
@@ -1365,14 +1371,14 @@ protected:
bool preVisit(AST *ast) {
if (CaseStatementAST *cs = ast->asCaseStatement()) {
foundCaseStatementLevel = true;
- ExpressionAST *expression = cs->expression->asSimpleName();
- if (!expression)
- expression = cs->expression->asQualifiedName();
- if (expression) {
- LookupItem item = typeOfExpression(expression,
- document,
- scope).first();
- values << prettyPrint(LookupContext::fullyQualifiedName(item.declaration()));
+ if (ExpressionAST *expression = cs->expression->asIdExpression()) {
+ QList<LookupItem> candidates = typeOfExpression(expression,
+ document,
+ scope);
+ if (!candidates .isEmpty() && candidates.first().declaration()) {
+ Symbol *decl = candidates.first().declaration();
+ values << prettyPrint(LookupContext::fullyQualifiedName(decl));
+ }
}
return true;
} else if (foundCaseStatementLevel) {
@@ -1555,8 +1561,9 @@ public:
for (int index = path.size() - 1; index != -1; --index) {
if (BinaryExpressionAST *binary = path.at(index)->asBinaryExpression()) {
if (binary->left_expression && binary->right_expression && state.tokenAt(binary->binary_op_token).is(T_EQUAL)) {
- if (state.isCursorOn(binary->left_expression) && binary->left_expression->asSimpleName() != 0) {
- SimpleNameAST *nameAST = binary->left_expression->asSimpleName();
+ IdExpressionAST *idExpr = binary->left_expression->asIdExpression();
+ if (state.isCursorOn(binary->left_expression) && idExpr && idExpr->name->asSimpleName() != 0) {
+ SimpleNameAST *nameAST = idExpr->name->asSimpleName();
const QList<LookupItem> results = state.context().lookup(nameAST->name, state.scopeAt(nameAST->firstToken()));
Declaration *decl = 0;
foreach (const LookupItem &r, results) {
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 3922b44a33..3d5f80a7f5 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -4211,3 +4211,21 @@ unsigned AttributeSpecifierAST::lastToken() const
return 0;
}
+/** \generated */
+unsigned IdExpressionAST::firstToken() const
+{
+ if (name)
+ if (unsigned candidate = name->firstToken())
+ return candidate;
+ return 0;
+}
+
+/** \generated */
+unsigned IdExpressionAST::lastToken() const
+{
+ if (name)
+ if (unsigned candidate = name->lastToken())
+ return candidate;
+ return 0;
+}
+
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 5eaa6624e5..2bbe99e2c6 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -201,6 +201,7 @@ public:
virtual FunctionDeclaratorAST *asFunctionDeclarator() { return 0; }
virtual FunctionDefinitionAST *asFunctionDefinition() { return 0; }
virtual GotoStatementAST *asGotoStatement() { return 0; }
+ virtual IdExpressionAST *asIdExpression() { return 0; }
virtual IfStatementAST *asIfStatement() { return 0; }
virtual LabeledStatementAST *asLabeledStatement() { return 0; }
virtual LambdaCaptureAST *asLambdaCapture() { return 0; }
@@ -337,7 +338,7 @@ public:
virtual DeclarationAST *clone(MemoryPool *pool) const = 0;
};
-class CPLUSPLUS_EXPORT NameAST: public ExpressionAST
+class CPLUSPLUS_EXPORT NameAST: public AST
{
public: // annotations
const Name *name;
@@ -965,6 +966,28 @@ protected:
virtual bool match0(AST *, ASTMatcher *);
};
+class CPLUSPLUS_EXPORT IdExpressionAST: public ExpressionAST
+{
+public:
+ NameAST *name;
+
+public:
+ IdExpressionAST()
+ : name(0)
+ {}
+
+ virtual IdExpressionAST *asIdExpression() { return this; }
+
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+ virtual IdExpressionAST *clone(MemoryPool *pool) const;
+
+protected:
+ virtual void accept0(ASTVisitor *visitor);
+ virtual bool match0(AST *, ASTMatcher *);
+};
+
class CPLUSPLUS_EXPORT CompoundExpressionAST: public ExpressionAST
{
public:
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index cb08a05f7c..c5a522ebdb 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -273,6 +273,14 @@ BaseSpecifierAST *BaseSpecifierAST::clone(MemoryPool *pool) const
return ast;
}
+IdExpressionAST *IdExpressionAST::clone(MemoryPool *pool) const
+{
+ IdExpressionAST *ast = new (pool) IdExpressionAST;
+ if (name)
+ ast->name = name->clone(pool);
+ return ast;
+}
+
CompoundExpressionAST *CompoundExpressionAST::clone(MemoryPool *pool) const
{
CompoundExpressionAST *ast = new (pool) CompoundExpressionAST;
diff --git a/src/shared/cplusplus/ASTMatch0.cpp b/src/shared/cplusplus/ASTMatch0.cpp
index 1ab0b0c077..d955b69971 100644
--- a/src/shared/cplusplus/ASTMatch0.cpp
+++ b/src/shared/cplusplus/ASTMatch0.cpp
@@ -201,6 +201,14 @@ bool BaseSpecifierAST::match0(AST *pattern, ASTMatcher *matcher)
return false;
}
+bool IdExpressionAST::match0(AST *pattern, ASTMatcher *matcher)
+{
+ if (IdExpressionAST *_other = pattern->asIdExpression())
+ return matcher->match(this, _other);
+
+ return false;
+}
+
bool CompoundExpressionAST::match0(AST *pattern, ASTMatcher *matcher)
{
if (CompoundExpressionAST *_other = pattern->asCompoundExpression())
diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp
index 7601430862..2b4c88bf93 100644
--- a/src/shared/cplusplus/ASTMatcher.cpp
+++ b/src/shared/cplusplus/ASTMatcher.cpp
@@ -427,6 +427,19 @@ bool ASTMatcher::match(BaseSpecifierAST *node, BaseSpecifierAST *pattern)
return true;
}
+bool ASTMatcher::match(IdExpressionAST *node, IdExpressionAST *pattern)
+{
+ (void) node;
+ (void) pattern;
+
+ if (! pattern->name)
+ pattern->name = node->name;
+ else if (! AST::match(node->name, pattern->name, this))
+ return false;
+
+ return true;
+}
+
bool ASTMatcher::match(CompoundExpressionAST *node, CompoundExpressionAST *pattern)
{
(void) node;
diff --git a/src/shared/cplusplus/ASTMatcher.h b/src/shared/cplusplus/ASTMatcher.h
index c5fff82629..22c643c666 100644
--- a/src/shared/cplusplus/ASTMatcher.h
+++ b/src/shared/cplusplus/ASTMatcher.h
@@ -90,6 +90,7 @@ public:
virtual bool match(FunctionDeclaratorAST *node, FunctionDeclaratorAST *pattern);
virtual bool match(FunctionDefinitionAST *node, FunctionDefinitionAST *pattern);
virtual bool match(GotoStatementAST *node, GotoStatementAST *pattern);
+ virtual bool match(IdExpressionAST *node, IdExpressionAST *pattern);
virtual bool match(IfStatementAST *node, IfStatementAST *pattern);
virtual bool match(LabeledStatementAST *node, LabeledStatementAST *pattern);
virtual bool match(LinkageBodyAST *node, LinkageBodyAST *pattern);
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 5a299ed53f..be0ffe01a2 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -205,6 +205,14 @@ void BaseSpecifierAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this);
}
+void IdExpressionAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ accept(name, visitor);
+ }
+ visitor->endVisit(this);
+}
+
void CompoundExpressionAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index a515da4d1b..56bb720f10 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -151,6 +151,7 @@ public:
virtual bool visit(FunctionDeclaratorAST *) { return true; }
virtual bool visit(FunctionDefinitionAST *) { return true; }
virtual bool visit(GotoStatementAST *) { return true; }
+ virtual bool visit(IdExpressionAST *) { return true; }
virtual bool visit(IfStatementAST *) { return true; }
virtual bool visit(LabeledStatementAST *) { return true; }
virtual bool visit(LinkageBodyAST *) { return true; }
@@ -293,6 +294,7 @@ public:
virtual void endVisit(FunctionDeclaratorAST *) { }
virtual void endVisit(FunctionDefinitionAST *) { }
virtual void endVisit(GotoStatementAST *) { }
+ virtual void endVisit(IdExpressionAST *) { }
virtual void endVisit(IfStatementAST *) { }
virtual void endVisit(LabeledStatementAST *) { }
virtual void endVisit(LinkageBodyAST *) { }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index 897edb6ccc..cd434c05ef 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -108,6 +108,7 @@ class ForeachStatementAST;
class FunctionDeclaratorAST;
class FunctionDefinitionAST;
class GotoStatementAST;
+class IdExpressionAST;
class IfStatementAST;
class LabeledStatementAST;
class LambdaCaptureAST;
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index 663fc6d8b2..aa1a622b2c 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -3822,7 +3822,9 @@ bool Parser::parsePrimaryExpression(ExpressionAST *&node)
default: {
NameAST *name = 0;
if (parseNameId(name)) {
- node = name;
+ IdExpressionAST *ast = new (_pool) IdExpressionAST;
+ ast->name = name;
+ node = ast;
return true;
}
break;