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