From ea08c8c730019a01da3898b1b7e9318de1bd42f9 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Tue, 5 Sep 2017 22:35:54 +0200 Subject: [PATCH] logic: replace template arguments with .. in non-indexed nodes to reduce clutter in search results --- src/lib/data/storage/PersistentStorage.cpp | 24 ++++++++++++---- src/lib/utility/tracing.h | 6 ++-- src/lib/utility/utilityString.cpp | 32 ++++++++++++++++++++++ src/lib/utility/utilityString.h | 1 + 4 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/lib/data/storage/PersistentStorage.cpp b/src/lib/data/storage/PersistentStorage.cpp index e405ee59..dd513e73 100644 --- a/src/lib/data/storage/PersistentStorage.cpp +++ b/src/lib/data/storage/PersistentStorage.cpp @@ -684,10 +684,13 @@ std::vector PersistentStorage::getAutocompletionSymbolMatches( match.name = result.text; match.text = result.text; - const size_t idx = m_hierarchyCache.getIndexOfLastVisibleParentNode(firstNode->id); - const NameHierarchy& name = NameHierarchy::deserialize(firstNode->serializedName); - match.text = name.getRange(idx, name.size()).getQualifiedName(); - match.subtext = name.getRange(0, idx).getQualifiedName(); + NameHierarchy name = NameHierarchy::deserialize(firstNode->serializedName); + if (name.getQualifiedName() == match.name) + { + const size_t idx = m_hierarchyCache.getIndexOfLastVisibleParentNode(firstNode->id); + match.text = name.getRange(idx, name.size()).getQualifiedName(); + match.subtext = name.getRange(0, idx).getQualifiedName(); + } match.delimiter = name.getDelimiter(); @@ -2484,8 +2487,19 @@ void PersistentStorage::buildSearchIndex() auto it = m_symbolDefinitionKinds.find(node.id); if (it == m_symbolDefinitionKinds.end() || it->second != DEFINITION_IMPLICIT) { + NameHierarchy nameHierarchy = NameHierarchy::deserialize(node.serializedName); + // we don't use the signature here, so elements with the same signature share the same node. - m_symbolIndex.addNode(node.id, NameHierarchy::deserialize(node.serializedName).getQualifiedName()); + std::string name = nameHierarchy.getQualifiedName(); + + // replace template arguments with .. to avoid clutter in search results and have different + // template specializations share the same node. + if (it->second == DEFINITION_NONE && nameHierarchy.getDelimiter() == NAME_DELIMITER_CXX) + { + name = utility::replaceBetween(name, '<', '>', ".."); + } + + m_symbolIndex.addNode(node.id, name); } } } diff --git a/src/lib/utility/tracing.h b/src/lib/utility/tracing.h index 56ce922e..025b8deb 100644 --- a/src/lib/utility/tracing.h +++ b/src/lib/utility/tracing.h @@ -1,6 +1,10 @@ #ifndef TRACING_H #define TRACING_H + +// #define TRACING_ENABLED + + #include #include #include @@ -67,8 +71,6 @@ private: }; -// #define TRACING_ENABLED - #ifdef TRACING_ENABLED #define TRACE(__name__) \ ScopedTrace __trace__(std::string(__name__), __FILE__, __LINE__, __FUNCTION__) diff --git a/src/lib/utility/utilityString.cpp b/src/lib/utility/utilityString.cpp index 43ec6965..6e1b70e1 100644 --- a/src/lib/utility/utilityString.cpp +++ b/src/lib/utility/utilityString.cpp @@ -215,6 +215,38 @@ namespace utility return str; } + std::string replaceBetween(const std::string& str, char startDelimiter, char endDelimiter, const std::string& to) + { + size_t startPos = str.find(startDelimiter); + if (startPos == std::string::npos) + { + return str; + } + + size_t depth = 1; + + for (size_t pos = startPos + 1; pos < str.size(); pos++) + { + if (str[pos] == endDelimiter && depth) + { + depth--; + + if (depth == 0) + { + std::string end = replaceBetween(str.substr(pos + 1), startDelimiter, endDelimiter, to); + return str.substr(0, startPos) + startDelimiter + to + endDelimiter + end; + } + } + + if (str[pos] == startDelimiter) + { + depth++; + } + } + + return str; + } + std::string insertLineBreaksAtBlankSpaces(const std::string& s, size_t maxLineLength) { const std::vector atoms = splitToVector(s, " "); diff --git a/src/lib/utility/utilityString.h b/src/lib/utility/utilityString.h index f948705f..1cd6b3ef 100644 --- a/src/lib/utility/utilityString.h +++ b/src/lib/utility/utilityString.h @@ -45,6 +45,7 @@ namespace utility bool equalsCaseInsensitive(const std::string& a, const std::string& b); std::string replace(std::string str, const std::string& from, const std::string& to); + std::string replaceBetween(const std::string& str, char startDelimiter, char endDelimiter, const std::string& to); std::string insertLineBreaksAtBlankSpaces(const std::string& s, size_t maxLineLength); std::string breakSignature(