diff options
author | Nikolai Kosjar <[email protected]> | 2016-07-27 14:48:42 +0200 |
---|---|---|
committer | Tim Jenssen <[email protected]> | 2016-07-29 12:03:07 +0000 |
commit | ad49e64ff00259fc1967768695dd5e5a0ee65c96 (patch) | |
tree | a547e6df1fa35dc5ae69960f3936d070e058887c /src/libs/cplusplus | |
parent | c8020af9972ddc71be291f98ecfb97f5edda7a66 (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.cpp | 8 | ||||
-rw-r--r-- | src/libs/cplusplus/pp-engine.h | 6 |
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; |