diff --git a/src/libs/qmljs/qmljs.pri b/src/libs/qmljs/qmljs.pri index 4d2285d2d0ac71687acfcd7b9aa57dc9134910f9..5756428677b974b9ceadaea5e46e29e8342b7b6a 100644 --- a/src/libs/qmljs/qmljs.pri +++ b/src/libs/qmljs/qmljs.pri @@ -1,5 +1,5 @@ INCLUDEPATH += $$PWD/../../shared INCLUDEPATH += $$PWD/../../shared/qmljs $$PWD/../../shared/qmljs/parser -DEPENDPATH += $$PWD/../../shared/qmljs +DEPENDPATH += $$PWD/../../shared/qmljs $$PWD/../../shared/qmljs/parser LIBS *= -l$$qtLibraryTarget(QmlJS) diff --git a/src/plugins/qmljseditor/qmlcodecompletion.cpp b/src/plugins/qmljseditor/qmlcodecompletion.cpp index bc4888e4b1923d5760ace0d7f3e3fcf4c8b6822c..4eb0b987f72e1cbec81a98d1f846220781c89478 100644 --- a/src/plugins/qmljseditor/qmlcodecompletion.cpp +++ b/src/plugins/qmljseditor/qmlcodecompletion.cpp @@ -95,12 +95,12 @@ int QmlCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) if (qmlDocument.isNull()) return pos; - if (!qmlDocument->program()) + if (!qmlDocument->qmlProgram()) qmlDocument = m_modelManager->snapshot().value(qmlDocument->fileName()); // FIXME: this completion strategy is not going to work when the document was never parsed correctly. - if (qmlDocument && qmlDocument->program()) { - QmlJS::AST::UiProgram *program = qmlDocument->program(); + if (qmlDocument && qmlDocument->qmlProgram()) { + QmlJS::AST::UiProgram *program = qmlDocument->qmlProgram(); // qDebug() << "*** program:" << program; if (program) { diff --git a/src/plugins/qmljseditor/qmlexpressionundercursor.cpp b/src/plugins/qmljseditor/qmlexpressionundercursor.cpp index 70c019795ddb26e9c516a37644414d9afb402cf6..f95db88828b3ce5958838149ec23711fd6a4373f 100644 --- a/src/plugins/qmljseditor/qmlexpressionundercursor.cpp +++ b/src/plugins/qmljseditor/qmlexpressionundercursor.cpp @@ -130,7 +130,7 @@ namespace QmlJSEditor { _pos = pos; _scopes.clear(); _currentSymbol = 0; - Node::accept(doc->program(), this); + Node::accept(doc->qmlProgram(), this); return _scopes; } diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index c627d342083f413ba90a0c4a89e34ca50a60b1c1..ee738429f5a17155c7c96f6a4754842d8b6f9be6 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -425,11 +425,11 @@ void QmlJSTextEditor::onDocumentUpdated(Qml::QmlDocument::Ptr doc) FindIdDeclarations updateIds; m_idsRevision = document()->revision(); - m_ids = updateIds(doc->program()); + m_ids = updateIds(doc->qmlProgram()); if (doc->isParsedCorrectly()) { FindDeclarations findDeclarations; - m_declarations = findDeclarations(doc->program()); + m_declarations = findDeclarations(doc->qmlProgram()); QStringList items; items.append(tr("<Select Symbol>")); diff --git a/src/plugins/qmljseditor/qmllookupcontext.cpp b/src/plugins/qmljseditor/qmllookupcontext.cpp index d22133fc127ce404689c405bb211a93e7ba2ba7a..7c4061b02bc1ba2b8b876652dd1de8ddad6aad6e 100644 --- a/src/plugins/qmljseditor/qmllookupcontext.cpp +++ b/src/plugins/qmljseditor/qmllookupcontext.cpp @@ -137,7 +137,7 @@ QmlSymbol *QmlLookupContext::resolveType(const QString &name, const QString &fil if (document.isNull()) return 0; - UiProgram *prog = document->program(); + UiProgram *prog = document->qmlProgram(); if (!prog) return 0; @@ -252,7 +252,7 @@ QList<QmlSymbol*> QmlLookupContext::visibleTypes() { QList<QmlSymbol*> result; - UiProgram *program = _doc->program(); + UiProgram *program = _doc->qmlProgram(); if (!program) return result; diff --git a/src/plugins/qmljseditor/qmlmodelmanager.cpp b/src/plugins/qmljseditor/qmlmodelmanager.cpp index 495dcd0114aa4be0b06c82047fbdda8b849d2146..fc55e6095b25e573a7ab55de0e6cf9b130c8cb1e 100644 --- a/src/plugins/qmljseditor/qmlmodelmanager.cpp +++ b/src/plugins/qmljseditor/qmlmodelmanager.cpp @@ -27,21 +27,20 @@ ** **************************************************************************/ -#include <QFile> -#include <QtConcurrentRun> -#include <qtconcurrent/runextensions.h> -#include <QTextStream> +#include "qmljseditorconstants.h" +#include "qmlmodelmanager.h" #include <coreplugin/icore.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/progressmanager/progressmanager.h> - +#include <coreplugin/mimedatabase.h> #include <texteditor/itexteditor.h> -#include "qmljseditorconstants.h" -#include "qmlmodelmanager.h" - -#include <QtCore/QMetaType> +#include <QFile> +#include <QFileInfo> +#include <QtConcurrentRun> +#include <qtconcurrent/runextensions.h> +#include <QTextStream> using namespace QmlJSEditor; using namespace QmlJSEditor::Internal; @@ -156,7 +155,21 @@ void QmlModelManager::parse(QFutureInterface<void> &future, Qml::QmlDocument::Ptr doc = Qml::QmlDocument::create(fileName); doc->setSource(contents); - doc->parse(); + + { + Core::MimeDatabase *db = Core::ICore::instance()->mimeDatabase(); + Core::MimeType jsSourceTy = db->findByType(QLatin1String("application/javascript")); + Core::MimeType qmlSourceTy = db->findByType(QLatin1String("application/x-qml")); + + const QFileInfo fileInfo(fileName); + + if (jsSourceTy.matchesFile(fileInfo)) + doc->parseJavaScript(); + else if (qmlSourceTy.matchesFile(fileInfo)) + doc->parseQml(); + else + qWarning() << "Don't know how to treat" << fileName; + } modelManager->emitDocumentUpdated(doc); } diff --git a/src/shared/qmljs/qmldocument.cpp b/src/shared/qmljs/qmldocument.cpp index 2cd13a58d5ae1686162ae796b4e9be6ca4abb0dd..7d1880dd70f25418ae733d10413d946d7501f47e 100644 --- a/src/shared/qmljs/qmldocument.cpp +++ b/src/shared/qmljs/qmldocument.cpp @@ -35,13 +35,17 @@ #include <qmljs/parser/qmljsnodepool_p.h> #include <qmljs/parser/qmljsastfwd_p.h> +#include <QDebug> + using namespace Qml; using namespace QmlJS; +using namespace QmlJS::AST; QmlDocument::QmlDocument(const QString &fileName) : _engine(0) , _pool(0) - , _program(0) + , _uiProgram(0) + , _jsProgram(0) , _fileName(fileName) , _parsedCorrectly(false) { @@ -70,9 +74,14 @@ QmlDocument::Ptr QmlDocument::create(const QString &fileName) return doc; } -AST::UiProgram *QmlDocument::program() const +AST::UiProgram *QmlDocument::qmlProgram() const +{ + return _uiProgram; +} + +AST::Program *QmlDocument::jsProgram() const { - return _program; + return _jsProgram; } QList<DiagnosticMessage> QmlDocument::diagnosticMessages() const @@ -90,11 +99,14 @@ void QmlDocument::setSource(const QString &source) _source = source; } -bool QmlDocument::parse() +bool QmlDocument::parseQml() { Q_ASSERT(! _engine); Q_ASSERT(! _pool); - Q_ASSERT(! _program); + Q_ASSERT(! _uiProgram); + Q_ASSERT(! _jsProgram); + + qDebug() << "QmlDocument::parseQml() for file" << _fileName; _engine = new Engine(); _pool = new NodePool(_fileName, _engine); @@ -106,11 +118,11 @@ bool QmlDocument::parse() lexer.setCode(_source, /*line = */ 1); _parsedCorrectly = parser.parse(); - _program = parser.ast(); + _uiProgram = parser.ast(); _diagnosticMessages = parser.diagnosticMessages(); - if (_program) { - for (QmlJS::AST::UiObjectMemberList *iter = _program->members; iter; iter = iter->next) + if (_uiProgram) { + for (QmlJS::AST::UiObjectMemberList *iter = _uiProgram->members; iter; iter = iter->next) if (iter->member) _symbols.append(new QmlSymbolFromFile(_fileName, iter->member)); @@ -123,6 +135,29 @@ bool QmlDocument::parse() return _parsedCorrectly; } +bool QmlDocument::parseJavaScript() +{ + Q_ASSERT(! _engine); + Q_ASSERT(! _pool); + Q_ASSERT(! _uiProgram); + Q_ASSERT(! _jsProgram); + + _engine = new Engine(); + _pool = new NodePool(_fileName, _engine); + _ids.clear(); + + Lexer lexer(_engine); + Parser parser(_engine); + + lexer.setCode(_source, /*line = */ 1); + + _parsedCorrectly = parser.parseProgram(); + _jsProgram = cast<Program*>(parser.rootNode()); + _diagnosticMessages = parser.diagnosticMessages(); + + return _parsedCorrectly; +} + QmlSymbolFromFile *QmlDocument::findSymbol(QmlJS::AST::Node *node) const { foreach (QmlSymbol *symbol, _symbols) @@ -143,10 +178,8 @@ Snapshot::~Snapshot() void Snapshot::insert(const QmlDocument::Ptr &document) { - if (!document || !document->program()) - return; - - QMap<QString, QmlDocument::Ptr>::insert(document->fileName(), document); + if (document && (document->qmlProgram() || document->jsProgram())) + QMap<QString, QmlDocument::Ptr>::insert(document->fileName(), document); } QmlDocument::PtrList Snapshot::importedDocuments(const QmlDocument::Ptr &doc, const QString &importPath) const diff --git a/src/shared/qmljs/qmldocument.h b/src/shared/qmljs/qmldocument.h index 15edb168e7e3f96dfec51195907b23c7f9b42964..626f0f6bb3adb739007b21f72cea0106101cf27c 100644 --- a/src/shared/qmljs/qmldocument.h +++ b/src/shared/qmljs/qmldocument.h @@ -56,13 +56,15 @@ public: static QmlDocument::Ptr create(const QString &fileName); - QmlJS::AST::UiProgram *program() const; + QmlJS::AST::UiProgram *qmlProgram() const; + QmlJS::AST::Program *jsProgram() const; QList<QmlJS::DiagnosticMessage> diagnosticMessages() const; QString source() const; void setSource(const QString &source); - bool parse(); + bool parseQml(); + bool parseJavaScript(); bool isParsedCorrectly() const { return _parsedCorrectly; } @@ -80,7 +82,8 @@ public: private: QmlJS::Engine *_engine; QmlJS::NodePool *_pool; - QmlJS::AST::UiProgram *_program; + QmlJS::AST::UiProgram *_uiProgram; + QmlJS::AST::Program *_jsProgram; QList<QmlJS::DiagnosticMessage> _diagnosticMessages; QString _fileName; QString _path; diff --git a/src/shared/qmljs/qmlidcollector.cpp b/src/shared/qmljs/qmlidcollector.cpp index c45e9089acebcb89c154f7f31f811d84e9bae789..3ccbf132c6450ce1923c93c9102168ce181e33ba 100644 --- a/src/shared/qmljs/qmlidcollector.cpp +++ b/src/shared/qmljs/qmlidcollector.cpp @@ -44,7 +44,7 @@ QMap<QString, QmlIdSymbol*> QmlIdCollector::operator()(Qml::QmlDocument &doc) _ids.clear(); _currentSymbol = 0; - Node::accept(doc.program(), this); + Node::accept(doc.qmlProgram(), this); return _ids; }