forked from qt-creator/qt-creator
Clang: Filter duplicates in clang query output
Because we can visit headers many times, we get results many times too. Change-Id: I3bbe7d7a5d01c2580a4569bfe115f14a69edc8a7 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -38,6 +38,7 @@ using testing::AtLeast;
|
||||
using testing::AtMost;
|
||||
using testing::Contains;
|
||||
using testing::Each;
|
||||
using testing::ElementsAre;
|
||||
using testing::Eq;
|
||||
using testing::Ge;
|
||||
using testing::IsEmpty;
|
||||
@@ -47,6 +48,7 @@ using testing::Pair;
|
||||
using testing::PrintToString;
|
||||
using testing::Property;
|
||||
using testing::SizeIs;
|
||||
using testing::UnorderedElementsAre;
|
||||
using testing::_;
|
||||
|
||||
using ClangBackEnd::V2::FileContainer;
|
||||
@@ -72,10 +74,16 @@ protected:
|
||||
|
||||
protected:
|
||||
ClangBackEnd::StringCache<Utils::PathString, std::mutex> filePathCache;
|
||||
Utils::SmallString sourceContent{"#include \"query_simplefunction.h\"\nvoid f()\n {}"};
|
||||
Utils::SmallString sourceContent{"#include \"query_simplefunction.h\"\nvoid f() {}"};
|
||||
FileContainer source{{TESTDATA_DIR, "query_simplefunction.cpp"},
|
||||
sourceContent.clone(),
|
||||
{"cc", "query_simplefunction.cpp"}};
|
||||
{"cc", TESTDATA_DIR"/query_simplefunction.cpp", "-I", TESTDATA_DIR}};
|
||||
FileContainer source2{{TESTDATA_DIR, "query_simplefunction2.cpp"},
|
||||
{},
|
||||
{"cc", TESTDATA_DIR"/query_simplefunction2.cpp", "-I", TESTDATA_DIR}};
|
||||
FileContainer source3{{TESTDATA_DIR, "query_simplefunction3.cpp"},
|
||||
{},
|
||||
{"cc", TESTDATA_DIR"/query_simplefunction3.cpp", "-I", TESTDATA_DIR}};
|
||||
Utils::SmallString unsavedContent{"void f();"};
|
||||
FileContainer unsaved{{TESTDATA_DIR, "query_simplefunction.h"},
|
||||
unsavedContent.clone(),
|
||||
@@ -83,19 +91,19 @@ protected:
|
||||
Utils::SmallString query{"functionDecl()"};
|
||||
ClangBackEnd::ClangQueryGatherer gatherer{&filePathCache, {source.clone()}, {unsaved.clone()}, query.clone()};
|
||||
ClangBackEnd::ClangQueryGatherer manyGatherer{&filePathCache,
|
||||
{source.clone(), source.clone(), source.clone()},
|
||||
{source3.clone(), source2.clone(), source.clone()},
|
||||
{unsaved.clone()},
|
||||
query.clone()};
|
||||
};
|
||||
|
||||
TEST_F(ClangQueryGatherer, CreateSourceRangesAndDiagnostics)
|
||||
{
|
||||
auto sourceRangesAndDiagnostics = gatherer.createSourceRangesAndDiagnosticsForSource(&filePathCache, source.clone(), {}, query.clone());
|
||||
auto sourceRangesAndDiagnostics = gatherer.createSourceRangesAndDiagnosticsForSource(&filePathCache, source.clone(), {unsaved}, query.clone());
|
||||
|
||||
ASSERT_THAT(sourceRangesAndDiagnostics,
|
||||
Property(&SourceRangesAndDiagnosticsForQueryMessage::sourceRanges,
|
||||
Property(&SourceRangesContainer::sourceRangeWithTextContainers,
|
||||
Contains(IsSourceRangeWithText(2, 1, 3, 4, "void f()\n {}")))));
|
||||
Contains(IsSourceRangeWithText(2, 1, 2, 12, "void f() {}")))));
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryGatherer, CreateSourceRangesAndDiagnosticssWithUnsavedContent)
|
||||
@@ -176,14 +184,18 @@ TEST_F(ClangQueryGatherer, AfterStartCreateSourceRangesAndDiagnosticsMessagesGet
|
||||
manyGatherer.startCreateNextSourceRangesAndDiagnosticsMessages();
|
||||
|
||||
ASSERT_THAT(manyGatherer.allCurrentProcessedMessages(),
|
||||
Each(
|
||||
UnorderedElementsAre(
|
||||
Property(&SourceRangesAndDiagnosticsForQueryMessage::sourceRanges,
|
||||
Property(&SourceRangesContainer::sourceRangeWithTextContainers,
|
||||
Contains(IsSourceRangeWithText(1, 1, 1, 9, "void f();"))))));
|
||||
UnorderedElementsAre(IsSourceRangeWithText(1, 1, 1, 9, "void f();"),
|
||||
IsSourceRangeWithText(2, 1, 2, 12, "void f() {}")))),
|
||||
Property(&SourceRangesAndDiagnosticsForQueryMessage::sourceRanges,
|
||||
Property(&SourceRangesContainer::sourceRangeWithTextContainers,
|
||||
UnorderedElementsAre(
|
||||
IsSourceRangeWithText(1, 1, 1, 13, "int header();"),
|
||||
IsSourceRangeWithText(3, 1, 3, 15, "int function();"))))));
|
||||
}
|
||||
|
||||
|
||||
|
||||
TEST_F(ClangQueryGatherer, GetFinishedMessages)
|
||||
{
|
||||
manyGatherer.startCreateNextSourceRangesAndDiagnosticsMessages();
|
||||
@@ -193,10 +205,17 @@ TEST_F(ClangQueryGatherer, GetFinishedMessages)
|
||||
|
||||
ASSERT_THAT(messages,
|
||||
AllOf(SizeIs(2),
|
||||
Each(
|
||||
UnorderedElementsAre(
|
||||
Property(&SourceRangesAndDiagnosticsForQueryMessage::sourceRanges,
|
||||
Property(&SourceRangesContainer::sourceRangeWithTextContainers,
|
||||
Contains(IsSourceRangeWithText(1, 1, 1, 9, "void f();")))))));
|
||||
UnorderedElementsAre(
|
||||
IsSourceRangeWithText(1, 1, 1, 9, "void f();"),
|
||||
IsSourceRangeWithText(2, 1, 2, 12, "void f() {}")))),
|
||||
Property(&SourceRangesAndDiagnosticsForQueryMessage::sourceRanges,
|
||||
Property(&SourceRangesContainer::sourceRangeWithTextContainers,
|
||||
UnorderedElementsAre(
|
||||
IsSourceRangeWithText(1, 1, 1, 13, "int header();"),
|
||||
IsSourceRangeWithText(3, 1, 3, 15, "int function();")))))));
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryGatherer, GetFinishedMessagesAfterSecondPass)
|
||||
@@ -211,10 +230,38 @@ TEST_F(ClangQueryGatherer, GetFinishedMessagesAfterSecondPass)
|
||||
|
||||
ASSERT_THAT(messages,
|
||||
AllOf(SizeIs(1),
|
||||
Each(
|
||||
ElementsAre(
|
||||
Property(&SourceRangesAndDiagnosticsForQueryMessage::sourceRanges,
|
||||
Property(&SourceRangesContainer::sourceRangeWithTextContainers,
|
||||
Contains(IsSourceRangeWithText(1, 1, 1, 9, "void f();")))))));
|
||||
UnorderedElementsAre(
|
||||
IsSourceRangeWithText(3, 1, 3, 15, "int function();")))))));
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryGatherer, FilterDuplicates)
|
||||
{
|
||||
manyGatherer.setProcessingSlotCount(3);
|
||||
manyGatherer.startCreateNextSourceRangesAndDiagnosticsMessages();
|
||||
manyGatherer.waitForFinished();
|
||||
|
||||
auto messages = manyGatherer.finishedMessages();
|
||||
|
||||
ASSERT_THAT(messages,
|
||||
AllOf(SizeIs(3),
|
||||
UnorderedElementsAre(
|
||||
Property(&SourceRangesAndDiagnosticsForQueryMessage::sourceRanges,
|
||||
Property(&SourceRangesContainer::sourceRangeWithTextContainers,
|
||||
UnorderedElementsAre(
|
||||
IsSourceRangeWithText(1, 1, 1, 9, "void f();"),
|
||||
IsSourceRangeWithText(2, 1, 2, 12, "void f() {}")))),
|
||||
Property(&SourceRangesAndDiagnosticsForQueryMessage::sourceRanges,
|
||||
Property(&SourceRangesContainer::sourceRangeWithTextContainers,
|
||||
UnorderedElementsAre(
|
||||
IsSourceRangeWithText(1, 1, 1, 13, "int header();"),
|
||||
IsSourceRangeWithText(3, 1, 3, 15, "int function();")))),
|
||||
Property(&SourceRangesAndDiagnosticsForQueryMessage::sourceRanges,
|
||||
Property(&SourceRangesContainer::sourceRangeWithTextContainers,
|
||||
UnorderedElementsAre(
|
||||
IsSourceRangeWithText(3, 1, 3, 15, "int function();")))))));
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryGatherer, AfterGetFinishedMessagesFuturesAreReduced)
|
||||
|
||||
Reference in New Issue
Block a user