From 33ae76455408049bcc376dab52556a2b05da4576 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Tue, 6 Jan 2015 19:05:08 +0200 Subject: [PATCH] C++: Fix completion for enum inside member functions Take 2 Task-number: QTCREATORBUG-13757 Change-Id: I9c2558bf01121e53710db984a99d37c2c6cafaf4 Reviewed-by: Nikolai Kosjar --- src/libs/cplusplus/LookupContext.cpp | 40 ++++++++++++++------- src/libs/cplusplus/LookupContext.h | 3 ++ src/plugins/cpptools/cppcompletion_test.cpp | 3 -- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index fefe1ecd5ef..58a8a27b2b3 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -820,20 +820,36 @@ ClassOrNamespace *ClassOrNamespace::findType(const Name *name) return lookupType_helper(name, &processed, /*searchInEnclosingScope =*/ false, this); } +ClassOrNamespace *ClassOrNamespace::findBlock_helper(Block *block, + QSet *processed, + bool searchInEnclosingScope) +{ + 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) { - flush(); - - QHash::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; - } - - return 0; + QSet processed; + return findBlock_helper(block, &processed, true); } Symbol *ClassOrNamespace::lookupInScope(const QList &fullName) diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 93d905598f4..899514a13b9 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 *processed, bool searchInEnclosingScope, ClassOrNamespace *origin); + ClassOrNamespace *findBlock_helper(Block *block, QSet *processed, + bool searchInEnclosingScope); + ClassOrNamespace *nestedType(const Name *name, ClassOrNamespace *origin); void instantiateNestedClasses(ClassOrNamespace *enclosingTemplateClass, diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index 5d3d54b2a14..3e94baf333d 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -313,9 +313,6 @@ void CppToolsPlugin::test_completion() QEXPECT_FAIL("enum_in_function_in_struct_in_function", "QTCREATORBUG-13757", Abort); QEXPECT_FAIL("enum_in_function_in_struct_in_function_cxx11", "QTCREATORBUG-13757", Abort); QEXPECT_FAIL("enum_in_function_in_struct_in_function_anon", "QTCREATORBUG-13757", Abort); - QEXPECT_FAIL("enum_inside_member_function", "QTCREATORBUG-13757", Abort); - QEXPECT_FAIL("enum_inside_member_function_cxx11", "QTCREATORBUG-13757", Abort); - QEXPECT_FAIL("enum_inside_member_function_anon", "QTCREATORBUG-13757", Abort); QEXPECT_FAIL("enum_in_class_accessed_in_member_func_cxx11", "QTCREATORBUG-13757", Abort); QEXPECT_FAIL("enum_in_class_accessed_in_member_func_inline_cxx11", "QTCREATORBUG-13757", Abort); QCOMPARE(actualCompletions, expectedCompletions);