aboutsummaryrefslogtreecommitdiffstats
path: root/src/tools
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2018-08-07 10:05:31 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-08-20 09:12:22 +0000
commit3286b6a36de6c37c8812e4bf2102099b1269b8a0 (patch)
treefda7233736e2c6d5f03bb3ab6f757f29b0cf86d6 /src/tools
parent7a8e6b052ee01cfcd20fd0752749349421da719f (diff)
Clang: Reuse full type qualification from tooltips
Backported from master. Use qualification helper function from clangtooltipinfocollector.h instead of Unified Symbol Resolution (USR) not to deal with special symbols used in USR. Exception: handle anonymous namespaces via USR because they don't have displayName. Affects current document filter and symbol outline. Task-number: QTCREATORBUG-20917 Change-Id: I97f8fbc8a9f380d220d85837568f56a1a217f035 Reviewed-by: Marco Bubke <marco.bubke@qt.io>
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/clangbackend/source/clangtooltipinfocollector.cpp26
-rw-r--r--src/tools/clangbackend/source/clangtooltipinfocollector.h3
-rw-r--r--src/tools/clangbackend/source/fulltokeninfo.cpp27
3 files changed, 29 insertions, 27 deletions
diff --git a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp
index ba0ce0ffd1..201f6fc340 100644
--- a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp
+++ b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp
@@ -44,33 +44,33 @@
namespace ClangBackEnd {
-namespace {
-
-Utf8StringVector qualificationPrefixAsVector(const Cursor &cursor)
+Utf8String qualificationPrefix(const Cursor &cursor)
{
- Utf8StringVector result;
+ // TODO: Implement with qualificationPrefixAsVector()
+ Utf8String qualifiedName;
for (Cursor parent = cursor.semanticParent();
- parent.isValid() && (parent.kind() == CXCursor_Namespace || parent.isCompoundType());
+ parent.isValid() && (parent.kind() == CXCursor_Namespace);
parent = parent.semanticParent()) {
- result.prepend(parent.spelling());
+ qualifiedName = parent.spelling() + Utf8StringLiteral("::") + qualifiedName;
}
- return result;
+ return qualifiedName;
}
-Utf8String qualificationPrefix(const Cursor &cursor)
+namespace {
+
+Utf8StringVector qualificationPrefixAsVector(const Cursor &cursor)
{
- // TODO: Implement with qualificationPrefixAsVector()
- Utf8String qualifiedName;
+ Utf8StringVector result;
for (Cursor parent = cursor.semanticParent();
- parent.isValid() && (parent.kind() == CXCursor_Namespace);
+ parent.isValid() && (parent.kind() == CXCursor_Namespace || parent.isCompoundType());
parent = parent.semanticParent()) {
- qualifiedName = parent.spelling() + Utf8StringLiteral("::") + qualifiedName;
+ result.prepend(parent.spelling());
}
- return qualifiedName;
+ return result;
}
Utf8String displayName(const Cursor &cursor)
diff --git a/src/tools/clangbackend/source/clangtooltipinfocollector.h b/src/tools/clangbackend/source/clangtooltipinfocollector.h
index 8009aa8bf4..ae1609c276 100644
--- a/src/tools/clangbackend/source/clangtooltipinfocollector.h
+++ b/src/tools/clangbackend/source/clangtooltipinfocollector.h
@@ -33,6 +33,7 @@
namespace ClangBackEnd {
+class Cursor;
class UnsavedFiles;
ToolTipInfo collectToolTipInfo(UnsavedFiles &unsavedFiles,
@@ -42,4 +43,6 @@ ToolTipInfo collectToolTipInfo(UnsavedFiles &unsavedFiles,
uint line,
uint column);
+Utf8String qualificationPrefix(const Cursor &cursor);
+
} // namespace ClangBackEnd
diff --git a/src/tools/clangbackend/source/fulltokeninfo.cpp b/src/tools/clangbackend/source/fulltokeninfo.cpp
index 283798d0be..e850e0495c 100644
--- a/src/tools/clangbackend/source/fulltokeninfo.cpp
+++ b/src/tools/clangbackend/source/fulltokeninfo.cpp
@@ -24,6 +24,7 @@
****************************************************************************/
#include "clangstring.h"
+#include "clangtooltipinfocollector.h"
#include "cursor.h"
#include "fulltokeninfo.h"
#include "sourcerange.h"
@@ -46,29 +47,27 @@ FullTokenInfo::operator TokenInfoContainer() const
return TokenInfoContainer(line(), column(), length(), m_types, m_extraInfo);
}
-static Utf8String fullyQualifiedType(const Cursor &cursor)
-{
- Utf8String typeSpelling = cursor.type().canonical().utf8Spelling();
- if (typeSpelling.isEmpty()) {
- // Only if it's the namespaces level.
- typeSpelling = cursor.unifiedSymbolResolution();
- typeSpelling.replace(Utf8StringLiteral("c:@N@"), Utf8StringLiteral(""));
- typeSpelling.replace(Utf8StringLiteral("@N@"), Utf8StringLiteral("::"));
- typeSpelling.replace(Utf8StringLiteral("c:@aN"), Utf8StringLiteral("(anonymous)"));
+static Utf8String fullyQualifiedType(const Cursor &cursor) {
+ Utf8String prefix;
+ if (cursor.kind() == CXCursor_ClassTemplate || cursor.kind() == CXCursor_Namespace) {
+ if (cursor.unifiedSymbolResolution() == "c:@aN")
+ return Utf8String::fromUtf8("(anonymous)");
+ return qualificationPrefix(cursor) + cursor.displayName();
}
- return typeSpelling;
+ return cursor.type().canonical().spelling();
}
void FullTokenInfo::updateTypeSpelling(const Cursor &cursor, bool functionLike)
{
- m_extraInfo.typeSpelling = fullyQualifiedType(cursor);
m_extraInfo.semanticParentTypeSpelling = fullyQualifiedType(cursor.semanticParent());
- if (!functionLike)
+ if (!functionLike) {
+ m_extraInfo.typeSpelling = fullyQualifiedType(cursor);
return;
- Type type = cursor.type().canonical();
+ }
+
m_extraInfo.token = cursor.displayName();
// On the client side full type is typeSpelling + token.
- m_extraInfo.typeSpelling = type.resultType().utf8Spelling();
+ m_extraInfo.typeSpelling = cursor.type().resultType().utf8Spelling();
}
static Utf8String propertyParentSpelling(CXTranslationUnit cxTranslationUnit,