C++: fix highlighting type when there is using Namespace::Class

If type is not found we try to find 'using' declaration for this type.

Task-number: QTCREATORBUG-7903

Change-Id: I569db9e1a8504a5da3115ebbed2e823d5924f6ca
Reviewed-by: Erik Verbruggen <erik.verbruggen@digia.com>
This commit is contained in:
Przemyslaw Gorszkowski
2013-04-25 18:46:34 +02:00
committed by Erik Verbruggen
parent e245f2d5f9
commit d14767a6af
8 changed files with 317 additions and 4 deletions

View File

@@ -191,6 +191,9 @@ private slots:
void test_checksymbols_AnonymousClass();
void test_checksymbols_AnonymousClass_insideNamespace();
void test_checksymbols_AnonymousClass_QTCREATORBUG8963();
void test_checksymbols_highlightingTypeWhenUsingNamespaceClass_QTCREATORBUG7903_globalNamespace();
void test_checksymbols_highlightingTypeWhenUsingNamespaceClass_QTCREATORBUG7903_namespace();
void test_checksymbols_highlightingTypeWhenUsingNamespaceClass_QTCREATORBUG7903_insideFunction();
};
void tst_CheckSymbols::test_checksymbols_TypeUse()
@@ -1567,5 +1570,87 @@ void tst_CheckSymbols::test_checksymbols_AnonymousClass_QTCREATORBUG8963()
TestData::check(source, expectedUses);
}
void tst_CheckSymbols::test_checksymbols_highlightingTypeWhenUsingNamespaceClass_QTCREATORBUG7903_globalNamespace()
{
const QByteArray source =
"namespace NS {\n"
"class Foo {};\n"
"}\n"
"using NS::Foo;\n"
"void fun()\n"
"{\n"
" Foo foo;\n"
"}\n"
;
const QList<Use> expectedUses = QList<Use>()
<< Use(1, 11, 2, CppHighlightingSupport::TypeUse)
<< Use(2, 7, 3, CppHighlightingSupport::TypeUse)
<< Use(4, 7, 2, CppHighlightingSupport::TypeUse)
<< Use(4, 11, 3, CppHighlightingSupport::TypeUse)
<< Use(5, 6, 3, CppHighlightingSupport::FunctionUse)
<< Use(7, 5, 3, CppHighlightingSupport::TypeUse)
<< Use(7, 9, 3, CppHighlightingSupport::LocalUse)
;
TestData::check(source, expectedUses);
}
void tst_CheckSymbols::test_checksymbols_highlightingTypeWhenUsingNamespaceClass_QTCREATORBUG7903_namespace()
{
const QByteArray source =
"namespace NS {\n"
"class Foo {};\n"
"}\n"
"namespace NS1 {\n"
"using NS::Foo;\n"
"void fun()\n"
"{\n"
" Foo foo;\n"
"}\n"
"}\n"
;
const QList<Use> expectedUses = QList<Use>()
<< Use(1, 11, 2, CppHighlightingSupport::TypeUse)
<< Use(2, 7, 3, CppHighlightingSupport::TypeUse)
<< Use(4, 11, 3, CppHighlightingSupport::TypeUse)
<< Use(5, 7, 2, CppHighlightingSupport::TypeUse)
<< Use(5, 11, 3, CppHighlightingSupport::TypeUse)
<< Use(6, 6, 3, CppHighlightingSupport::FunctionUse)
<< Use(8, 5, 3, CppHighlightingSupport::TypeUse)
<< Use(8, 9, 3, CppHighlightingSupport::LocalUse)
;
TestData::check(source, expectedUses);
}
void tst_CheckSymbols::test_checksymbols_highlightingTypeWhenUsingNamespaceClass_QTCREATORBUG7903_insideFunction()
{
const QByteArray source =
"namespace NS {\n"
"class Foo {};\n"
"}\n"
"void fun()\n"
"{\n"
" using NS::Foo;\n"
" Foo foo;\n"
"}\n"
;
const QList<Use> expectedUses = QList<Use>()
<< Use(1, 11, 2, CppHighlightingSupport::TypeUse)
<< Use(2, 7, 3, CppHighlightingSupport::TypeUse)
<< Use(4, 6, 3, CppHighlightingSupport::FunctionUse)
<< Use(6, 11, 2, CppHighlightingSupport::TypeUse)
<< Use(6, 15, 3, CppHighlightingSupport::TypeUse)
<< Use(7, 5, 3, CppHighlightingSupport::TypeUse)
<< Use(7, 9, 3, CppHighlightingSupport::LocalUse)
;
TestData::check(source, expectedUses);
}
QTEST_APPLESS_MAIN(tst_CheckSymbols)
#include "tst_checksymbols.moc"

View File

@@ -97,6 +97,9 @@ private Q_SLOTS:
void operatorAsteriskOfNestedClassOfTemplateClass_QTCREATORBUG9006();
void operatorArrowOfNestedClassOfTemplateClass_QTCREATORBUG9005();
void anonymousClass_QTCREATORBUG8963();
void using_insideGlobalNamespace();
void using_insideNamespace();
void using_insideFunction();
};
@@ -536,6 +539,129 @@ void tst_FindUsages::anonymousClass_QTCREATORBUG8963()
QCOMPARE(findUsages.usages().size(), 2);
}
void tst_FindUsages::using_insideGlobalNamespace()
{
const QByteArray src =
"namespace NS\n"
"{\n"
"struct Struct\n"
"{\n"
" int bar;\n"
"};\n"
"}\n"
"using NS::Struct;\n"
"void foo()\n"
"{\n"
" Struct s;\n"
"}\n"
;
Document::Ptr doc = Document::create("using_insideGlobalNamespace");
doc->setUtf8Source(src);
doc->parse();
doc->check();
QVERIFY(doc->diagnosticMessages().isEmpty());
QCOMPARE(doc->globalSymbolCount(), 3U);
Snapshot snapshot;
snapshot.insert(doc);
Namespace *nsSymbol = doc->globalSymbolAt(0)->asNamespace();
QVERIFY(nsSymbol);
QCOMPARE(nsSymbol->memberCount(), 1U);
Class *structSymbol = nsSymbol->memberAt(0)->asClass();
QVERIFY(structSymbol);
FindUsages findUsages(src, doc, snapshot);
findUsages(structSymbol);
QCOMPARE(findUsages.usages().size(), 3);
}
void tst_FindUsages::using_insideNamespace()
{
const QByteArray src =
"namespace NS\n"
"{\n"
"struct Struct\n"
"{\n"
" int bar;\n"
"};\n"
"}\n"
"namespace NS1\n"
"{\n"
"using NS::Struct;\n"
"void foo()\n"
"{\n"
" Struct s;\n"
"}\n"
"}\n"
;
Document::Ptr doc = Document::create("using_insideNamespace");
doc->setUtf8Source(src);
doc->parse();
doc->check();
QVERIFY(doc->diagnosticMessages().isEmpty());
QCOMPARE(doc->globalSymbolCount(), 2U);
Snapshot snapshot;
snapshot.insert(doc);
Namespace *nsSymbol = doc->globalSymbolAt(0)->asNamespace();
QVERIFY(nsSymbol);
QCOMPARE(nsSymbol->memberCount(), 1U);
Class *structSymbol = nsSymbol->memberAt(0)->asClass();
QVERIFY(structSymbol);
FindUsages findUsages(src, doc, snapshot);
findUsages(structSymbol);
QCOMPARE(findUsages.usages().size(), 3);
}
void tst_FindUsages::using_insideFunction()
{
const QByteArray src =
"namespace NS\n"
"{\n"
"struct Struct\n"
"{\n"
" int bar;\n"
"};\n"
"}\n"
"void foo()\n"
"{\n"
" using NS::Struct;\n"
" Struct s;\n"
"}\n"
;
Document::Ptr doc = Document::create("using_insideFunction");
doc->setUtf8Source(src);
doc->parse();
doc->check();
QVERIFY(doc->diagnosticMessages().isEmpty());
QCOMPARE(doc->globalSymbolCount(), 2U);
Snapshot snapshot;
snapshot.insert(doc);
Namespace *nsSymbol = doc->globalSymbolAt(0)->asNamespace();
QVERIFY(nsSymbol);
QCOMPARE(nsSymbol->memberCount(), 1U);
Class *structSymbol = nsSymbol->memberAt(0)->asClass();
QVERIFY(structSymbol);
FindUsages findUsages(src, doc, snapshot);
findUsages(structSymbol);
QCOMPARE(findUsages.usages().size(), 3);
}
void tst_FindUsages::operatorArrowOfNestedClassOfTemplateClass_QTCREATORBUG9005()
{
const QByteArray src = "\n"