From 4ee8a199aff666c057de8e93be95523dad8015c0 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Mon, 29 Mar 2010 12:56:25 +0200 Subject: [PATCH] Introduced Document::isQmlDocument() and Document::isJSDocument(). --- src/libs/qmljs/qmljsdocument.cpp | 22 ++++++++++++++++++- src/libs/qmljs/qmljsdocument.h | 5 +++++ .../qmljseditor/qmljscodecompletion.cpp | 12 +++++++--- src/plugins/qmljseditor/qmljseditor.cpp | 7 +----- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/libs/qmljs/qmljsdocument.cpp b/src/libs/qmljs/qmljsdocument.cpp index 6b4f3ed96ba..650643d19a2 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 fd3742e8b86..e3cfa420d84 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 57854d514a7..05b9c38c510 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 6a9512a0b5c..6a2166d29b7 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; -- GitLab