From c6c919e6719db3b100ee11b2c28ec11d8bdca528 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Wed, 25 May 2022 17:33:01 +0200 Subject: [PATCH] ClangCodeModel: Properly parse function types for outline Fixes: QTCREATORBUG-27587 Change-Id: Icf663e386fa90c209aa998d2d7ab7ae0fcb40792 Reviewed-by: Reviewed-by: Qt CI Bot Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 26 +++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 8d18164090f..64f8b014261 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -1550,11 +1550,29 @@ QString ClangdClient::displayNameFromDocumentSymbol(SymbolKind kind, const QStri case SymbolKind::Constructor: return name + detail; case SymbolKind::Method: - case LanguageServerProtocol::SymbolKind::Function: { - const int parenOffset = detail.indexOf(" ("); - if (parenOffset == -1) + case SymbolKind::Function: { + const int lastParenOffset = detail.lastIndexOf(')'); + if (lastParenOffset == -1) return name; - return name + detail.mid(parenOffset + 1) + " -> " + detail.mid(0, parenOffset); + int leftParensNeeded = 1; + int i = -1; + for (i = lastParenOffset - 1; i >= 0; --i) { + switch (detail.at(i).toLatin1()) { + case ')': + ++leftParensNeeded; + break; + case '(': + --leftParensNeeded; + break; + default: + break; + } + if (leftParensNeeded == 0) + break; + } + if (leftParensNeeded > 0) + return name; + return name + detail.mid(i) + " -> " + detail.left(i); } case SymbolKind::Variable: case SymbolKind::Field: