aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2018-12-04 12:53:04 +0100
committerNikolai Kosjar <nikolai.kosjar@qt.io>2018-12-06 08:55:28 +0000
commit6889f4df80d21b2121eef85cac2a6f58dd946106 (patch)
tree7565398db2beaa1f8e6969ca6b097773fc1ea8aa
parent42b38cc957aeb6120cc94e44dfaaad562d448f1b (diff)
Clang: Fix tooltip for pointer to class
Detect and dereference pointer to get to the correct class. Fixes: QTCREATORBUG-21523 Change-Id: I679778b2cfbbce4466294dabdee096686f53f095 Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
-rw-r--r--src/tools/clangbackend/source/clangtooltipinfocollector.cpp14
-rw-r--r--tests/unit/unittest/clangtooltipinfo-test.cpp12
-rw-r--r--tests/unit/unittest/data/tooltipinfo.cpp5
3 files changed, 29 insertions, 2 deletions
diff --git a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp
index a0b8223a18..8eb15eb89e 100644
--- a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp
+++ b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp
@@ -425,14 +425,24 @@ ToolTipInfo ToolTipInfoCollector::qDocInfo(const Cursor &cursor) const
return result;
}
- if (cursor.kind() == CXCursor_VarDecl || cursor.kind() == CXCursor_FieldDecl) {
- result.qdocMark = typeName(cursor.type());
+ if (cursor.kind() == CXCursor_VarDecl || cursor.kind() == CXCursor_ParmDecl
+ || cursor.kind() == CXCursor_FieldDecl) {
// maybe template instantiation
if (cursor.type().kind() == CXType_Unexposed && cursor.type().canonical().kind() == CXType_Record) {
result.qdocIdCandidates = qDocIdCandidates(cursor.type().canonical().declaration());
+ result.qdocMark = typeName(cursor.type());
result.qdocCategory = ToolTipInfo::ClassOrNamespace;
return result;
}
+
+ Type type = cursor.type();
+ while (type.pointeeType().isValid())
+ type = type.pointeeType();
+
+ const Cursor typeCursor = type.declaration();
+ result.qdocIdCandidates = qDocIdCandidates(typeCursor);
+ result.qdocCategory = qdocCategory(typeCursor);
+ result.qdocMark = typeName(type);
}
// TODO: Handle also RValueReference()
diff --git a/tests/unit/unittest/clangtooltipinfo-test.cpp b/tests/unit/unittest/clangtooltipinfo-test.cpp
index baca6cb623..807618deef 100644
--- a/tests/unit/unittest/clangtooltipinfo-test.cpp
+++ b/tests/unit/unittest/clangtooltipinfo-test.cpp
@@ -584,6 +584,18 @@ TEST_F(ToolTipInfo, AutoTypeBuiltin)
ASSERT_THAT(actual.text, Utf8StringLiteral("int"));
}
+TEST_F(ToolTipInfo, PointerToPointerToClass)
+{
+ ::ToolTipInfo expected(Utf8StringLiteral("Nuu **"));
+ expected.qdocIdCandidates = {Utf8StringLiteral("Nuu")};
+ expected.qdocMark = Utf8StringLiteral("Nuu");
+ expected.qdocCategory = ::ToolTipInfo::ClassOrNamespace;
+
+ const ::ToolTipInfo actual = tooltip(200, 12);
+
+ ASSERT_THAT(actual, IsToolTip(expected));
+}
+
// TODO: Test for qdoc entries, too.
TEST_F(ToolTipInfo, AutoTypeEnum)
{
diff --git a/tests/unit/unittest/data/tooltipinfo.cpp b/tests/unit/unittest/data/tooltipinfo.cpp
index 266d86bc47..bfad1fdd0f 100644
--- a/tests/unit/unittest/data/tooltipinfo.cpp
+++ b/tests/unit/unittest/data/tooltipinfo.cpp
@@ -194,3 +194,8 @@ void constructor()
ExplicitCon();
ExplicitCon(2);
}
+
+Nuu **pointers(Nuu **p1)
+{
+ return p1;
+}