From 983e0dacd4ba17908250e41e0afc690f2b8d7e05 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Tue, 10 Jul 2018 15:28:09 +0200 Subject: [PATCH] logic: Show parameters for functions/methods with same name within same parent (issue #259) --- .../component/controller/GraphController.cpp | 41 +++++++++++++++++-- .../component/controller/GraphController.h | 1 + src/lib/data/graph/Node.cpp | 2 +- src/lib/data/graph/Node.h | 2 +- src/lib/data/name/NameElement.cpp | 10 +++++ src/lib/data/name/NameElement.h | 2 + src/lib/data/name/NameHierarchy.cpp | 9 ++++ src/lib/data/name/NameHierarchy.h | 1 + src/lib_utility/utility/utilityString.cpp | 12 +++++- src/lib_utility/utility/utilityString.h | 1 + 10 files changed, 75 insertions(+), 6 deletions(-) diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index a6b26a30..8254b0e4 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -1750,6 +1750,8 @@ void GraphController::layoutNesting() { TRACE(); + extendEqualFunctionNames(m_dummyNodes); + for (const std::shared_ptr& node : m_dummyNodes) { layoutNestingRecursive(node.get()); @@ -1761,6 +1763,40 @@ void GraphController::layoutNesting() } } +void GraphController::extendEqualFunctionNames(const std::vector>& nodes) const +{ + std::multimap> functionNames; + for (auto& node : nodes) + { + if (node->visible && node->isGraphNode() && node->data->isType(NodeType::NODE_FUNCTION | NodeType::NODE_METHOD)) + { + functionNames.emplace(node->name, node); + } + } + + for (auto it : functionNames) + { + if (functionNames.count(it.first) < 2) + { + continue; + } + + auto ret = functionNames.equal_range(it.first); + for (auto it2 = ret.first; it2 != ret.second; it2++) + { + it2->second->name = it2->second->data->getNameHierarchy().getRawNameWithSignatureParameters(); + } + } + + for (auto& node : nodes) + { + if (node->subNodes.size()) + { + extendEqualFunctionNames(node->subNodes); + } + } +} + void GraphController::layoutNestingRecursive(DummyNode* node) const { if (!node->visible) @@ -1813,10 +1849,9 @@ void GraphController::layoutNestingRecursive(DummyNode* node) const if (node->isGraphNode()) { - size_t maxNameSize = 50; - if (!node->active && node->name.size() > maxNameSize) + if (!node->active) { - node->name = node->name.substr(0, maxNameSize - 3) + L"..."; + node->name = utility::elide(node->name, utility::ELIDE_RIGHT, 50); } width = margins.charWidth * node->name.size(); diff --git a/src/lib/component/controller/GraphController.h b/src/lib/component/controller/GraphController.h index 6f0bda9e..6b2ccbbe 100644 --- a/src/lib/component/controller/GraphController.h +++ b/src/lib/component/controller/GraphController.h @@ -114,6 +114,7 @@ private: void groupTrailNodes(GroupType groupType); void layoutNesting(); + void extendEqualFunctionNames(const std::vector>& nodes) const; void layoutNestingRecursive(DummyNode* node) const; void addExpandToggleNode(DummyNode* node) const; void layoutToGrid(DummyNode* node) const; diff --git a/src/lib/data/graph/Node.cpp b/src/lib/data/graph/Node.cpp index 6a786bbc..1857cc95 100644 --- a/src/lib/data/graph/Node.cpp +++ b/src/lib/data/graph/Node.cpp @@ -64,7 +64,7 @@ std::wstring Node::getFullName() const return m_nameHierarchy.getQualifiedName(); } -NameHierarchy Node::getNameHierarchy() const +const NameHierarchy& Node::getNameHierarchy() const { return m_nameHierarchy; } diff --git a/src/lib/data/graph/Node.h b/src/lib/data/graph/Node.h index 07a2aae3..08600017 100644 --- a/src/lib/data/graph/Node.h +++ b/src/lib/data/graph/Node.h @@ -26,7 +26,7 @@ public: std::wstring getName() const; std::wstring getFullName() const; - NameHierarchy getNameHierarchy() const; + const NameHierarchy& getNameHierarchy() const; bool isDefined() const; bool isImplicit() const; diff --git a/src/lib/data/name/NameElement.cpp b/src/lib/data/name/NameElement.cpp index 5f3e0680..288bee99 100644 --- a/src/lib/data/name/NameElement.cpp +++ b/src/lib/data/name/NameElement.cpp @@ -71,6 +71,11 @@ const std::wstring& NameElement::Signature::getPostfix() const return m_postfix; } +std::wstring NameElement::Signature::getParameterString() const +{ + return utility::substrBeforeLast(m_postfix, L')') + L')'; +} + NameElement::NameElement(const std::wstring& name) : m_name(name) { @@ -96,6 +101,11 @@ std::wstring NameElement::getNameWithSignature() const return m_signature.qualifyName(m_name); } +std::wstring NameElement::getNameWithSignatureParameters() const +{ + return m_name + m_signature.getParameterString(); +} + bool NameElement::hasSignature() const { return m_signature.isValid(); diff --git a/src/lib/data/name/NameElement.h b/src/lib/data/name/NameElement.h index d0248815..d7841672 100644 --- a/src/lib/data/name/NameElement.h +++ b/src/lib/data/name/NameElement.h @@ -23,6 +23,7 @@ public: const std::wstring& getPrefix() const; const std::wstring& getPostfix() const; + std::wstring getParameterString() const; private: std::wstring m_prefix; @@ -35,6 +36,7 @@ public: std::wstring getName() const; std::wstring getNameWithSignature() const; + std::wstring getNameWithSignatureParameters() const; bool hasSignature() const; Signature getSignature(); diff --git a/src/lib/data/name/NameHierarchy.cpp b/src/lib/data/name/NameHierarchy.cpp index cafc0c7d..719f575d 100644 --- a/src/lib/data/name/NameHierarchy.cpp +++ b/src/lib/data/name/NameHierarchy.cpp @@ -188,6 +188,15 @@ std::wstring NameHierarchy::getRawNameWithSignature() const return L""; } +std::wstring NameHierarchy::getRawNameWithSignatureParameters() const +{ + if (m_elements.size()) + { + return m_elements.back()->getNameWithSignatureParameters(); + } + return L""; +} + bool NameHierarchy::hasSignature() const { if (m_elements.size()) diff --git a/src/lib/data/name/NameHierarchy.h b/src/lib/data/name/NameHierarchy.h index ef8f0796..02c62334 100644 --- a/src/lib/data/name/NameHierarchy.h +++ b/src/lib/data/name/NameHierarchy.h @@ -40,6 +40,7 @@ public: std::wstring getQualifiedNameWithSignature() const; std::wstring getRawName() const; std::wstring getRawNameWithSignature() const; + std::wstring getRawNameWithSignatureParameters() const; bool hasSignature() const; NameElement::Signature getSignature() const; diff --git a/src/lib_utility/utility/utilityString.cpp b/src/lib_utility/utility/utilityString.cpp index c84b9c61..c953b66b 100644 --- a/src/lib_utility/utility/utilityString.cpp +++ b/src/lib_utility/utility/utilityString.cpp @@ -217,12 +217,22 @@ namespace utility return str; } + std::wstring substrAfterLast(const std::wstring& str, wchar_t delimiter) + { + size_t pos = str.rfind(delimiter); + if (pos != std::wstring::npos) + { + return str.substr(pos + 1, std::wstring::npos); + } + return str; + } + std::string substrAfter(const std::string& str, char delimiter) { size_t pos = str.find(delimiter); if (pos != std::string::npos) { - return str.substr(pos + 1, str.size()); + return str.substr(pos + 1, std::wstring::npos); } return str; } diff --git a/src/lib_utility/utility/utilityString.h b/src/lib_utility/utility/utilityString.h index 0c3a9a91..1ebd149a 100644 --- a/src/lib_utility/utility/utilityString.h +++ b/src/lib_utility/utility/utilityString.h @@ -45,6 +45,7 @@ namespace utility std::string substrBeforeFirst(const std::string& str, const std::string& delimiter); std::string substrBeforeLast(const std::string& str, char delimiter); std::wstring substrBeforeLast(const std::wstring& str, wchar_t delimiter); + std::wstring substrAfterLast(const std::wstring& str, wchar_t delimiter); std::string substrAfter(const std::string& str, char delimiter); std::string substrAfter(const std::string& str, const std::string& delimiter);