diff options
| author | Przemyslaw Gorszkowski <pgorszkowski@gmail.com> | 2013-04-10 23:30:18 +0200 |
|---|---|---|
| committer | Erik Verbruggen <erik.verbruggen@digia.com> | 2013-04-19 12:14:56 +0200 |
| commit | 080bf4ecb8b7b70d6410e3342e37dacd5aef8ff3 (patch) | |
| tree | afee321dc0eff8017c0a4e3243bf64aefa901581 /src/libs/cplusplus/LookupContext.cpp | |
| parent | a2b2857b44d6f6bfdf9ab07a51165b56ef2705bf (diff) | |
| download | qt-creator-080bf4ecb8b7b70d6410e3342e37dacd5aef8ff3.tar.gz | |
C++: improve support for anonymous classes
Fix:
* highlighting
* find usages
* follow symbol
* code completion
Task-number: QTCREATORBUG-6497
Task-number: QTCREATORBUG-8963
Task-number: QTCREATORBUG-3610
Task-number: QTCREATORBUG-7579
Change-Id: I3dcaf1c515d0199c3e6bee72284fbb40064686ee
Reviewed-by: Petar Perisin <petar.perisin@gmail.com>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
| -rw-r--r-- | src/libs/cplusplus/LookupContext.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index fab318e8ca..dde50df687 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -60,7 +60,7 @@ static void addNames(const Name *name, QList<const Name *> *names, bool addAllNa else if (const QualifiedNameId *q = name->asQualifiedNameId()) { addNames(q->base(), names); addNames(q->name(), names, addAllNames); - } else if (addAllNames || name->isNameId() || name->isTemplateNameId()) { + } else if (addAllNames || name->isNameId() || name->isTemplateNameId() || name->isAnonymousNameId()) { names->append(name); } } @@ -716,7 +716,7 @@ ClassOrNamespace *ClassOrNamespace::lookupType_helper(const Name *name, } else if (! processed->contains(this)) { processed->insert(this); - if (name->isNameId() || name->isTemplateNameId()) { + if (name->isNameId() || name->isTemplateNameId() || name->isAnonymousNameId()) { flush(); foreach (Symbol *s, symbols()) { @@ -798,10 +798,26 @@ ClassOrNamespace *ClassOrNamespace::findSpecializationWithPointer(const Template ClassOrNamespace *ClassOrNamespace::nestedType(const Name *name, ClassOrNamespace *origin) { Q_ASSERT(name != 0); - Q_ASSERT(name->isNameId() || name->isTemplateNameId()); + Q_ASSERT(name->isNameId() || name->isTemplateNameId() || name->isAnonymousNameId()); const_cast<ClassOrNamespace *>(this)->flush(); + const AnonymousNameId *anonymousNameId = name->asAnonymousNameId(); + if (anonymousNameId) { + QHash<const AnonymousNameId *, ClassOrNamespace *>::const_iterator cit + = _anonymouses.find(anonymousNameId); + if (cit != _anonymouses.end()) { + return cit.value(); + } else { + ClassOrNamespace *newAnonymous = _factory->allocClassOrNamespace(this); +#ifdef DEBUG_LOOKUP + newAnonymous->_name = anonymousNameId; +#endif // DEBUG_LOOKUP + _anonymouses[anonymousNameId] = newAnonymous; + return newAnonymous; + } + } + Table::const_iterator it = _classOrNamespaces.find(name); if (it == _classOrNamespaces.end()) return 0; @@ -1201,7 +1217,7 @@ ClassOrNamespace *ClassOrNamespace::findOrCreateType(const Name *name, ClassOrNa return findOrCreateType(q->base(), origin)->findOrCreateType(q->name(), origin); - } else if (name->isNameId() || name->isTemplateNameId()) { + } else if (name->isNameId() || name->isTemplateNameId() || name->isAnonymousNameId()) { ClassOrNamespace *e = nestedType(name, origin); if (! e) { @@ -1470,7 +1486,7 @@ bool CreateBindings::visit(NamespaceAlias *a) return false; } else if (ClassOrNamespace *e = _currentClassOrNamespace->lookupType(a->namespaceName())) { - if (a->name()->isNameId() || a->name()->isTemplateNameId()) + if (a->name()->isNameId() || a->name()->isTemplateNameId() || a->name()->isAnonymousNameId()) _currentClassOrNamespace->addNestedType(a->name(), e); } else if (false) { |
