From db2f91ef8f0febbb6988c648392f98b93158c356 Mon Sep 17 00:00:00 2001 From: Christian Kamm <christian.d.kamm@nokia.com> Date: Wed, 7 Apr 2010 10:43:09 +0200 Subject: [PATCH] QmlJS: Don't produce Qml type errors if plugins are imported. Task-number: QTCREATORBUG-1021 Reviewed-by: Erik Verbruggen --- src/libs/qmljs/qmljscheck.cpp | 4 +++- src/libs/qmljs/qmljscheck.h | 2 ++ src/libs/qmljs/qmljsinterpreter.cpp | 10 ++++++++++ src/libs/qmljs/qmljsinterpreter.h | 4 ++++ src/libs/qmljs/qmljslink.cpp | 3 +++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index 4e0fd13abe8..bf0b6828705 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -176,6 +176,7 @@ Check::Check(Document::Ptr doc, const Snapshot &snapshot, const QStringList &imp , _context(&_engine) , _link(&_context, doc, snapshot, importPaths) , _scopeBuilder(doc, &_context) + , _ignoreTypeErrors(_context.documentImportsPlugins(_doc.data())) { } @@ -227,7 +228,8 @@ void Check::visitQmlObject(Node *ast, UiQualifiedId *typeId, _scopeBuilder.push(ast); if (! _context.lookupType(_doc.data(), typeId)) { - warning(typeId->identifierToken, tr(Messages::unknown_type)); + if (! _ignoreTypeErrors) + error(typeId->identifierToken, tr(Messages::unknown_type)); // suppress subsequent errors about scope object lookup by clearing // the scope object list // ### todo: better way? diff --git a/src/libs/qmljs/qmljscheck.h b/src/libs/qmljs/qmljscheck.h index a27c5cb61c5..8d37b1c7064 100644 --- a/src/libs/qmljs/qmljscheck.h +++ b/src/libs/qmljs/qmljscheck.h @@ -72,6 +72,8 @@ private: ScopeBuilder _scopeBuilder; QList<DiagnosticMessage> _messages; + + bool _ignoreTypeErrors; }; } // namespace QmlJS diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index a7f8d916a1e..120e60978ad 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -1448,6 +1448,16 @@ void Context::setProperty(const ObjectValue *object, const QString &name, const _properties[object].insert(name, value); } +bool Context::documentImportsPlugins(const Document *doc) const +{ + return _documentsImportingPlugins.contains(doc->fileName()); +} + +void Context::setDocumentImportsPlugins(const Document *doc) +{ + _documentsImportingPlugins.insert(doc->fileName()); +} + Reference::Reference(Engine *engine) : _engine(engine) { diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index fc95e3f7deb..a22d78edd72 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -308,6 +308,9 @@ public: const Value *property(const ObjectValue *object, const QString &name) const; void setProperty(const ObjectValue *object, const QString &name, const Value *value); + bool documentImportsPlugins(const Document *doc) const; + void setDocumentImportsPlugins(const Document *doc); + private: typedef QHash<QString, const Value *> Properties; @@ -315,6 +318,7 @@ private: LookupMode _lookupMode; QHash<const ObjectValue *, Properties> _properties; QHash<QString, const ObjectValue *> _typeEnvironments; + QSet<QString> _documentsImportingPlugins; ScopeChain _scopeChain; int _qmlScopeObjectIndex; bool _qmlScopeObjectSet; diff --git a/src/libs/qmljs/qmljslink.cpp b/src/libs/qmljs/qmljslink.cpp index af248d9c4de..817ba530bf6 100644 --- a/src/libs/qmljs/qmljslink.cpp +++ b/src/libs/qmljs/qmljslink.cpp @@ -302,6 +302,9 @@ void Link::importNonFile(Interpreter::ObjectValue *typeEnv, Document::Ptr doc, A if (!libraryInfo.isValid()) continue; + if (!libraryInfo.plugins().isEmpty()) + _context->setDocumentImportsPlugins(doc.data()); + QSet<QString> importedTypes; foreach (const QmlDirParser::Component &component, libraryInfo.components()) { if (importedTypes.contains(component.typeName)) -- GitLab