From e33767205bd2663b90d1fedbba43bef6fbcf9835 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Wed, 8 Sep 2010 10:11:44 +0200
Subject: [PATCH] Introduced SemanticInfo::isValid().

---
 src/plugins/qmljseditor/qmljscodecompletion.cpp |  5 ++---
 src/plugins/qmljseditor/qmljseditor.cpp         | 16 ++++++++++++++++
 src/plugins/qmljseditor/qmljseditor.h           |  1 +
 src/plugins/qmljseditor/qmljshoverhandler.cpp   |  2 +-
 src/plugins/qmljseditor/qmljsmodelmanager.cpp   |  7 ++++++-
 src/plugins/qmljseditor/qmljsmodelmanager.h     |  1 +
 src/plugins/qmljseditor/qmljsquickfix.cpp       |  2 +-
 src/plugins/qmljseditor/qmloutlinemodel.cpp     |  2 ++
 8 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp
index 2454502c2e9..f27ca6bfb02 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp
@@ -678,12 +678,11 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
     m_completions.clear();
 
     const SemanticInfo semanticInfo = edit->semanticInfo();
-    const QmlJS::Snapshot snapshot = semanticInfo.snapshot;
-    const Document::Ptr document = semanticInfo.document;
 
-    if (!document)
+    if (! semanticInfo.isValid())
         return -1;
 
+    const Document::Ptr document = semanticInfo.document;
     const QFileInfo currentFileInfo(fileName);
 
     bool isQmlFile = false;
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index d1f9832e926..333a0f1fcdd 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -556,6 +556,11 @@ QList<AST::Node *> SemanticInfo::astPath(int cursorPosition) const
 
 LookupContext::Ptr SemanticInfo::lookupContext(const QList<QmlJS::AST::Node *> &path) const
 {
+    Q_ASSERT(! m_context.isNull());
+
+    if (m_context.isNull())
+        return LookupContext::create(document, snapshot, path);
+
     return LookupContext::create(document, snapshot, *m_context, path);
 }
 
@@ -610,6 +615,14 @@ AST::Node *SemanticInfo::nodeUnderCursor(int pos) const
     return 0;
 }
 
+bool SemanticInfo::isValid() const
+{
+    if (document && m_context)
+        return true;
+
+    return false;
+}
+
 int SemanticInfo::revision() const
 {
     if (document)
@@ -1360,6 +1373,9 @@ void QmlJSTextEditor::createToolBar(QmlJSEditorEditable *editable)
 TextEditor::BaseTextEditor::Link QmlJSTextEditor::findLinkAt(const QTextCursor &cursor, bool /*resolveTarget*/)
 {
     const SemanticInfo semanticInfo = m_semanticInfo;
+    if (! semanticInfo.isValid())
+        return Link();
+
     const unsigned cursorPosition = cursor.position();
 
     AST::Node *node = semanticInfo.nodeUnderCursor(cursorPosition);
diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h
index 7e83fd8c7c4..b95cd0d7efd 100644
--- a/src/plugins/qmljseditor/qmljseditor.h
+++ b/src/plugins/qmljseditor/qmljseditor.h
@@ -121,6 +121,7 @@ class SemanticInfo
 public:
     SemanticInfo() {}
 
+    bool isValid() const;
     int revision() const;
 
     // Returns the declaring member
diff --git a/src/plugins/qmljseditor/qmljshoverhandler.cpp b/src/plugins/qmljseditor/qmljshoverhandler.cpp
index 100d8fb34fa..5e7f24ddf0c 100644
--- a/src/plugins/qmljseditor/qmljshoverhandler.cpp
+++ b/src/plugins/qmljseditor/qmljshoverhandler.cpp
@@ -110,7 +110,7 @@ void HoverHandler::identifyMatch(TextEditor::ITextEditor *editor, int pos)
 
     if (!matchDiagnosticMessage(qmlEditor, pos)) {
         const SemanticInfo &semanticInfo = qmlEditor->semanticInfo();
-        if (semanticInfo.revision() != qmlEditor->editorRevision())
+        if (! semanticInfo.isValid() || semanticInfo.revision() != qmlEditor->editorRevision())
             return;
 
         QList<AST::Node *> astPath = semanticInfo.astPath(pos);
diff --git a/src/plugins/qmljseditor/qmljsmodelmanager.cpp b/src/plugins/qmljseditor/qmljsmodelmanager.cpp
index 6bbe8a0b7f2..b6b3ffeb9d9 100644
--- a/src/plugins/qmljseditor/qmljsmodelmanager.cpp
+++ b/src/plugins/qmljseditor/qmljsmodelmanager.cpp
@@ -80,7 +80,12 @@ ModelManager::ModelManager(QObject *parent):
 
 void ModelManager::loadQmlTypeDescriptions()
 {
-    const QString resourcePath = Core::ICore::instance()->resourcePath();
+    loadQmlTypeDescriptions(Core::ICore::instance()->resourcePath());
+    loadQmlTypeDescriptions(Core::ICore::instance()->userResourcePath());
+}
+
+void ModelManager::loadQmlTypeDescriptions(const QString &resourcePath)
+{
     const QDir typeFileDir(resourcePath + QLatin1String("/qml-type-descriptions"));
     const QStringList xmlExtensions = QStringList() << QLatin1String("*.xml");
     const QFileInfoList xmlFiles = typeFileDir.entryInfoList(xmlExtensions,
diff --git a/src/plugins/qmljseditor/qmljsmodelmanager.h b/src/plugins/qmljseditor/qmljsmodelmanager.h
index 7b5ca21242a..b6350f7604e 100644
--- a/src/plugins/qmljseditor/qmljsmodelmanager.h
+++ b/src/plugins/qmljseditor/qmljsmodelmanager.h
@@ -101,6 +101,7 @@ protected:
                       bool emitDocChangedOnDisk);
 
     void loadQmlTypeDescriptions();
+    void loadQmlTypeDescriptions(const QString &path);
 
     void updateImportPaths();
 
diff --git a/src/plugins/qmljseditor/qmljsquickfix.cpp b/src/plugins/qmljseditor/qmljsquickfix.cpp
index 476bf4f488a..3b5ce360f98 100644
--- a/src/plugins/qmljseditor/qmljsquickfix.cpp
+++ b/src/plugins/qmljseditor/qmljsquickfix.cpp
@@ -136,7 +136,7 @@ TextEditor::QuickFixState *QmlJSQuickFixCollector::initializeCompletion(TextEdit
     if (QmlJSTextEditor *qmljsEditor = qobject_cast<QmlJSTextEditor *>(editor)) {
         const SemanticInfo info = qmljsEditor->semanticInfo();
 
-        if (qmljsEditor->isOutdated()) {
+        if (! info.isValid() || qmljsEditor->isOutdated()) {
             // outdated
             qWarning() << "TODO: outdated semantic info, force a reparse.";
             return 0;
diff --git a/src/plugins/qmljseditor/qmloutlinemodel.cpp b/src/plugins/qmljseditor/qmloutlinemodel.cpp
index f6662b9f750..a04fe75e201 100644
--- a/src/plugins/qmljseditor/qmloutlinemodel.cpp
+++ b/src/plugins/qmljseditor/qmloutlinemodel.cpp
@@ -330,6 +330,8 @@ Document::Ptr QmlOutlineModel::document() const
 void QmlOutlineModel::update(const SemanticInfo &semanticInfo)
 {
     m_semanticInfo = semanticInfo;
+    if (! m_semanticInfo.isValid())
+        return;
 
     m_treePos.clear();
     m_treePos.append(0);
-- 
GitLab