diff --git a/src/libs/qmljs/qmljsdocument.cpp b/src/libs/qmljs/qmljsdocument.cpp index 6b4f3ed96ba7d7c9b84549da5dc3c4d7d440f67b..650643d19a2772fdd20c83f7935217db70e7c921 100644 --- a/src/libs/qmljs/qmljsdocument.cpp +++ b/src/libs/qmljs/qmljsdocument.cpp @@ -44,6 +44,7 @@ Document::Document(const QString &fileName) , _pool(0) , _ast(0) , _bind(0) + , _isQmlDocument(false) , _documentRevision(0) , _parsedCorrectly(false) , _fileName(fileName) @@ -52,6 +53,7 @@ Document::Document(const QString &fileName) _path = fileInfo.absolutePath(); if (fileInfo.suffix() == QLatin1String("qml")) { + _isQmlDocument = true; _componentName = fileInfo.baseName(); if (! _componentName.isEmpty()) { @@ -81,6 +83,16 @@ Document::Ptr Document::create(const QString &fileName) return doc; } +bool Document::isQmlDocument() const +{ + return _isQmlDocument; +} + +bool Document::isJSDocument() const +{ + return ! _isQmlDocument; +} + AST::UiProgram *Document::qmlProgram() const { return cast<UiProgram *>(_ast); @@ -182,6 +194,14 @@ bool Document::parse_helper(int startToken) return _parsedCorrectly; } +bool Document::parse() +{ + if (isQmlDocument()) + return parseQml(); + + return parseJavaScript(); +} + bool Document::parseQml() { return parse_helper(QmlJSGrammar::T_FEED_UI_PROGRAM); @@ -264,7 +284,7 @@ QList<Document::Ptr> Snapshot::importedDocuments(const Document::Ptr &doc, const foreach (Document::Ptr candidate, _documents) { if (candidate == doc) continue; // ignore this document - else if (! candidate->qmlProgram()) + else if (candidate->isJSDocument()) continue; // skip JS documents if (candidate->path() == doc->path() || candidate->path() == docPath) diff --git a/src/libs/qmljs/qmljsdocument.h b/src/libs/qmljs/qmljsdocument.h index fd3742e8b86db3339b4b531b2a12ebb4c41b8c7d..e3cfa420d840153d87d4dd6f49f54feacb24e16c 100644 --- a/src/libs/qmljs/qmljsdocument.h +++ b/src/libs/qmljs/qmljsdocument.h @@ -57,6 +57,9 @@ public: static Document::Ptr create(const QString &fileName); + bool isQmlDocument() const; + bool isJSDocument() const; + AST::UiProgram *qmlProgram() const; AST::Program *jsProgram() const; AST::ExpressionNode *expression() const; @@ -67,6 +70,7 @@ public: QString source() const; void setSource(const QString &source); + bool parse(); bool parseQml(); bool parseJavaScript(); bool parseExpression(); @@ -91,6 +95,7 @@ private: NodePool *_pool; AST::Node *_ast; Bind *_bind; + bool _isQmlDocument; int _documentRevision; bool _parsedCorrectly; QList<QmlJS::DiagnosticMessage> _diagnosticMessages; diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp index 57854d514a7cc8fd38b89c444c5eb39fb3c20f63..05b9c38c5105d128db2f95489e66764477a5b7b7 100644 --- a/src/plugins/qmljseditor/qmljscodecompletion.cpp +++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp @@ -703,10 +703,16 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor) } // add qml extra words - if (document && document->qmlProgram()) { + if (isQmlFile) { static QStringList qmlWords; - if (qmlWords.isEmpty()) - qmlWords << "property" << "readonly" << "signal"; + + if (qmlWords.isEmpty()) { + qmlWords << QLatin1String("property") + << QLatin1String("readonly") + << QLatin1String("signal") + << QLatin1String("import"); + } + foreach (const QString &word, qmlWords) { TextEditor::CompletionItem item(this); item.text = word; diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 6a9512a0b5c27eb7ed9ece301824fb0d6288ac3e..6a2166d29b7ecc66cec75722e80c072856964926 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -1354,12 +1354,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source) if (! doc) { snapshot = source.snapshot; doc = snapshot.documentFromSource(source.code, source.fileName); - - // ### This doesn't really work: what if snapshot doesn't have the doc? - if (snapshot.document(source.fileName)->qmlProgram()) - doc->parseQml(); - else if (snapshot.document(source.fileName)->jsProgram()) - doc->parseJavaScript(); + doc->parse(); } SemanticInfo semanticInfo;