summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/baseeditordocumentprocessor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cpptools/baseeditordocumentprocessor.cpp')
-rw-r--r--src/plugins/cpptools/baseeditordocumentprocessor.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.cpp b/src/plugins/cpptools/baseeditordocumentprocessor.cpp
new file mode 100644
index 0000000000..e8992da58e
--- /dev/null
+++ b/src/plugins/cpptools/baseeditordocumentprocessor.cpp
@@ -0,0 +1,135 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "baseeditordocumentprocessor.h"
+#include "cppworkingcopy.h"
+
+#include "editordocumenthandle.h"
+
+#include <utils/qtcassert.h>
+
+#include <QTextBlock>
+
+namespace CppTools {
+
+/*!
+ \class CppTools::BaseEditorDocumentProcessor
+
+ \brief The BaseEditorDocumentProcessor class controls and executes all
+ document relevant actions (reparsing, semantic highlighting, additional
+ semantic calculations) after a text document has changed.
+*/
+
+BaseEditorDocumentProcessor::BaseEditorDocumentProcessor(
+ TextEditor::BaseTextDocument *document)
+ : m_baseTextDocument(document)
+{
+ QTC_CHECK(document);
+}
+
+BaseEditorDocumentProcessor::~BaseEditorDocumentProcessor()
+{
+}
+
+TextEditor::BaseTextDocument *BaseEditorDocumentProcessor::baseTextDocument() const
+{
+ return m_baseTextDocument;
+}
+
+BaseEditorDocumentProcessor *BaseEditorDocumentProcessor::get(const QString &filePath)
+{
+ CppModelManagerInterface *cmmi = CppModelManagerInterface::instance();
+ if (EditorDocumentHandle *editorDocument = cmmi->editorDocument(filePath))
+ return editorDocument->processor();
+ return 0;
+}
+
+QList<QTextEdit::ExtraSelection> BaseEditorDocumentProcessor::toTextEditorSelections(
+ const QList<CPlusPlus::Document::DiagnosticMessage> &diagnostics,
+ QTextDocument *textDocument)
+{
+ // Format for errors
+ QTextCharFormat errorFormat;
+ errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
+ errorFormat.setUnderlineColor(Qt::red);
+
+ // Format for warnings
+ QTextCharFormat warningFormat;
+ warningFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline);
+ warningFormat.setUnderlineColor(Qt::darkYellow);
+
+ QList<QTextEdit::ExtraSelection> result;
+ foreach (const CPlusPlus::Document::DiagnosticMessage &m, diagnostics) {
+ QTextEdit::ExtraSelection sel;
+ if (m.isWarning())
+ sel.format = warningFormat;
+ else
+ sel.format = errorFormat;
+
+ QTextCursor c(textDocument->findBlockByNumber(m.line() - 1));
+ const QString text = c.block().text();
+ if (m.length() > 0 && m.column() + m.length() < (unsigned)text.size()) {
+ int column = m.column() > 0 ? m.column() - 1 : 0;
+ c.setPosition(c.position() + column);
+ c.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, m.length());
+ } else {
+ for (int i = 0; i < text.size(); ++i) {
+ if (!text.at(i).isSpace()) {
+ c.setPosition(c.position() + i);
+ break;
+ }
+ }
+ c.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor);
+ }
+ sel.cursor = c;
+ sel.format.setToolTip(m.text());
+ result.append(sel);
+ }
+
+ return result;
+}
+
+void BaseEditorDocumentProcessor::runParser(QFutureInterface<void> &future,
+ BaseEditorDocumentParser *parser,
+ WorkingCopy workingCopy)
+{
+ future.setProgressRange(0, 1);
+ if (future.isCanceled()) {
+ future.setProgressValue(1);
+ return;
+ }
+
+ parser->update(workingCopy);
+ CppModelManagerInterface::instance()
+ ->finishedRefreshingSourceFiles(QStringList(parser->filePath()));
+
+ future.setProgressValue(1);
+}
+
+} // namespace CppTools