diff options
4 files changed, 28 insertions, 37 deletions
diff --git a/src/plugins/clangcodemodel/activationsequencecontextprocessor.cpp b/src/plugins/clangcodemodel/activationsequencecontextprocessor.cpp index ce9c5f0471..1b03f0e5b7 100644 --- a/src/plugins/clangcodemodel/activationsequencecontextprocessor.cpp +++ b/src/plugins/clangcodemodel/activationsequencecontextprocessor.cpp @@ -97,7 +97,7 @@ void ActivationSequenceContextProcessor::process() void ActivationSequenceContextProcessor::processActivationSequence() { - const int nonSpacePosition = findStartOfNonSpaceChar(m_startOfNamePosition); + const int nonSpacePosition = skipPrecedingWhitespace(m_assistInterface, m_startOfNamePosition); const auto activationSequence = m_assistInterface->textAt(nonSpacePosition - 3, 3); ActivationSequenceProcessor activationSequenceProcessor(activationSequence, nonSpacePosition, @@ -228,28 +228,40 @@ void ActivationSequenceContextProcessor::resetPositionsForEOFCompletionKind() m_operatorStartPosition = m_positionInDocument; } -int ActivationSequenceContextProcessor::findStartOfNonSpaceChar(int startPosition) +int ActivationSequenceContextProcessor::skipPrecedingWhitespace( + const TextEditor::AssistInterface *assistInterface, + int startPosition) { int position = startPosition; - while (m_assistInterface->characterAt(position - 1).isSpace()) + while (assistInterface->characterAt(position - 1).isSpace()) --position; return position; } -int ActivationSequenceContextProcessor::findStartOfName(int startPosition) +static bool isValidIdentifierChar(const QChar &character) +{ + return character.isLetterOrNumber() + || character == QLatin1Char('_') + || character.isHighSurrogate() + || character.isLowSurrogate(); +} + +int ActivationSequenceContextProcessor::findStartOfName( + const TextEditor::AssistInterface *assistInterface, + int startPosition) { int position = startPosition; QChar character; do { - character = m_assistInterface->characterAt(--position); - } while (character.isLetterOrNumber() || character == QLatin1Char('_')); + character = assistInterface->characterAt(--position); + } while (isValidIdentifierChar(character)); return position + 1; } void ActivationSequenceContextProcessor::goBackToStartOfName() { - m_startOfNamePosition = findStartOfName(m_positionInDocument); + m_startOfNamePosition = findStartOfName(m_assistInterface, m_positionInDocument); if (m_startOfNamePosition != m_positionInDocument) m_textCursor.setPosition(m_startOfNamePosition); diff --git a/src/plugins/clangcodemodel/activationsequencecontextprocessor.h b/src/plugins/clangcodemodel/activationsequencecontextprocessor.h index d85a44090e..f63bfa2c5a 100644 --- a/src/plugins/clangcodemodel/activationsequencecontextprocessor.h +++ b/src/plugins/clangcodemodel/activationsequencecontextprocessor.h @@ -55,10 +55,13 @@ public: const QTextCursor &textCursor_forTestOnly() const; + static int findStartOfName(const TextEditor::AssistInterface *assistInterface, + int startPosition); + static int skipPrecedingWhitespace(const TextEditor::AssistInterface *assistInterface, + int startPosition); + protected: void process(); - int findStartOfNonSpaceChar(int startPosition); - int findStartOfName(int startPosition); void goBackToStartOfName(); void processActivationSequence(); void processStringLiteral(); diff --git a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp index 63fd840878..eaa2b3d90a 100644 --- a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp +++ b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.cpp @@ -100,13 +100,15 @@ void ClangCompletionContextAnalyzer::analyze() ClangCompletionContextAnalyzer::FunctionInfo ClangCompletionContextAnalyzer::analyzeFunctionCall(int endOfOperator) const { - int index = skipPrecedingWhitespace(endOfOperator); + int index = ActivationSequenceContextProcessor::skipPrecedingWhitespace(m_interface, + endOfOperator); QTextCursor textCursor(m_interface->textDocument()); textCursor.setPosition(index); ExpressionUnderCursor euc(m_languageFeatures); index = euc.startOfFunctionCall(textCursor); - const int functionNameStart = findStartOfName(index); + const int functionNameStart = ActivationSequenceContextProcessor::findStartOfName(m_interface, + index); QTextCursor textCursor2(m_interface->textDocument()); textCursor2.setPosition(functionNameStart); @@ -118,29 +120,6 @@ ClangCompletionContextAnalyzer::analyzeFunctionCall(int endOfOperator) const return info; } -int ClangCompletionContextAnalyzer::findStartOfName(int position) const -{ - if (position == -1) - position = m_interface->position(); - QChar chr; - - do { - chr = m_interface->characterAt(--position); - // TODO: Check also chr.isHighSurrogate() / ch.isLowSurrogate()? - // See also CppTools::isValidFirstIdentifierChar - } while (chr.isLetterOrNumber() || chr == QLatin1Char('_')); - - return position + 1; -} - -int ClangCompletionContextAnalyzer::skipPrecedingWhitespace(int position) const -{ - QTC_ASSERT(position >= 0, return position); - while (m_interface->characterAt(position - 1).isSpace()) - --position; - return position; -} - void ClangCompletionContextAnalyzer::setActionAndClangPosition(CompletionAction action, int position) { diff --git a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.h b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.h index 2234adf604..3df4041675 100644 --- a/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.h +++ b/src/plugins/clangcodemodel/clangcompletioncontextanalyzer.h @@ -72,9 +72,6 @@ private: struct FunctionInfo { int functionNamePosition; QString functionName; }; FunctionInfo analyzeFunctionCall(int endOfExpression) const; - int findStartOfName(int position = -1) const; - int skipPrecedingWhitespace(int position) const; - void setActionAndClangPosition(CompletionAction action, int position); void setAction(CompletionAction action); |