Revision control

++ // Copyright (C) 2023 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++ #include "qqmlcompletioncontextstrings_p.h"
++
++ CompletionContextStrings::CompletionContextStrings(QString code, qsizetype pos)
++ : m_code(code), m_pos(pos)
++ {
++ // computes the context just before pos in code.
++ // After this code all the values of all the attributes should be correct (see above)
++ // handle also letter or numbers represented a surrogate pairs?
++ m_filterStart = m_pos;
++ while (m_filterStart != 0) {
++ QChar c = code.at(m_filterStart - 1);
++ if (!c.isLetterOrNumber() && c != u'_')
++ break;
++ else
++ --m_filterStart;
++ }
++ // handle spaces?
++ m_baseStart = m_filterStart;
++ while (m_baseStart != 0) {
++ QChar c = code.at(m_baseStart - 1);
++ if (c != u'.' || m_baseStart == 1)
++ break;
++ c = code.at(m_baseStart - 2);
++ if (!c.isLetterOrNumber() && c != u'_')
++ break;
++ qsizetype baseEnd = --m_baseStart;
++ while (m_baseStart != 0) {
++ QChar c = code.at(m_baseStart - 1);
++ if (!c.isLetterOrNumber() && c != u'_')
++ break;
++ else
++ --m_baseStart;
++ }
++ if (m_baseStart == baseEnd)
++ break;
++ }
++ m_atLineStart = true;
++ m_lineStart = m_baseStart;
++ while (m_lineStart != 0) {
++ QChar c = code.at(m_lineStart - 1);
++ if (c == u'\n' || c == u'\r')
++ break;
++ if (!c.isSpace())
++ m_atLineStart = false;
++ --m_lineStart;
++ }
++ }