From f93758b8e1d68ed28dc1a84b71c906d58784cb70 Mon Sep 17 00:00:00 2001 From: Przemyslaw Gorszkowski Date: Thu, 16 May 2013 10:15:02 +0200 Subject: [PATCH] C++: fix used template function parameters It was missing colorizing and follow symbol template function parameters in case of: * returning value * use it as qualified name Task-number: QTCREATORBUG-6861 Change-Id: I4226199e1f296cfe5a373783ebbc633e32fc9bcd Reviewed-by: Erik Verbruggen --- src/libs/cplusplus/CppDocument.cpp | 8 ++++++ src/plugins/cpptools/cppchecksymbols.cpp | 15 ++++++++++- src/plugins/cpptools/cppcompletion_test.cpp | 1 - .../checksymbols/tst_checksymbols.cpp | 27 +++++++++++++++++++ 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 13c0b3f6ad8..ee6d7f3a9d6 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -175,6 +175,14 @@ protected: virtual bool visit(Block *symbol) { return process(symbol); } + virtual bool visit(Template *symbol) + { + if (symbol->declaration() && symbol->declaration()->isFunction()) + return process(symbol); + else + return true; + } + // Objective-C virtual bool visit(ObjCBaseClass *) { return false; } virtual bool visit(ObjCBaseProtocol *) { return false; } diff --git a/src/plugins/cpptools/cppchecksymbols.cpp b/src/plugins/cpptools/cppchecksymbols.cpp index dfba5f9c996..d4cc6b7b596 100644 --- a/src/plugins/cpptools/cppchecksymbols.cpp +++ b/src/plugins/cpptools/cppchecksymbols.cpp @@ -408,6 +408,14 @@ Scope *CheckSymbols::enclosingScope() const if (funDef->symbol) return funDef->symbol; + } else if (TemplateDeclarationAST *templateDeclaration = ast->asTemplateDeclaration()) { + if (DeclarationAST *decl = templateDeclaration->declaration) { + if (FunctionDefinitionAST *funDef = decl->asFunctionDefinition()) { + if (funDef->symbol) + return funDef->symbol; + } + } + } else if (CompoundStatementAST *blockStmt = ast->asCompoundStatement()) { if (blockStmt->symbol) return blockStmt->symbol; @@ -869,7 +877,12 @@ ClassOrNamespace *CheckSymbols::checkNestedName(QualifiedNameAST *ast) const Name *name = class_or_namespace_name->name; binding = _context.lookupType(name, enclosingScope()); - addType(binding, class_or_namespace_name); + if (binding) + addType(binding, class_or_namespace_name); + else + // for the case when we use template parameter as qualifier + // e.g.: template void fun() { T::type type; } + accept(nested_name_specifier->class_or_namespace_name); for (it = it->next; it; it = it->next) { NestedNameSpecifierAST *nested_name_specifier = it->value; diff --git a/src/plugins/cpptools/cppcompletion_test.cpp b/src/plugins/cpptools/cppcompletion_test.cpp index a3b56ca1084..63f6807ea64 100644 --- a/src/plugins/cpptools/cppcompletion_test.cpp +++ b/src/plugins/cpptools/cppcompletion_test.cpp @@ -1908,7 +1908,6 @@ void CppToolsPlugin::test_completion_typedef_using_templates1() QVERIFY(completions.contains(QLatin1String("bar"))); } - void CppToolsPlugin::test_completion_typedef_using_templates2() { TestData data; diff --git a/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp b/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp index 7924cfbbb16..ba889c0ee7a 100644 --- a/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp +++ b/tests/auto/cplusplus/checksymbols/tst_checksymbols.cpp @@ -195,6 +195,7 @@ private slots: void test_checksymbols_highlightingTypeWhenUsingNamespaceClass_QTCREATORBUG7903_namespace(); void test_checksymbols_highlightingTypeWhenUsingNamespaceClass_QTCREATORBUG7903_insideFunction(); void test_checksymbols_crashWhenUsingNamespaceClass_QTCREATORBUG9323_globalNamespace(); + void test_checksymbols_highlightingUsedTemplateFunctionParameter_QTCREATORBUG6861(); void test_checksymbols_crashWhenUsingNamespaceClass_QTCREATORBUG9323_namespace(); void test_checksymbols_crashWhenUsingNamespaceClass_QTCREATORBUG9323_insideFunction(); }; @@ -1702,6 +1703,7 @@ void tst_CheckSymbols::test_checksymbols_crashWhenUsingNamespaceClass_QTCREATORB TestData::check(source, expectedUses); } + void tst_CheckSymbols::test_checksymbols_crashWhenUsingNamespaceClass_QTCREATORBUG9323_insideFunction() { const QByteArray source = @@ -1725,5 +1727,30 @@ void tst_CheckSymbols::test_checksymbols_crashWhenUsingNamespaceClass_QTCREATORB TestData::check(source, expectedUses); } +void tst_CheckSymbols::test_checksymbols_highlightingUsedTemplateFunctionParameter_QTCREATORBUG6861() +{ + const QByteArray source = + "template\n" + "TEMP \n" + "foo(TEMP in)\n" + "{\n" + " typename TEMP::type type;\n" + "}\n" + ; + + const QList expectedUses = QList() + << Use(1, 16, 4, CppHighlightingSupport::TypeUse) + << Use(2, 1, 4, CppHighlightingSupport::TypeUse) + << Use(3, 1, 3, CppHighlightingSupport::FunctionUse) + << Use(3, 5, 4, CppHighlightingSupport::TypeUse) + << Use(3, 10, 2, CppHighlightingSupport::LocalUse) + << Use(5, 14, 4, CppHighlightingSupport::TypeUse) + << Use(5, 20, 4, CppHighlightingSupport::TypeUse) + << Use(5, 25, 4, CppHighlightingSupport::LocalUse) + ; + + TestData::check(source, expectedUses); +} + QTEST_APPLESS_MAIN(tst_CheckSymbols) #include "tst_checksymbols.moc"