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