summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/LookupContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/cplusplus/LookupContext.cpp')
-rw-r--r--src/libs/cplusplus/LookupContext.cpp38
1 files changed, 27 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) {