From a1ec4e2a941e12816f228670ca573dbc768eebf9 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Thu, 28 May 2009 11:49:59 +0200 Subject: [PATCH] Introduced Name::identifier(). Name::identifier() returns the identifier used to declare the name. --- src/libs/cplusplus/LookupContext.cpp | 33 ++++++++++++---------------- src/libs/cplusplus/LookupContext.h | 13 +++++------ src/shared/cplusplus/Name.h | 2 ++ src/shared/cplusplus/Names.cpp | 14 ++++++++++++ src/shared/cplusplus/Names.h | 10 ++++++--- src/shared/cplusplus/Symbol.cpp | 8 +++++++ src/shared/cplusplus/Symbol.h | 3 +++ 7 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index cbd781688c2..6c10f88c571 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -82,11 +82,11 @@ LookupContext::LookupContext(Control *control) LookupContext::LookupContext(Symbol *symbol, Document::Ptr expressionDocument, Document::Ptr thisDocument, - const Snapshot &documents) + const Snapshot &snapshot) : _symbol(symbol), _expressionDocument(expressionDocument), _thisDocument(thisDocument), - _documents(documents) + _snapshot(snapshot) { _control = _expressionDocument->control(); _visibleScopes = buildVisibleScopes(); @@ -95,9 +95,6 @@ LookupContext::LookupContext(Symbol *symbol, bool LookupContext::isValid() const { return _control != 0; } -LookupContext::operator bool() const -{ return _control != 0; } - Control *LookupContext::control() const { return _control; } @@ -111,20 +108,10 @@ Document::Ptr LookupContext::thisDocument() const { return _thisDocument; } Document::Ptr LookupContext::document(const QString &fileName) const -{ return _documents.value(fileName); } +{ return _snapshot.value(fileName); } -Identifier *LookupContext::identifier(Name *name) const -{ - if (NameId *nameId = name->asNameId()) - return nameId->identifier(); - else if (TemplateNameId *templId = name->asTemplateNameId()) - return templId->identifier(); - else if (DestructorNameId *dtorId = name->asDestructorNameId()) - return dtorId->identifier(); - else if (QualifiedNameId *q = name->asQualifiedNameId()) - return identifier(q->unqualifiedNameId()); - return 0; -} +Snapshot LookupContext::snapshot() const +{ return _snapshot; } bool LookupContext::maybeValidSymbol(Symbol *symbol, ResolveMode mode, @@ -257,6 +244,14 @@ QList<Symbol *> LookupContext::resolve(Name *name, const QList<Scope *> &visible return candidates; } +Identifier *LookupContext::identifier(const Name *name) const +{ + if (name) + return name->identifier(); + + return 0; +} + void LookupContext::buildVisibleScopes_helper(Document::Ptr doc, QList<Scope *> *scopes, QSet<QString> *processed) { @@ -267,7 +262,7 @@ void LookupContext::buildVisibleScopes_helper(Document::Ptr doc, QList<Scope *> scopes->append(doc->globalSymbols()); foreach (const Document::Include &incl, doc->includes()) { - buildVisibleScopes_helper(_documents.value(incl.fileName()), + buildVisibleScopes_helper(_snapshot.value(incl.fileName()), scopes, processed); } } diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index c54ea3087c7..9ba268fe1af 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -43,16 +43,16 @@ public: LookupContext(Symbol *symbol, Document::Ptr expressionDocument, Document::Ptr thisDocument, - const Snapshot &documents); + const Snapshot &snapshot); bool isValid() const; - operator bool() const; Control *control() const; Symbol *symbol() const; Document::Ptr expressionDocument() const; Document::Ptr thisDocument() const; Document::Ptr document(const QString &fileName) const; + Snapshot snapshot() const; QList<Symbol *> resolve(Name *name) const { return resolve(name, visibleScopes()); } @@ -66,9 +66,6 @@ public: QList<Symbol *> resolveClassOrNamespace(Name *name) const { return resolveClassOrNamespace(name, visibleScopes()); } - Snapshot snapshot() const - { return _documents; } - enum ResolveMode { ResolveSymbol = 0x01, ResolveClass = 0x02, @@ -77,8 +74,6 @@ public: ResolveAll = ResolveSymbol | ResolveClassOrNamespace }; - Identifier *identifier(Name *name) const; - QList<Symbol *> resolve(Name *name, const QList<Scope *> &visibleScopes, ResolveMode mode = ResolveAll) const; @@ -120,6 +115,8 @@ public: QList<Scope *> *expandedScopes) const; private: + Identifier *identifier(const Name *name) const; + QList<Scope *> buildVisibleScopes(); void buildVisibleScopes_helper(Document::Ptr doc, QList<Scope *> *scopes, @@ -144,7 +141,7 @@ private: Document::Ptr _thisDocument; // All documents. - Snapshot _documents; + Snapshot _snapshot; // Visible scopes. QList<Scope *> _visibleScopes; diff --git a/src/shared/cplusplus/Name.h b/src/shared/cplusplus/Name.h index e58fd86d7ec..ad871ea1daa 100644 --- a/src/shared/cplusplus/Name.h +++ b/src/shared/cplusplus/Name.h @@ -63,6 +63,8 @@ public: Name(); virtual ~Name(); + virtual Identifier *identifier() const = 0; + bool isNameId() const; bool isTemplateNameId() const; bool isDestructorNameId() const; diff --git a/src/shared/cplusplus/Names.cpp b/src/shared/cplusplus/Names.cpp index d3ae0a69b4d..a6911415f49 100644 --- a/src/shared/cplusplus/Names.cpp +++ b/src/shared/cplusplus/Names.cpp @@ -73,6 +73,14 @@ QualifiedNameId::~QualifiedNameId() void QualifiedNameId::accept0(NameVisitor *visitor) { visitor->visit(this); } +Identifier *QualifiedNameId::identifier() const +{ + if (Name *u = unqualifiedNameId()) + return u->identifier(); + + return 0; +} + unsigned QualifiedNameId::nameCount() const { return _nameCount; } @@ -225,6 +233,9 @@ void OperatorNameId::accept0(NameVisitor *visitor) int OperatorNameId::kind() const { return _kind; } +Identifier *OperatorNameId::identifier() const +{ return 0; } + bool OperatorNameId::isEqualTo(const Name *other) const { const OperatorNameId *o = other->asOperatorNameId(); @@ -246,6 +257,9 @@ void ConversionNameId::accept0(NameVisitor *visitor) FullySpecifiedType ConversionNameId::type() const { return _type; } +Identifier *ConversionNameId::identifier() const +{ return 0; } + bool ConversionNameId::isEqualTo(const Name *other) const { const ConversionNameId *c = other->asConversionNameId(); diff --git a/src/shared/cplusplus/Names.h b/src/shared/cplusplus/Names.h index e872aa0eeea..3d0d1d0b9d1 100644 --- a/src/shared/cplusplus/Names.h +++ b/src/shared/cplusplus/Names.h @@ -64,6 +64,8 @@ public: bool isGlobal = false); virtual ~QualifiedNameId(); + virtual Identifier *identifier() const; + unsigned nameCount() const; Name *nameAt(unsigned index) const; Name *const *names() const; @@ -94,7 +96,7 @@ public: NameId(Identifier *identifier); virtual ~NameId(); - Identifier *identifier() const; + virtual Identifier *identifier() const; virtual bool isEqualTo(const Name *other) const; @@ -117,7 +119,7 @@ public: DestructorNameId(Identifier *identifier); virtual ~DestructorNameId(); - Identifier *identifier() const; + virtual Identifier *identifier() const; virtual bool isEqualTo(const Name *other) const; @@ -142,7 +144,7 @@ public: unsigned templateArgumentCount); virtual ~TemplateNameId(); - Identifier *identifier() const; + virtual Identifier *identifier() const; // ### find a better name unsigned templateArgumentCount() const; @@ -229,6 +231,7 @@ public: int kind() const; + virtual Identifier *identifier() const; virtual bool isEqualTo(const Name *other) const; virtual const OperatorNameId *asOperatorNameId() const @@ -252,6 +255,7 @@ public: FullySpecifiedType type() const; + virtual Identifier *identifier() const; virtual bool isEqualTo(const Name *other) const; virtual const ConversionNameId *asConversionNameId() const diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp index 68b19c54e97..a012cca8ad8 100644 --- a/src/shared/cplusplus/Symbol.cpp +++ b/src/shared/cplusplus/Symbol.cpp @@ -296,6 +296,14 @@ void Symbol::setName(Name *name) } } +Identifier *Symbol::identifier() const +{ + if (_name) + return _name->identifier(); + + return 0; +} + Scope *Symbol::scope() const { return _scope; } diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h index 4db5d297c29..c5cc484f108 100644 --- a/src/shared/cplusplus/Symbol.h +++ b/src/shared/cplusplus/Symbol.h @@ -125,6 +125,9 @@ public: /// Sets this Symbol's name. void setName(Name *name); // ### dangerous + /// Returns this Symbol's (optional) identifier + Identifier *identifier() const; + /// Returns this Symbol's storage class specifier. int storage() const; -- GitLab