From 242579099a3fd31499e03b945e866e7159f4a1fb Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 15 Sep 2020 15:27:32 +0200 Subject: [PATCH] CppTools: Fix QStringRef and QSharedPointer related issues with Qt6 Task-number: QTCREATORBUG-24098 Change-Id: I97347ac3fb397fea8eee655e3cc4ee252c511885 Reviewed-by: hjk --- src/libs/cplusplus/BackwardsScanner.cpp | 6 ++++-- src/libs/cplusplus/BackwardsScanner.h | 3 ++- src/libs/cplusplus/MatchingText.cpp | 2 +- src/libs/cplusplus/SimpleLexer.cpp | 4 +++- src/plugins/cpptools/cppcodeformatter.cpp | 10 ++++++---- src/plugins/cpptools/cppcodeformatter.h | 2 +- src/plugins/cpptools/cppcompletionassist.cpp | 9 ++++++--- src/plugins/cpptools/cpplocatorfilter.cpp | 2 +- src/plugins/cpptools/cppoverviewmodel.cpp | 2 +- .../cpptools/cpptoolsbridgeqtcreatorimplementation.cpp | 2 +- 10 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/libs/cplusplus/BackwardsScanner.cpp b/src/libs/cplusplus/BackwardsScanner.cpp index e547f831036..0bb4857ee8a 100644 --- a/src/libs/cplusplus/BackwardsScanner.cpp +++ b/src/libs/cplusplus/BackwardsScanner.cpp @@ -113,10 +113,12 @@ QString BackwardsScanner::text(int index) const return _text.mid(firstToken.utf16charsBegin(), firstToken.utf16chars()); } -QStringRef BackwardsScanner::textRef(int index) const +QStringView BackwardsScanner::textRef(int index) const { const Token &firstToken = _tokens.at(index + _offset); - return _text.midRef(firstToken.utf16charsBegin(), firstToken.utf16chars()); + if (firstToken.utf16charsEnd() > _text.size()) + return QStringView(_text).mid(firstToken.utf16charsBegin()); + return QStringView(_text).mid(firstToken.utf16charsBegin(), firstToken.utf16chars()); } int BackwardsScanner::size() const diff --git a/src/libs/cplusplus/BackwardsScanner.h b/src/libs/cplusplus/BackwardsScanner.h index 9d732f85826..7949f3d60df 100644 --- a/src/libs/cplusplus/BackwardsScanner.h +++ b/src/libs/cplusplus/BackwardsScanner.h @@ -27,6 +27,7 @@ #include "SimpleLexer.h" +#include #include QT_FORWARD_DECLARE_CLASS(QTextCursor) @@ -52,7 +53,7 @@ public: QString mid(int index) const; QString text(int index) const; - QStringRef textRef(int index) const; + QStringView textRef(int index) const; // 1-based Token LA(int index) const; diff --git a/src/libs/cplusplus/MatchingText.cpp b/src/libs/cplusplus/MatchingText.cpp index 9e1ffdecb88..dafe521dd47 100644 --- a/src/libs/cplusplus/MatchingText.cpp +++ b/src/libs/cplusplus/MatchingText.cpp @@ -54,7 +54,7 @@ static bool shouldOverrideChar(QChar ch) static bool isCompleteStringLiteral(const BackwardsScanner &tk, int index) { - const QStringRef text = tk.textRef(index); + const QStringView text = tk.textRef(index); if (text.length() < 2) return false; diff --git a/src/libs/cplusplus/SimpleLexer.cpp b/src/libs/cplusplus/SimpleLexer.cpp index 57bad400de6..a5e2965367c 100644 --- a/src/libs/cplusplus/SimpleLexer.cpp +++ b/src/libs/cplusplus/SimpleLexer.cpp @@ -87,7 +87,9 @@ Tokens SimpleLexer::operator()(const QString &text, int state) break; } - QStringRef spell = text.midRef(tk.bytesBegin(), tk.bytes()); + const QStringView spell = tk.bytesBegin() + tk.bytes() > text.size() + ? QStringView(text).mid(tk.bytesBegin()) + : QStringView(text).mid(tk.bytesBegin(), tk.bytes()); lex.setScanAngleStringLiteralTokens(false); if (tk.newline() && tk.is(T_POUND)) diff --git a/src/plugins/cpptools/cppcodeformatter.cpp b/src/plugins/cpptools/cppcodeformatter.cpp index c8ba07fbe09..ddd1079c326 100644 --- a/src/plugins/cpptools/cppcodeformatter.cpp +++ b/src/plugins/cpptools/cppcodeformatter.cpp @@ -528,7 +528,7 @@ void CodeFormatter::recalculateStateAfter(const QTextBlock &block) } } - QStringRef tokenText = currentTokenText(); + QStringView tokenText = currentTokenText(); if (tokenText == QLatin1String("ifdef") || tokenText == QLatin1String("if") || tokenText == QLatin1String("ifndef")) { @@ -854,7 +854,7 @@ bool CodeFormatter::tryDeclaration() return true; case T_IDENTIFIER: if (m_tokenIndex == 0) { - const QStringRef tokenText = currentTokenText(); + const QStringView tokenText = currentTokenText(); if (tokenText.startsWith(QLatin1String("Q_")) || tokenText.startsWith(QLatin1String("QT_")) || tokenText.startsWith(QLatin1String("QML_")) @@ -1009,9 +1009,11 @@ int CodeFormatter::column(int index) const return col; } -QStringRef CodeFormatter::currentTokenText() const +QStringView CodeFormatter::currentTokenText() const { - return m_currentLine.midRef(m_currentToken.utf16charsBegin(), m_currentToken.utf16chars()); + if (m_currentToken.utf16charsEnd() > m_currentLine.size()) + return QStringView(m_currentLine).mid(m_currentToken.utf16charsBegin()); + return QStringView(m_currentLine).mid(m_currentToken.utf16charsBegin(), m_currentToken.utf16chars()); } void CodeFormatter::turnInto(int newState) diff --git a/src/plugins/cpptools/cppcodeformatter.h b/src/plugins/cpptools/cppcodeformatter.h index cf3eab98cb4..1164c12eb10 100644 --- a/src/plugins/cpptools/cppcodeformatter.h +++ b/src/plugins/cpptools/cppcodeformatter.h @@ -216,7 +216,7 @@ private: void saveCurrentState(const QTextBlock &block); void restoreCurrentState(const QTextBlock &block); - QStringRef currentTokenText() const; + QStringView currentTokenText() const; int tokenizeBlock(const QTextBlock &block, bool *endedJoined = nullptr); diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index 48d7ea6beba..92dd8ce1ece 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -880,9 +880,12 @@ bool InternalCppCompletionAssistProcessor::accepts() const && tokens.at(1).kind() == T_IDENTIFIER) { const QString &line = tc.block().text(); const Token &idToken = tokens.at(1); - const QStringRef &identifier = - line.midRef(idToken.utf16charsBegin(), - idToken.utf16charsEnd() - idToken.utf16charsBegin()); + const QStringView &identifier = idToken.utf16charsEnd() > line.size() + ? QStringView(line).mid( + idToken.utf16charsBegin()) + : QStringView(line) + .mid(idToken.utf16charsBegin(), + idToken.utf16chars()); if (identifier == QLatin1String("include") || identifier == QLatin1String("include_next") || (m_interface->languageFeatures().objCEnabled && identifier == QLatin1String("import"))) { diff --git a/src/plugins/cpptools/cpplocatorfilter.cpp b/src/plugins/cpptools/cpplocatorfilter.cpp index 000091bde47..1705634cad0 100644 --- a/src/plugins/cpptools/cpplocatorfilter.cpp +++ b/src/plugins/cpptools/cpplocatorfilter.cpp @@ -101,7 +101,7 @@ QList CppLocatorFilter::matchesFor( // Highlight the matched characters, therefore it may be necessary // to update the match if the displayName is different from matchString - if (matchString.midRef(matchOffset) != filterEntry.displayName) { + if (QStringView(matchString).mid(matchOffset) != filterEntry.displayName) { match = shortRegexp.match(filterEntry.displayName); matchOffset = 0; } diff --git a/src/plugins/cpptools/cppoverviewmodel.cpp b/src/plugins/cpptools/cppoverviewmodel.cpp index 6fd9b161dcf..74f4404b1bd 100644 --- a/src/plugins/cpptools/cppoverviewmodel.cpp +++ b/src/plugins/cpptools/cppoverviewmodel.cpp @@ -132,7 +132,7 @@ QVariant SymbolItem::data(int /*column*/, int role) const bool OverviewModel::hasDocument() const { - return _cppDocument; + return !_cppDocument.isNull(); } int OverviewModel::globalSymbolCount() const diff --git a/src/plugins/cpptools/cpptoolsbridgeqtcreatorimplementation.cpp b/src/plugins/cpptools/cpptoolsbridgeqtcreatorimplementation.cpp index c8acdb9918d..5919cc4b171 100644 --- a/src/plugins/cpptools/cpptoolsbridgeqtcreatorimplementation.cpp +++ b/src/plugins/cpptools/cpptoolsbridgeqtcreatorimplementation.cpp @@ -55,7 +55,7 @@ CppTools::ProjectPart::Ptr projectPartForFile(const QString &filePath) bool isProjectPartValid(const CppTools::ProjectPart::Ptr projectPart) { if (projectPart) - return CppTools::CppModelManager::instance()->projectPartForId(projectPart->id()); + return !CppTools::CppModelManager::instance()->projectPartForId(projectPart->id()).isNull(); return false; }