forked from qt-creator/qt-creator
Clang: Tool tips for clang query diagnostics
If you hover a diagnostics in for a clang query you get now a simple tool tip. Change-Id: I6352dd3d4b9a33c183e69037eac903469b90eea4 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -32,12 +32,16 @@
|
||||
namespace {
|
||||
using testing::AllOf;
|
||||
using testing::Contains;
|
||||
using testing::ElementsAre;
|
||||
using testing::Pointwise;
|
||||
using testing::IsEmpty;
|
||||
using testing::Not;
|
||||
using testing::InSequence;
|
||||
using testing::_;
|
||||
|
||||
using SourceRange = ClangBackEnd::V2::SourceRangeContainer;
|
||||
using Message = ClangBackEnd::DynamicASTMatcherDiagnosticMessageContainer;
|
||||
using Context = ClangBackEnd::DynamicASTMatcherDiagnosticContextContainer;
|
||||
using Messages = ClangBackEnd::DynamicASTMatcherDiagnosticMessageContainers;
|
||||
using Contexts = ClangBackEnd::DynamicASTMatcherDiagnosticContextContainers;
|
||||
using Marker = ClangRefactoring::ClangQueryHighlightMarker<MockSyntaxHighlighter>;
|
||||
@@ -54,7 +58,6 @@ protected:
|
||||
QTextCharFormat contextTextFormat;
|
||||
MockSyntaxHighlighter highlighter;
|
||||
Marker marker{highlighter};
|
||||
|
||||
};
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, NoCallForNoMessagesAndContexts)
|
||||
@@ -120,6 +123,262 @@ TEST_F(ClangQueryHighlightMarker, CallForMessagesAndContextForAMultiLine)
|
||||
marker.highlightBlock(3, " ) ");
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, NoMessagesIfEmpty)
|
||||
{
|
||||
Messages messages;
|
||||
Contexts contexts;
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundMessages = marker.messagesForLineAndColumn(1, 1);
|
||||
|
||||
ASSERT_THAT(foundMessages, IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, NoMessagesForBeforePosition)
|
||||
{
|
||||
Messages messages{{{1, 1, 5, 0, 3, 3, 0},
|
||||
ErrorType::RegistryMatcherNotFound,
|
||||
{"foo"}}};
|
||||
Contexts contexts;
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundMessages = marker.messagesForLineAndColumn(1, 4);
|
||||
|
||||
ASSERT_THAT(foundMessages, IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, NoMessagesForAfterPosition)
|
||||
{
|
||||
Messages messages{{{1, 1, 5, 0, 3, 3, 0},
|
||||
ErrorType::RegistryMatcherNotFound,
|
||||
{"foo"}}};
|
||||
Contexts contexts;
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundMessages = marker.messagesForLineAndColumn(3, 4);
|
||||
|
||||
ASSERT_THAT(foundMessages, IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, OneMessagesForInsidePosition)
|
||||
{
|
||||
Message message{{1, 1, 5, 0, 3, 3, 0},
|
||||
ErrorType::RegistryMatcherNotFound,
|
||||
{"foo"}};
|
||||
Messages messages{message.clone()};
|
||||
Contexts contexts;
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundMessages = marker.messagesForLineAndColumn(2, 3);
|
||||
|
||||
ASSERT_THAT(foundMessages, ElementsAre(message));
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, NoMessagesForOutsidePosition)
|
||||
{
|
||||
Message message{{1, 1, 5, 0, 3, 3, 0},
|
||||
ErrorType::RegistryMatcherNotFound,
|
||||
{"foo"}};
|
||||
Messages messages{message.clone()};
|
||||
Contexts contexts;
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundMessages = marker.messagesForLineAndColumn(3, 4);
|
||||
|
||||
ASSERT_THAT(foundMessages, IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, AfterStartColumnBeforeLine)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 3, 3, 0};
|
||||
|
||||
bool isAfterStartColumn = marker.isInsideRange(sourceRange, 1, 6);
|
||||
|
||||
ASSERT_FALSE(isAfterStartColumn);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, AfterStartColumnBeforeColumn)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 3, 3, 0};
|
||||
|
||||
bool isAfterStartColumn = marker.isInsideRange(sourceRange, 2, 4);
|
||||
|
||||
ASSERT_FALSE(isAfterStartColumn);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, AfterStartColumnAtColumn)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 3, 3, 0};
|
||||
|
||||
bool isAfterStartColumn = marker.isInsideRange(sourceRange, 2, 5);
|
||||
|
||||
ASSERT_TRUE(isAfterStartColumn);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, AfterStartColumnAfterColumn)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 3, 3, 0};
|
||||
|
||||
bool isAfterStartColumn = marker.isInsideRange(sourceRange, 2, 6);
|
||||
|
||||
ASSERT_TRUE(isAfterStartColumn);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, BeforeEndColumnAfterLine)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 3, 3, 0};
|
||||
|
||||
bool isBeforeEndColumn = marker.isInsideRange(sourceRange, 4, 1);
|
||||
|
||||
ASSERT_FALSE(isBeforeEndColumn);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, BeforeEndColumnAfterColumn)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 3, 3, 0};
|
||||
|
||||
bool isBeforeEndColumn = marker.isInsideRange(sourceRange, 3, 4);
|
||||
|
||||
ASSERT_FALSE(isBeforeEndColumn);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, BeforeEndColumnAtColumn)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 3, 3, 0};
|
||||
|
||||
bool isBeforeEndColumn = marker.isInsideRange(sourceRange, 3, 3);
|
||||
|
||||
ASSERT_TRUE(isBeforeEndColumn);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, BeforeEndColumnBeforeColumn)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 3, 3, 0};
|
||||
|
||||
bool isBeforeEndColumn = marker.isInsideRange(sourceRange, 3, 2);
|
||||
|
||||
ASSERT_TRUE(isBeforeEndColumn);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, InBetweenLineBeforeLine)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 3, 3, 0};
|
||||
|
||||
bool isInBetween = marker.isInsideRange(sourceRange, 1, 6);
|
||||
|
||||
ASSERT_FALSE(isInBetween);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, InBetweenLineAfterLine)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 4, 3, 0};
|
||||
|
||||
bool isInBetween = marker.isInsideRange(sourceRange, 5, 1);
|
||||
|
||||
ASSERT_FALSE(isInBetween);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, InBetweenLine)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 4, 3, 0};
|
||||
|
||||
bool isInBetween = marker.isInsideRange(sourceRange, 3, 1);
|
||||
|
||||
ASSERT_TRUE(isInBetween);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, SingleLineBefore)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 2, 10, 0};
|
||||
|
||||
bool isInRange = marker.isInsideRange(sourceRange, 2, 4);
|
||||
|
||||
ASSERT_FALSE(isInRange);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, SingleLineAfter)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 2, 10, 0};
|
||||
|
||||
bool isInRange = marker.isInsideRange(sourceRange, 2, 11);
|
||||
|
||||
ASSERT_FALSE(isInRange);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, SingleLineInRange)
|
||||
{
|
||||
SourceRange sourceRange{1, 2, 5, 0, 2, 10, 0};
|
||||
|
||||
bool isInRange = marker.isInsideRange(sourceRange, 2, 6);
|
||||
|
||||
ASSERT_TRUE(isInRange);
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, NoContextsIfEmpty)
|
||||
{
|
||||
Messages messages;
|
||||
Contexts contexts;
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundContexts = marker.contextsForLineAndColumn(1, 1);
|
||||
|
||||
ASSERT_THAT(foundContexts, IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, NoContextsForBeforePosition)
|
||||
{
|
||||
Messages messages;
|
||||
Contexts contexts{{{1, 1, 5, 0, 3, 3, 0},
|
||||
ContextType::MatcherArg,
|
||||
{"foo"}}};
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundContexts = marker.contextsForLineAndColumn(1, 4);
|
||||
|
||||
ASSERT_THAT(foundContexts, IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, NoContextsForAfterPosition)
|
||||
{
|
||||
Messages messages;
|
||||
Contexts contexts{{{1, 1, 5, 0, 3, 3, 0},
|
||||
ContextType::MatcherArg,
|
||||
{"foo"}}};
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundContexts = marker.contextsForLineAndColumn(3, 4);
|
||||
|
||||
ASSERT_THAT(foundContexts, IsEmpty());
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, OneContextsForInsidePosition)
|
||||
{
|
||||
Context context{{1, 1, 5, 0, 3, 3, 0},
|
||||
ContextType::MatcherArg,
|
||||
{"foo"}};
|
||||
Messages messages;
|
||||
Contexts contexts{context.clone()};
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundContexts = marker.contextsForLineAndColumn(2, 3);
|
||||
|
||||
ASSERT_THAT(foundContexts, ElementsAre(context));
|
||||
}
|
||||
|
||||
TEST_F(ClangQueryHighlightMarker, NoContextsForOutsidePosition)
|
||||
{
|
||||
Context context{{1, 1, 5, 0, 3, 3, 0},
|
||||
ContextType::MatcherArg,
|
||||
{"foo"}};
|
||||
Messages messages;
|
||||
Contexts contexts{context.clone()};
|
||||
marker.setMessagesAndContexts(std::move(messages), std::move(contexts));
|
||||
|
||||
auto foundContexts = marker.contextsForLineAndColumn(3, 4);
|
||||
|
||||
ASSERT_THAT(foundContexts, IsEmpty());
|
||||
}
|
||||
|
||||
void ClangQueryHighlightMarker::SetUp()
|
||||
{
|
||||
messageTextFormat.setFontItalic(true);
|
||||
|
||||
Reference in New Issue
Block a user