From f8544bbc42e8afcdc6202905225fcbb20e42252f Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 28 Jun 2015 22:28:44 +0300 Subject: [PATCH] C++: Resolve function-scope typedef inside lambda Use-case: struct Foo { int bar; }; void func() { typedef Foo F; []() { F f; f.bar; // bar not highlighted }; } Change-Id: Ifaee2d125931d993acad69f03031a675c6180858 Reviewed-by: Nikolai Kosjar --- src/libs/cplusplus/TypeResolver.cpp | 7 +++++++ src/plugins/cpptools/cppcompletion_test.cpp | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/libs/cplusplus/TypeResolver.cpp b/src/libs/cplusplus/TypeResolver.cpp index c837c0f9389..1be33f1410d 100644 --- a/src/libs/cplusplus/TypeResolver.cpp +++ b/src/libs/cplusplus/TypeResolver.cpp @@ -154,6 +154,13 @@ QList TypeResolver::typedefsFromScopeUpToFunctionScope(const Name *n } } enclosingBlockScope = block->enclosingScope(); + if (enclosingBlockScope) { + // For lambda, step beyond the function to its enclosing block + if (Function *enclosingFunction = enclosingBlockScope->asFunction()) { + if (!enclosingFunction->name()) + enclosingBlockScope = enclosingBlockScope->enclosingScope(); + } + } } return results; } diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index c743e0ed7de..2bbeb4f2944 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -2547,6 +2547,21 @@ void CppToolsPlugin::test_completion_data() ) << _("ar") << (QStringList() << QLatin1String("arg1")); + QTest::newRow("local_typedef_access_in_lambda") << _( + "struct Foo { int bar; };\n" + "\n" + "void func()\n" + "{\n" + " typedef Foo F;\n" + " []() {\n" + " F f;\n" + " @\n" + " };\n" + "}\n" + ) << _("f.") << (QStringList() + << QLatin1String("Foo") + << QLatin1String("bar")); + QTest::newRow("default_arguments_for_class_templates_and_base_class_QTCREATORBUG-12605") << _( "struct Foo { int foo; };\n" "template \n"