forked from qt-creator/qt-creator
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:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -78,6 +78,7 @@ public:
|
||||
unsigned bytesOffset, unsigned utf16charsOffset);
|
||||
|
||||
Control *control() const;
|
||||
Control *swapControl(Control *newControl);
|
||||
TranslationUnit *translationUnit() const;
|
||||
|
||||
bool skipFunctionBody() const;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user