From 72aa551a9776161f22bb4e0aca10ca83decda44d Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Thu, 18 Nov 2010 17:39:16 +0100 Subject: [PATCH] C++: implemented switch decl to def for operators Task-number: QTCREATORBUG-2313 Reviewed-by: Roberto Raggi --- src/libs/cplusplus/CppDocument.cpp | 35 +++++++++++++++++++++++++++++------ src/shared/cplusplus/Control.cpp | 9 +++++++++ src/shared/cplusplus/Control.h | 2 ++ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 006cbfff47..8383beef3b 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -687,11 +687,17 @@ namespace { class FindMatchingDefinition: public SymbolVisitor { Symbol *_declaration; + const OperatorNameId *_oper; QList _result; public: FindMatchingDefinition(Symbol *declaration) - : _declaration(declaration) {} + : _declaration(declaration) + , _oper(0) + { + if (_declaration->name()) + _oper = _declaration->name()->asOperatorNameId(); + } QList result() const { return _result; } @@ -699,8 +705,15 @@ public: virtual bool visit(Function *fun) { - if (_declaration->identifier()->isEqualTo(fun->identifier())) - _result.append(fun); + if (_oper) { + if (const Name *name = fun->unqualifiedName()) { + if (_oper->isEqualTo(name)) + _result.append(fun); + } + } else if (const Identifier *id = _declaration->identifier()) { + if (id->isEqualTo(fun->identifier())) + _result.append(fun); + } return false; } @@ -714,7 +727,7 @@ public: Symbol *Snapshot::findMatchingDefinition(Symbol *declaration) const { - if (! (declaration && declaration->identifier())) + if (!declaration) return 0; Document::Ptr thisDocument = document(QString::fromUtf8(declaration->fileName(), declaration->fileNameLength())); @@ -730,9 +743,19 @@ Symbol *Snapshot::findMatchingDefinition(Symbol *declaration) const } foreach (Document::Ptr doc, *this) { - if (! doc->control()->findIdentifier(declaration->identifier()->chars(), - declaration->identifier()->size())) + const Identifier *id = declaration->identifier(); + if (id && ! doc->control()->findIdentifier(id->chars(), + id->size())) continue; + if (!id) { + if (!declaration->name()) + continue; + const OperatorNameId *oper = declaration->name()->asOperatorNameId(); + if (!oper) + continue; + if (!doc->control()->findOperatorNameId(oper->kind())) + continue; + } FindMatchingDefinition candidates(declaration); candidates.accept(doc->globalNamespace()); diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp index 1b42ead206..4cfd8de636 100644 --- a/src/shared/cplusplus/Control.cpp +++ b/src/shared/cplusplus/Control.cpp @@ -551,6 +551,15 @@ DiagnosticClient *Control::diagnosticClient() const void Control::setDiagnosticClient(DiagnosticClient *diagnosticClient) { d->diagnosticClient = diagnosticClient; } +const OperatorNameId *Control::findOperatorNameId(OperatorNameId::Kind operatorId) const +{ + Table::const_iterator i = d->operatorNameIds.find(operatorId); + if (i == d->operatorNameIds.end()) + return 0; + else + return &*i; +} + const Identifier *Control::findIdentifier(const char *chars, unsigned size) const { return d->identifiers.findLiteral(chars, size); } diff --git a/src/shared/cplusplus/Control.h b/src/shared/cplusplus/Control.h index 930b1beacf..e475a17567 100644 --- a/src/shared/cplusplus/Control.h +++ b/src/shared/cplusplus/Control.h @@ -187,6 +187,8 @@ public: const Identifier *objcCopyId() const; const Identifier *objcNonatomicId() const; + const OperatorNameId *findOperatorNameId(OperatorNameId::Kind operatorId) const; + const Identifier *findIdentifier(const char *chars, unsigned size) const; const Identifier *identifier(const char *chars, unsigned size); const Identifier *identifier(const char *chars); -- 2.11.0