diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-07-08 16:40:46 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-07-12 09:53:58 +0200 |
commit | 9135c8ccb1504e4b7c31253bbeb3886790787304 (patch) | |
tree | b4ff2188b99975a33444daa648b63f95bd385ee4 /src/libs/cplusplus/LookupContext.cpp | |
parent | 65eb1d551592421f5e0e961c8c1dd2d056023697 (diff) | |
download | qt-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.cpp | 50 |
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) { |