summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/LookupContext.cpp
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@digia.com>2012-10-22 11:17:09 +0200
committerEike Ziller <eike.ziller@digia.com>2012-10-22 11:17:09 +0200
commit021b64b5dfb8776b847d0faffb0619d4d64be112 (patch)
tree1d645c544fc1b960ee7f75b01666a64b4d10bfec /src/libs/cplusplus/LookupContext.cpp
parent68a7861263cb137038a12d692a264647b404756b (diff)
parentfbf6a8da757d42b0d4b8126400f4c66dafc6bd95 (diff)
downloadqt-creator-021b64b5dfb8776b847d0faffb0619d4d64be112.tar.gz
Merge remote-tracking branch 'origin/2.6'
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r--src/libs/cplusplus/LookupContext.cpp44
1 files changed, 40 insertions, 4 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index a9ea1f33da..65b87de765 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -263,11 +263,23 @@ ClassOrNamespace *LookupContext::lookupType(const Name *name, Scope *scope) cons
return 0;
} else if (Block *block = scope->asBlock()) {
for (unsigned i = 0; i < block->memberCount(); ++i) {
- if (UsingNamespaceDirective *u = block->memberAt(i)->asUsingNamespaceDirective()) {
+ Symbol *m = block->memberAt(i);
+ if (UsingNamespaceDirective *u = m->asUsingNamespaceDirective()) {
if (ClassOrNamespace *uu = lookupType(u->name(), scope->enclosingNamespace())) {
if (ClassOrNamespace *r = uu->lookupType(name))
return r;
}
+ } else if (Declaration *d = m->asDeclaration()) {
+ if (d->name() && d->name()->isEqualTo(name->asNameId())) {
+ if (d->isTypedef() && d->type()) {
+#ifdef DEBUG_LOOKUP
+ Overview oo;
+ qDebug() << "Looks like" << oo(name) << "is a typedef for" << oo(d->type());
+#endif // DEBUG_LOOKUP
+ if (const NamedType *namedTy = d->type()->asNamedType())
+ return lookupType(namedTy->name(), scope);
+ }
+ }
}
}
return lookupType(name, scope->enclosingScope());
@@ -380,6 +392,9 @@ ClassOrNamespace *LookupContext::lookupParent(Symbol *symbol) const
ClassOrNamespace::ClassOrNamespace(CreateBindings *factory, ClassOrNamespace *parent)
: _factory(factory), _parent(parent), _templateId(0), _instantiationOrigin(0)
+#ifdef DEBUG_LOOKUP
+ , _name(0)
+#endif // DEBUG_LOOKUP
{
}
@@ -574,6 +589,11 @@ void CreateBindings::lookupInScope(const Name *name, Scope *scope,
else if (s->name()->isQualifiedNameId())
continue; // skip qualified ids.
+#ifdef DEBUG_LOOKUP
+ Overview oo;
+ qDebug() << "Found" << id->chars() << "in" << (binding ? oo(binding->_name) : "<null>");
+#endif // DEBUG_LOOKUP
+
LookupItem item;
item.setDeclaration(s);
item.setBinding(binding);
@@ -616,6 +636,11 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name,
bool searchInEnclosingScope,
ClassOrNamespace *origin)
{
+#ifdef DEBUG_LOOKUP
+ Overview oo;
+ qDebug() << "Looking up" << oo(name) << "in" << oo(_name);
+#endif // DEBUG_LOOKUP
+
if (const QualifiedNameId *q = name->asQualifiedNameId()) {
QSet<ClassOrNamespace *> innerProcessed;
@@ -721,6 +746,9 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
if (templId) {
_alreadyConsideredTemplates.insert(templId);
ClassOrNamespace *instantiation = _factory->allocClassOrNamespace(reference);
+#ifdef DEBUG_LOOKUP
+ instantiation->_name = templId;
+#endif // DEBUG_LOOKUP
instantiation->_templateId = templId;
instantiation->_instantiationOrigin = origin;
@@ -734,6 +762,7 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
const unsigned argumentCount = templId->templateArgumentCount();
if (_factory->expandTemplates()) {
+ Clone cloner(_control.data());
Subst subst(_control.data());
for (unsigned i = 0, ei = std::min(argumentCount, templ->templateParameterCount()); i < ei; ++i) {
const TypenameArgument *tParam = templ->templateParameterAt(i)->asTypenameArgument();
@@ -743,12 +772,16 @@ ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespac
if (!name)
continue;
const FullySpecifiedType &ty = templId->templateArgumentAt(i);
- subst.bind(name, ty);
+ subst.bind(cloner.name(name, &subst), ty);
}
- Clone cloner(_control.data());
foreach (Symbol *s, reference->symbols()) {
- instantiation->_symbols.append(cloner.symbol(s, &subst));
+ Symbol *clone = cloner.symbol(s, &subst);
+ instantiation->_symbols.append(clone);
+#ifdef DEBUG_LOOKUP
+ Overview oo;oo.setShowFunctionSignatures(true);oo.setShowReturnTypes(true);oo.setShowTemplateParameters(true);
+ qDebug()<<"cloned"<<oo(clone->type());
+#endif // DEBUG_LOOKUP
}
} else {
instantiation->_symbols.append(reference->symbols());
@@ -917,6 +950,9 @@ ClassOrNamespace *ClassOrNamespace::findOrCreateType(const Name *name, ClassOrNa
if (! e) {
e = _factory->allocClassOrNamespace(this);
+#ifdef DEBUG_LOOKUP
+ e->_name = name;
+#endif // DEBUG_LOOKUP
_classOrNamespaces[name] = e;
}