Files
qt-creator/src/plugins/clangcodemodel/clangpreprocessorassistproposalitem.cpp
Lucie Gérard a7956df3ca Use SPDX license identifiers
Replace the current license disclaimer in files by
a SPDX-License-Identifier.

Task-number: QTBUG-67283
Change-Id: I708fd1f9f2b73d60f57cc3568646929117825813
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
2022-08-26 12:27:18 +00:00

145 lines
3.8 KiB
C++

// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#include "clangpreprocessorassistproposalitem.h"
#include <texteditor/texteditor.h>
#include <cplusplus/Token.h>
namespace ClangCodeModel {
namespace Internal {
bool ClangPreprocessorAssistProposalItem::prematurelyApplies(const QChar &typedCharacter) const
{
bool applies = false;
if (isInclude())
applies = typedCharacter == QLatin1Char('/') && text().endsWith(QLatin1Char('/'));
if (applies)
m_typedCharacter = typedCharacter;
return applies;
}
bool ClangPreprocessorAssistProposalItem::implicitlyApplies() const
{
return true;
}
void ClangPreprocessorAssistProposalItem::apply(TextEditor::TextDocumentManipulatorInterface &manipulator,
int basePosition) const
{
// TODO move in an extra class under tests
QString textToBeInserted = text();
QString extraCharacters;
int extraLength = 0;
if (isInclude()) {
if (!textToBeInserted.endsWith(QLatin1Char('/'))) {
extraCharacters += QLatin1Char((m_completionOperator == CPlusPlus::T_ANGLE_STRING_LITERAL) ? '>' : '"');
} else {
if (m_typedCharacter == QLatin1Char('/')) // Eat the slash
m_typedCharacter = QChar();
}
}
if (!m_typedCharacter.isNull())
extraCharacters += m_typedCharacter;
// Avoid inserting characters that are already there
const int endsPosition = manipulator.positionAt(TextEditor::EndOfLinePosition);
const QString existingText = manipulator.textAt(manipulator.currentPosition(), endsPosition - manipulator.currentPosition());
int existLength = 0;
if (!existingText.isEmpty()) {
// Calculate the exist length in front of the extra chars
existLength = textToBeInserted.length() - (manipulator.currentPosition() - basePosition);
while (!existingText.startsWith(textToBeInserted.right(existLength))) {
if (--existLength == 0)
break;
}
}
for (int i = 0; i < extraCharacters.length(); ++i) {
const QChar a = extraCharacters.at(i);
const QChar b = manipulator.characterAt(manipulator.currentPosition() + i + existLength);
if (a == b)
++extraLength;
else
break;
}
textToBeInserted += extraCharacters;
// Insert the remainder of the name
const int length = manipulator.currentPosition() - basePosition + existLength + extraLength;
manipulator.replace(basePosition, length, textToBeInserted);
}
void ClangPreprocessorAssistProposalItem::setText(const QString &text)
{
m_text = text;
}
QString ClangPreprocessorAssistProposalItem::text() const
{
return m_text;
}
void ClangPreprocessorAssistProposalItem::setIcon(const QIcon &icon)
{
m_icon = icon;
}
QIcon ClangPreprocessorAssistProposalItem::icon() const
{
return m_icon;
}
void ClangPreprocessorAssistProposalItem::setDetail(const QString &detail)
{
m_detail = detail;
}
QString ClangPreprocessorAssistProposalItem::detail() const
{
return QString();
}
Qt::TextFormat ClangPreprocessorAssistProposalItem::detailFormat() const
{
return Qt::RichText;
}
bool ClangPreprocessorAssistProposalItem::isSnippet() const
{
return false;
}
bool ClangPreprocessorAssistProposalItem::isValid() const
{
return true;
}
quint64 ClangPreprocessorAssistProposalItem::hash() const
{
return 0;
}
void ClangPreprocessorAssistProposalItem::setCompletionOperator(uint completionOperator)
{
m_completionOperator = completionOperator;
}
bool ClangPreprocessorAssistProposalItem::isInclude() const
{
return m_completionOperator == CPlusPlus::T_STRING_LITERAL
|| m_completionOperator == CPlusPlus::T_ANGLE_STRING_LITERAL;
}
} // namespace Internal
} // namespace ClangCodeModel