Merge remote-tracking branch 'origin/4.2'

Conflicts:
	src/plugins/android/androidbuildapkstep.cpp
	src/plugins/genericprojectmanager/genericproject.cpp

Change-Id: I3484b668f9323ed0c05de99f8dfed07c9e65ab98
This commit is contained in:
Eike Ziller
2017-01-11 09:29:37 +01:00
39 changed files with 521 additions and 154 deletions

View File

@@ -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();
}
}

View File

@@ -78,6 +78,7 @@ public:
unsigned bytesOffset, unsigned utf16charsOffset);
Control *control() const;
Control *swapControl(Control *newControl);
TranslationUnit *translationUnit() const;
bool skipFunctionBody() const;

View File

@@ -688,6 +688,31 @@ public:
bool _block;
};
class ExpressionDocumentHelper
{
public:
// Set up an expression document with an external Control
ExpressionDocumentHelper(const QByteArray &utf8code, Control *control)
: document(Document::create(QLatin1String("<completion>")))
{
Control *oldControl = document->swapControl(control);
delete oldControl->diagnosticClient();
delete oldControl;
document->setUtf8Source(utf8code);
document->parse(Document::ParseExpression);
document->check();
}
// Ensure that the external Control is not deleted
~ExpressionDocumentHelper()
{
document->swapControl(nullptr);
}
public:
Document::Ptr document;
};
} // namespace anonymous
bool ResolveExpression::visit(SimpleNameAST *ast)
@@ -730,9 +755,9 @@ bool ResolveExpression::visit(SimpleNameAST *ast)
exprTyper.init(doc, _context.snapshot(), _context.bindings(),
QSet<const Declaration* >(_autoDeclarationsBeingResolved) << decl);
Document::Ptr exprDoc =
documentForExpression(exprTyper.preprocessedExpression(initializer));
exprDoc->check();
const ExpressionDocumentHelper exprHelper(exprTyper.preprocessedExpression(initializer),
_context.bindings()->control().data());
const Document::Ptr exprDoc = exprHelper.document;
DeduceAutoCheck deduceAuto(ast->name->identifier(), exprDoc->translationUnit());
if (deduceAuto._block)