diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2015-01-06 19:05:08 +0200 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2015-01-13 18:09:15 +0100 |
commit | 33ae76455408049bcc376dab52556a2b05da4576 (patch) | |
tree | e910cc4cf5c3e2535c55ae8c08c41587c8699bbf /src/libs/cplusplus | |
parent | 1f2b5954331a5bc25d083647fff4aa23b36e3936 (diff) | |
download | qt-creator-33ae76455408049bcc376dab52556a2b05da4576.tar.gz |
C++: Fix completion for enum inside member functions
Take 2
Task-number: QTCREATORBUG-13757
Change-Id: I9c2558bf01121e53710db984a99d37c2c6cafaf4
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
Diffstat (limited to 'src/libs/cplusplus')
-rw-r--r-- | src/libs/cplusplus/LookupContext.cpp | 38 | ||||
-rw-r--r-- | src/libs/cplusplus/LookupContext.h | 3 |
2 files changed, 30 insertions, 11 deletions
diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index fefe1ecd5e..58a8a27b2b 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -820,22 +820,38 @@ ClassOrNamespace *ClassOrNamespace::findType(const Name *name) return lookupType_helper(name, &processed, /*searchInEnclosingScope =*/ false, this); } -ClassOrNamespace *ClassOrNamespace::findBlock(Block *block) +ClassOrNamespace *ClassOrNamespace::findBlock_helper(Block *block, + QSet<ClassOrNamespace *> *processed, + bool searchInEnclosingScope) { - flush(); - - QHash<Block *, ClassOrNamespace *>::const_iterator citBlock = _blocks.find(block); - if (citBlock != _blocks.end()) - return citBlock.value(); - - for (citBlock = _blocks.begin(); citBlock != _blocks.end(); ++citBlock) { - if (ClassOrNamespace *foundNestedBlock = citBlock.value()->findBlock(block)) - return foundNestedBlock; + for (ClassOrNamespace *binding = this; binding; binding = binding->_parent) { + if (processed->contains(binding)) + break; + processed->insert(binding); + binding->flush(); + auto end = binding->_blocks.end(); + auto citBlock = binding->_blocks.find(block); + if (citBlock != end) + return citBlock.value(); + + for (citBlock = binding->_blocks.begin(); citBlock != end; ++citBlock) { + if (ClassOrNamespace *foundNestedBlock = + citBlock.value()->findBlock_helper(block, processed, false)) { + return foundNestedBlock; + } + } + if (!searchInEnclosingScope) + break; } - return 0; } +ClassOrNamespace *ClassOrNamespace::findBlock(Block *block) +{ + QSet<ClassOrNamespace *> processed; + return findBlock_helper(block, &processed, true); +} + Symbol *ClassOrNamespace::lookupInScope(const QList<const Name *> &fullName) { if (!_scopeLookupCache) { diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 93d905598f..899514a13b 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -124,6 +124,9 @@ private: ClassOrNamespace *lookupType_helper(const Name *name, QSet<ClassOrNamespace *> *processed, bool searchInEnclosingScope, ClassOrNamespace *origin); + ClassOrNamespace *findBlock_helper(Block *block, QSet<ClassOrNamespace *> *processed, + bool searchInEnclosingScope); + ClassOrNamespace *nestedType(const Name *name, ClassOrNamespace *origin); void instantiateNestedClasses(ClassOrNamespace *enclosingTemplateClass, |