summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus/CppDocument.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/cplusplus/CppDocument.cpp')
-rw-r--r--src/libs/cplusplus/CppDocument.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 80476dd8b1..93f3654e4f 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -286,8 +286,10 @@ Document::~Document()
{
delete _translationUnit;
_translationUnit = 0;
- delete _control->diagnosticClient();
- delete _control;
+ if (_control) {
+ delete _control->diagnosticClient();
+ delete _control;
+ }
_control = 0;
}
@@ -296,6 +298,25 @@ Control *Document::control() const
return _control;
}
+Control *Document::swapControl(Control *newControl)
+{
+ if (newControl) {
+ const StringLiteral *fileId = newControl->stringLiteral(_translationUnit->fileId()->chars(),
+ _translationUnit->fileId()->size());
+ const auto newTranslationUnit = new TranslationUnit(newControl, fileId);
+ newTranslationUnit->setLanguageFeatures(_translationUnit->languageFeatures());
+ delete _translationUnit;
+ _translationUnit = newTranslationUnit;
+ } else {
+ delete _translationUnit;
+ _translationUnit = 0;
+ }
+
+ Control *oldControl = _control;
+ _control = newControl;
+ return oldControl;
+}
+
unsigned Document::revision() const
{
return _revision;
@@ -696,7 +717,8 @@ void Document::releaseSourceAndAST()
if (!_keepSourceAndASTCount.deref()) {
_source.clear();
_translationUnit->release();
- _control->squeeze();
+ if (_control)
+ _control->squeeze();
}
}