aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/cplusplus
diff options
context:
space:
mode:
authorNikolai Kosjar <[email protected]>2016-07-27 14:48:42 +0200
committerTim Jenssen <[email protected]>2016-07-29 12:03:07 +0000
commitad49e64ff00259fc1967768695dd5e5a0ee65c96 (patch)
treea547e6df1fa35dc5ae69960f3936d070e058887c /src/libs/cplusplus
parentc8020af9972ddc71be291f98ecfb97f5edda7a66 (diff)
CppTools: Cancel parsing if editor is closed
The m_parserFuture.cancel() in ~BuiltinEditorDocumentProcessor() did not cancel anything. Thus, closing a document while the parser was running led to a blocking UI thread. Now it cancels at the next include directive it encounters. Change-Id: I092fddbbd747e0bc95265b6e9b4fcc26b3f76cb3 Reviewed-by: Friedemann Kleint <[email protected]> Reviewed-by: Tim Jenssen <[email protected]>
Diffstat (limited to 'src/libs/cplusplus')
-rw-r--r--src/libs/cplusplus/pp-engine.cpp8
-rw-r--r--src/libs/cplusplus/pp-engine.h6
2 files changed, 14 insertions, 0 deletions
diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp
index 134fb4d51c8..6a414d8b0fd 100644
--- a/src/libs/cplusplus/pp-engine.cpp
+++ b/src/libs/cplusplus/pp-engine.cpp
@@ -762,6 +762,11 @@ QByteArray Preprocessor::run(const QString &fileName,
return preprocessed;
}
+void Preprocessor::setCancelChecker(const Preprocessor::CancelChecker &cancelChecker)
+{
+ m_cancelChecker = cancelChecker;
+}
+
bool Preprocessor::expandFunctionlikeMacros() const
{
return m_expandFunctionlikeMacros;
@@ -1636,6 +1641,9 @@ void Preprocessor::handlePreprocessorDirective(PPToken *tk)
void Preprocessor::handleIncludeDirective(PPToken *tk, bool includeNext)
{
+ if (m_cancelChecker && m_cancelChecker())
+ return;
+
m_state.m_lexer->setScanAngleStringLiteralTokens(true);
lex(tk); // consume "include" token
m_state.m_lexer->setScanAngleStringLiteralTokens(false);
diff --git a/src/libs/cplusplus/pp-engine.h b/src/libs/cplusplus/pp-engine.h
index b265de6d46a..19935b2c7d9 100644
--- a/src/libs/cplusplus/pp-engine.h
+++ b/src/libs/cplusplus/pp-engine.h
@@ -56,6 +56,8 @@
#include <QByteArray>
#include <QPair>
+#include <functional>
+
namespace CPlusPlus {
class Environment;
@@ -81,6 +83,9 @@ public:
QByteArray run(const QString &filename, const QByteArray &source,
bool noLines = false, bool markGeneratedTokens = true);
+ using CancelChecker = std::function<bool()>;
+ void setCancelChecker(const CancelChecker &cancelChecker);
+
bool expandFunctionlikeMacros() const;
void setExpandFunctionlikeMacros(bool expandFunctionlikeMacros);
@@ -253,6 +258,7 @@ private:
Client *m_client;
Environment *m_env;
QByteArray m_scratchBuffer;
+ CancelChecker m_cancelChecker;
bool m_expandFunctionlikeMacros;
bool m_keepComments;