From d2b951565a36e706d508f1a93d1d1942cb4910cf Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Tue, 7 Aug 2018 10:05:31 +0200 Subject: [PATCH] Clang: Reuse full type qualification from tooltips Use qualification helper function from clangtooltipinfocollector.h instead of Unified Symbol Resolution (USR) not to deal with special symbols used in USR. Affects current document filter and symbol outline. Task-number: QTCREATORBUG-20917 Change-Id: I616ba1bf066e986e0ee75d47d30e45f94474c1cd Reviewed-by: Marco Bubke --- .../source/clangtooltipinfocollector.cpp | 28 +++++++++---------- .../source/clangtooltipinfocollector.h | 3 ++ .../clangbackend/source/fulltokeninfo.cpp | 26 ++++++++--------- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp index ba0ce0ffd18..201f6fc3401 100644 --- a/src/tools/clangbackend/source/clangtooltipinfocollector.cpp +++ b/src/tools/clangbackend/source/clangtooltipinfocollector.cpp @@ -44,6 +44,20 @@ namespace ClangBackEnd { +Utf8String qualificationPrefix(const Cursor &cursor) +{ + // TODO: Implement with qualificationPrefixAsVector() + Utf8String qualifiedName; + + for (Cursor parent = cursor.semanticParent(); + parent.isValid() && (parent.kind() == CXCursor_Namespace); + parent = parent.semanticParent()) { + qualifiedName = parent.spelling() + Utf8StringLiteral("::") + qualifiedName; + } + + return qualifiedName; +} + namespace { Utf8StringVector qualificationPrefixAsVector(const Cursor &cursor) @@ -59,20 +73,6 @@ Utf8StringVector qualificationPrefixAsVector(const Cursor &cursor) return result; } -Utf8String qualificationPrefix(const Cursor &cursor) -{ - // TODO: Implement with qualificationPrefixAsVector() - Utf8String qualifiedName; - - for (Cursor parent = cursor.semanticParent(); - parent.isValid() && (parent.kind() == CXCursor_Namespace); - parent = parent.semanticParent()) { - qualifiedName = parent.spelling() + Utf8StringLiteral("::") + qualifiedName; - } - - return qualifiedName; -} - Utf8String displayName(const Cursor &cursor) { if (cursor.kind() == CXCursor_ClassTemplate) { diff --git a/src/tools/clangbackend/source/clangtooltipinfocollector.h b/src/tools/clangbackend/source/clangtooltipinfocollector.h index 8009aa8bf4a..ae1609c2765 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 283798d0be4..1c8f9f37903 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,24 @@ 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)")); - } - return typeSpelling; +static Utf8String fullyQualifiedType(const Cursor &cursor) { + Utf8String prefix; + if (cursor.kind() == CXCursor_ClassTemplate || cursor.kind() == CXCursor_Namespace) + return qualificationPrefix(cursor) + cursor.displayName(); + 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,