diff options
author | Roberto Raggi <roberto.raggi@nokia.com> | 2010-08-02 12:04:59 +0200 |
---|---|---|
committer | Roberto Raggi <roberto.raggi@nokia.com> | 2010-08-02 12:52:12 +0200 |
commit | 6324bf4460132225f682a59bc59794610c25924e (patch) | |
tree | 669c452d5867f3caf71a1a53d7eb9fb67a6785ff /src | |
parent | 6226cfe1fcbe33175e62950df656ff144e5276c0 (diff) | |
download | qt-creator-6324bf4460132225f682a59bc59794610c25924e.tar.gz |
Introduced IdExpressionAST.
Diffstat (limited to 'src')
-rw-r--r-- | src/libs/cplusplus/ResolveExpression.cpp | 6 | ||||
-rw-r--r-- | src/libs/cplusplus/ResolveExpression.h | 1 | ||||
-rw-r--r-- | src/plugins/cppeditor/cppquickfixes.cpp | 65 | ||||
-rw-r--r-- | src/shared/cplusplus/AST.cpp | 18 | ||||
-rw-r--r-- | src/shared/cplusplus/AST.h | 25 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTClone.cpp | 8 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatch0.cpp | 8 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatcher.cpp | 13 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTMatcher.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisit.cpp | 8 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTVisitor.h | 2 | ||||
-rw-r--r-- | src/shared/cplusplus/ASTfwd.h | 1 | ||||
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 4 |
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; |