summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/LookupContext.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-07-08 16:40:46 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-07-12 09:53:58 +0200
commit9135c8ccb1504e4b7c31253bbeb3886790787304 (patch)
treeb4ff2188b99975a33444daa648b63f95bd385ee4 /src/libs/cplusplus/LookupContext.cpp
parent65eb1d551592421f5e0e961c8c1dd2d056023697 (diff)
downloadqt-creator-9135c8ccb1504e4b7c31253bbeb3886790787304.tar.gz
Quickfix for adding a declaration to a class from a definition.
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r--src/libs/cplusplus/LookupContext.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 7d9b6dcce9..4d365ae083 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -138,6 +138,43 @@ QList<const Name *> LookupContext::fullyQualifiedName(Symbol *symbol)
return names;
}
+const Name *LookupContext::minimalName(const Name *name,
+ Scope *source,
+ ClassOrNamespace *target) const
+{
+ Q_ASSERT(name);
+ Q_ASSERT(source);
+ Q_ASSERT(target);
+
+ QList<Symbol *> symbols = lookup(name, source);
+ if (symbols.isEmpty())
+ return 0;
+
+ Symbol *canonicalSymbol = symbols.first();
+ std::vector<const Name *> fqNames = fullyQualifiedName(canonicalSymbol).toVector().toStdVector();
+ if (const QualifiedNameId *qId = name->asQualifiedNameId())
+ fqNames.push_back(qId->nameAt(qId->nameCount() - 1));
+ else
+ fqNames.push_back(name);
+
+ const QualifiedNameId *lastWorking = 0;
+ for (unsigned i = 0; i < fqNames.size(); ++i) {
+ const QualifiedNameId *newName = control()->qualifiedNameId(&fqNames[i],
+ fqNames.size() - i);
+ QList<Symbol *> candidates = target->lookup(newName);
+ if (candidates.contains(canonicalSymbol))
+ lastWorking = newName;
+ else
+ break;
+ }
+
+ if (lastWorking && lastWorking->nameCount() == 1)
+ return lastWorking->nameAt(0);
+ else
+ return lastWorking;
+}
+
+
QSharedPointer<CreateBindings> LookupContext::bindings() const
{
if (! _bindings)
@@ -280,6 +317,19 @@ QList<Symbol *> LookupContext::lookup(const Name *name, Scope *scope) const
return candidates;
}
+ClassOrNamespace *LookupContext::lookupParent(Symbol *symbol) const
+{
+ QList<const Name *> fqName = fullyQualifiedName(symbol);
+ ClassOrNamespace *binding = globalNamespace();
+ foreach (const Name *name, fqName) {
+ binding = binding->findType(name);
+ if (!binding)
+ return 0;
+ }
+
+ return binding;
+}
+
ClassOrNamespace::ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *parent)
: _factory(factory), _parent(parent), _templateId(0)
{