From 139087ee5c262937c6476fadd26955e4f9a5ad10 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 10 May 2010 12:19:13 +0200
Subject: [PATCH] Introduced Symbol::copy(otherSymbol) and removed some
 deprecated code.

---
 src/libs/cplusplus/LookupContext.cpp       | 20 +++++++------
 src/libs/cplusplus/LookupContext.h         |  1 +
 src/plugins/cpptools/cppcodecompletion.cpp | 35 +---------------------
 src/plugins/cpptools/cppcodecompletion.h   |  7 -----
 src/shared/cplusplus/Symbol.cpp            | 27 +++++++++++++++--
 src/shared/cplusplus/Symbol.h              |  2 ++
 6 files changed, 40 insertions(+), 52 deletions(-)

diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 00bb4d59691..7418b8e8087 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -69,9 +69,10 @@ bool ClassOrNamespace::CompareName::operator()(const Name *name, const Name *oth
 {
     Q_ASSERT(name != 0);
     Q_ASSERT(other != 0);
+
     const Identifier *id = name->identifier();
     const Identifier *otherId = other->identifier();
-    return std::lexicographical_compare(id->begin(), id->end(), otherId->begin(), otherId->end());
+    return strcmp(id->chars(), otherId->chars()) < 0;
 }
 
 /////////////////////////////////////////////////////////////////////
@@ -266,6 +267,11 @@ ClassOrNamespace::ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *pa
 {
 }
 
+ClassOrNamespace *ClassOrNamespace::parent() const
+{
+    return _parent;
+}
+
 QList<ClassOrNamespace *> ClassOrNamespace::usings() const
 {
     const_cast<ClassOrNamespace *>(this)->flush();
@@ -401,7 +407,7 @@ void CreateBindings::lookup_helper(const Name *name, Scope *scope,
 #if 0
             if (templateId && (s->isDeclaration() || s->isFunction())) {
 
-                FullySpecifiedType ty = GenTemplateInstance::instantiate(templateId, s, control);
+                FullySpecifiedType ty = GenTemplateInstance::instantiate(templateId, s, _control);
 
                 Overview oo;
                 oo.setShowFunctionSignatures(true);
@@ -412,19 +418,15 @@ void CreateBindings::lookup_helper(const Name *name, Scope *scope,
 
                 if (Declaration *decl = s->asDeclaration()) {
                     qDebug() << "instantiate declaration";
-                    qDebug() << "is typedef:" << ty.isTypedef() << s->isTypedef() << s->type().isTypedef();
-                    Declaration *d = control->newDeclaration(0, 0);
-                    d->setStorage(decl->storage());
-                    d->setName(decl->name());
+                    Declaration *d = _control->newDeclaration(0, 0);
+                    d->copy(decl);
                     d->setType(ty);
-                    d->setScope(decl->scope());
                     result->append(d);
                     continue;
                 } else if (Function *fun = s->asFunction()) {
                     qDebug() << "instantiate function";
                     Function *d = ty->asFunctionType();
-                    d->setStorage(fun->storage());
-                    d->setScope(fun->scope());
+                    d->copy(fun);
                     result->append(d);
                     continue;
                 }
diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h
index 20188c6d21d..4a9bb9432c1 100644
--- a/src/libs/cplusplus/LookupContext.h
+++ b/src/libs/cplusplus/LookupContext.h
@@ -48,6 +48,7 @@ class CPLUSPLUS_EXPORT ClassOrNamespace
 public:
     ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *parent);
 
+    ClassOrNamespace *parent() const;
     QList<ClassOrNamespace *> usings() const;
     QList<Enum *> enums() const;
     QList<Symbol *> symbols() const;
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 198ff12ccad..4edf1096246 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -1115,7 +1115,7 @@ bool CppCodeCompletion::completeMember(const QList<LookupItem> &baseResults,
             classObjectCandidates.append(klass);
 
         else if (NamedType *namedTy = ty->asNamedType()) {
-            if (ClassOrNamespace *b = context.classOrNamespace(namedTy->name(), r.lastVisibleSymbol()->scope())) {
+            if (ClassOrNamespace *b = context.classOrNamespace(namedTy->name(), r.lastVisibleSymbol())) {
                 classOrNamespace = b;
                 break;
 
@@ -1342,22 +1342,6 @@ void CppCodeCompletion::completeNamespace(ClassOrNamespace *b, const LookupConte
     }
 }
 
-void CppCodeCompletion::completeNamespace(const QList<Symbol *> &candidates,
-                                          const DeprecatedLookupContext &deprecatedContext)
-{
-    if (candidates.isEmpty())
-        return;
-
-    else if (Namespace *ns = candidates.first()->asNamespace()) {
-        LookupContext context(deprecatedContext.expressionDocument(),
-                              deprecatedContext.thisDocument(),
-                              deprecatedContext.snapshot());
-
-        if (ClassOrNamespace *binding = context.classOrNamespace(ns))
-            completeNamespace(binding, context);
-    }
-}
-
 void CppCodeCompletion::completeClass(ClassOrNamespace *b, const LookupContext &, bool staticLookup)
 {
     QSet<ClassOrNamespace *> bindingsVisited;
@@ -1405,23 +1389,6 @@ void CppCodeCompletion::completeClass(ClassOrNamespace *b, const LookupContext &
     }
 }
 
-void CppCodeCompletion::completeClass(const QList<Symbol *> &candidates,
-                                      const DeprecatedLookupContext &deprecatedContext,
-                                      bool staticLookup)
-{
-    if (candidates.isEmpty())
-        return;
-
-    else if (Symbol *klass = candidates.first()) {
-        LookupContext context(deprecatedContext.expressionDocument(),
-                              deprecatedContext.thisDocument(),
-                              deprecatedContext.snapshot());
-
-        if (ClassOrNamespace *binding = context.classOrNamespace(klass))
-            completeClass(binding, context, staticLookup);
-    }
-}
-
 bool CppCodeCompletion::completeQtMethod(const QList<LookupItem> &results,
                                          const LookupContext &newContext,
                                          bool wantSignals)
diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h
index a91956ce8a8..c2938a6726f 100644
--- a/src/plugins/cpptools/cppcodecompletion.h
+++ b/src/plugins/cpptools/cppcodecompletion.h
@@ -126,17 +126,10 @@ private:
     void completeNamespace(CPlusPlus::ClassOrNamespace *binding,
                            const CPlusPlus::LookupContext &context);
 
-    void completeNamespace(const QList<CPlusPlus::Symbol *> &candidates,
-                           const CPlusPlus::DeprecatedLookupContext &context);
-
     void completeClass(CPlusPlus::ClassOrNamespace *b,
                        const CPlusPlus::LookupContext &context,
                        bool staticLookup = true);
 
-    void completeClass(const QList<CPlusPlus::Symbol *> &candidates,
-                       const CPlusPlus::DeprecatedLookupContext &context,
-                       bool staticLookup = true);
-
     bool completeConstructors(CPlusPlus::Class *klass);
 
     bool completeQtMethod(const QList<CPlusPlus::LookupItem> &results,
diff --git a/src/shared/cplusplus/Symbol.cpp b/src/shared/cplusplus/Symbol.cpp
index 93725ee2246..8572f191dcb 100644
--- a/src/shared/cplusplus/Symbol.cpp
+++ b/src/shared/cplusplus/Symbol.cpp
@@ -161,7 +161,7 @@ private:
 };
 
 Symbol::Symbol(TranslationUnit *translationUnit, unsigned sourceLocation, const Name *name)
-    : _control(translationUnit->control()),
+    : _control(0),
       _sourceLocation(sourceLocation),
       _sourceOffset(0),
       _startOffset(0),
@@ -175,7 +175,11 @@ Symbol::Symbol(TranslationUnit *translationUnit, unsigned sourceLocation, const
       _next(0),
       _isGenerated(false)
 {
-    setSourceLocation(sourceLocation);
+    if (translationUnit) {
+        _control = translationUnit->control();
+        setSourceLocation(sourceLocation);
+    }
+
     setName(name);
 }
 
@@ -504,3 +508,22 @@ bool Symbol::isObjCMethod() const
 
 bool Symbol::isObjCPropertyDeclaration() const
 { return asObjCPropertyDeclaration() != 0; }
+
+void Symbol::copy(Symbol *other)
+{
+    _control = other->_control;
+    _sourceLocation = other->_sourceLocation;
+    _sourceOffset = other->_sourceOffset;
+    _startOffset = other->_startOffset;
+    _endOffset = other->_endOffset;
+    _name = other->_name;
+    _hashCode = other->_hashCode;
+    _storage = other->_storage;
+    _visibility = other->_visibility;
+    _scope = other->_scope;
+    _index = other->_index;
+    _next = other->_next;
+
+    _isGenerated = other->_isGenerated;
+    _isDeprecated = other->_isDeprecated;
+}
diff --git a/src/shared/cplusplus/Symbol.h b/src/shared/cplusplus/Symbol.h
index 628261b4b9a..ab762f63811 100644
--- a/src/shared/cplusplus/Symbol.h
+++ b/src/shared/cplusplus/Symbol.h
@@ -317,6 +317,8 @@ public:
     void visitSymbol(SymbolVisitor *visitor);
     static void visitSymbol(Symbol *symbol, SymbolVisitor *visitor);
 
+    virtual void copy(Symbol *other);
+
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor) = 0;
 
-- 
GitLab