diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-12-04 12:53:04 +0100 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2018-12-06 08:55:28 +0000 |
commit | 6889f4df80d21b2121eef85cac2a6f58dd946106 (patch) | |
tree | 7565398db2beaa1f8e6969ca6b097773fc1ea8aa | |
parent | 42b38cc957aeb6120cc94e44dfaaad562d448f1b (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.cpp | 14 | ||||
-rw-r--r-- | tests/unit/unittest/clangtooltipinfo-test.cpp | 12 | ||||
-rw-r--r-- | tests/unit/unittest/data/tooltipinfo.cpp | 5 |
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; +} |