From 285e2ffbb2efa2c8091ddd968f104ece6f535fd5 Mon Sep 17 00:00:00 2001 From: Christian Kamm <christian.d.kamm@nokia.com> Date: Mon, 29 Mar 2010 11:32:11 +0200 Subject: [PATCH] QmlJS: Only collect linker errors for the current file being checked. Avoids bug where import errors would show up in all files. Reviewed-by: Roberto Raggi --- src/libs/qmljs/qmljscheck.cpp | 2 +- src/libs/qmljs/qmljsinterpreter.cpp | 2 +- src/libs/qmljs/qmljslink.cpp | 33 +++++++++++++++-------------- src/libs/qmljs/qmljslink.h | 6 +++++- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 996d8de4ab5..f6eb31a3239 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -174,7 +174,7 @@ Check::Check(Document::Ptr doc, const Snapshot &snapshot, const QStringList &imp : _doc(doc) , _snapshot(snapshot) , _context(&_engine) - , _link(&_context, snapshot, importPaths) + , _link(&_context, doc, snapshot, importPaths) , _scopeBuilder(doc, &_context) { } diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 356ebbabcfa..47c69c3a922 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -1305,7 +1305,7 @@ Context::~Context() void Context::build(const QList<Node *> &astPath, QmlJS::Document::Ptr doc, const QmlJS::Snapshot &snapshot, const QStringList &importPaths) { - Link link(this, snapshot, importPaths); + Link link(this, doc, snapshot, importPaths); link.scopeChainAt(doc, astPath); } diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index 5b597f2b622..072710bac82 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -14,9 +14,10 @@ using namespace QmlJS; using namespace QmlJS::Interpreter; using namespace QmlJS::AST; -Link::Link(Context *context, const Snapshot &snapshot, +Link::Link(Context *context, const Document::Ptr &doc, const Snapshot &snapshot, const QStringList &importPaths) - : _snapshot(snapshot) + : _doc(doc) + , _snapshot(snapshot) , _context(context) , _importPaths(importPaths) { @@ -240,9 +241,8 @@ void Link::importFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc, importNamespace->setProperty(targetName, importedDoc->bind()->rootObjectValue()); } else { - _diagnosticMessages.append(DiagnosticMessage( - DiagnosticMessage::Error, import->fileNameToken, - QCoreApplication::translate("QmlJS::Link", "could not find file or directory"))); + error(doc, import->fileNameToken, + QCoreApplication::translate("QmlJS::Link", "could not find file or directory")); } } @@ -283,19 +283,16 @@ void Link::importNonFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc, A const QString versionString = doc->source().mid(import->versionToken.offset, import->versionToken.length); const int dotIdx = versionString.indexOf(QLatin1Char('.')); if (dotIdx == -1) { - _diagnosticMessages.append(DiagnosticMessage( - DiagnosticMessage::Error, import->versionToken, - QCoreApplication::translate("QmlJS::Link", "expected two numbers separated by a dot"))); + error(doc, import->versionToken, + QCoreApplication::translate("QmlJS::Link", "expected two numbers separated by a dot")); return; } else { majorVersion = versionString.left(dotIdx).toInt(); minorVersion = versionString.mid(dotIdx + 1).toInt(); } } else { - _diagnosticMessages.append(DiagnosticMessage( - DiagnosticMessage::Error, - locationFromRange(import->firstSourceLocation(), import->lastSourceLocation()), - QCoreApplication::translate("QmlJS::Link", "package import requires a version number"))); + error(doc, locationFromRange(import->firstSourceLocation(), import->lastSourceLocation()), + QCoreApplication::translate("QmlJS::Link", "package import requires a version number")); return; } @@ -339,10 +336,8 @@ void Link::importNonFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc, A } } - _diagnosticMessages.append(DiagnosticMessage( - DiagnosticMessage::Error, - locationFromRange(import->firstSourceLocation(), import->lastSourceLocation()), - QCoreApplication::translate("QmlJS::Link", "package not found"))); + error(doc, locationFromRange(import->firstSourceLocation(), import->lastSourceLocation()), + QCoreApplication::translate("QmlJS::Link", "package not found")); } UiQualifiedId *Link::qualifiedTypeNameId(Node *node) @@ -354,3 +349,9 @@ UiQualifiedId *Link::qualifiedTypeNameId(Node *node) else return 0; } + +void Link::error(const Document::Ptr &doc, const AST::SourceLocation &loc, const QString &message) +{ + if (doc->fileName() == _doc->fileName()) + _diagnosticMessages.append(DiagnosticMessage(DiagnosticMessage::Error, loc, message)); +} diff --git a/src/libs/qmljs/qmljslink.h b/src/libs/qmljs/qmljslink.h index 87ca0ad2d68..6852e57caf5 100644 --- a/src/libs/qmljs/qmljslink.h +++ b/src/libs/qmljs/qmljslink.h @@ -20,7 +20,8 @@ class Link { public: // Link all documents in snapshot - Link(Interpreter::Context *context, const Snapshot &snapshot, const QStringList &importPaths); + Link(Interpreter::Context *context, const Document::Ptr &doc, const Snapshot &snapshot, + const QStringList &importPaths); ~Link(); // Get the scope chain for the currentObject inside doc. @@ -49,7 +50,10 @@ private: AST::UiImport *import); void importObject(Bind *bind, const QString &name, Interpreter::ObjectValue *object, NameId *targetNamespace); + void error(const Document::Ptr &doc, const AST::SourceLocation &loc, const QString &message); + private: + Document::Ptr _doc; Snapshot _snapshot; Interpreter::Context *_context; QMultiHash<QString, Document::Ptr> _documentByPath; -- GitLab