diff --git a/src/libs/qmljs/qmljsdocument.cpp b/src/libs/qmljs/qmljsdocument.cpp index a8698aaf1f8dca59a8f624ad1106209386186a94..26e651e0645f52009afe7810808b8ea20d854648 100644 --- a/src/libs/qmljs/qmljsdocument.cpp +++ b/src/libs/qmljs/qmljsdocument.cpp @@ -83,6 +83,21 @@ using namespace QmlJS::AST; */ +bool Document::isQmlLikeLanguage(Document::Language language) +{ + switch (language) { + case QmlLanguage: + case QmlQtQuick1Language: + case QmlQtQuick2Language: + case QmlQbsLanguage: + case QmlProjectLanguage: + case QmlTypeInfoLanguage: + return true; + default: + return false; + } +} + Document::Document(const QString &fileName, Language language) : _engine(0) , _ast(0) @@ -95,7 +110,7 @@ Document::Document(const QString &fileName, Language language) QFileInfo fileInfo(fileName); _path = QDir::cleanPath(fileInfo.absolutePath()); - if (language == QmlLanguage) { + if (isQmlLikeLanguage(language)) { _componentName = fileInfo.baseName(); if (! _componentName.isEmpty()) { @@ -127,6 +142,8 @@ Document::Language Document::guessLanguageFromSuffix(const QString &fileName) { if (fileName.endsWith(QLatin1String(".qml"), Qt::CaseInsensitive)) return QmlLanguage; + if (fileName.endsWith(QLatin1String(".qbs"), Qt::CaseInsensitive)) + return QmlQbsLanguage; if (fileName.endsWith(QLatin1String(".js"), Qt::CaseInsensitive)) return JavaScriptLanguage; if (fileName.endsWith(QLatin1String(".json"), Qt::CaseInsensitive)) @@ -141,7 +158,7 @@ Document::Ptr Document::ptr() const bool Document::isQmlDocument() const { - return _language == QmlLanguage; + return isQmlLikeLanguage(_language); } Document::Language Document::language() const @@ -259,7 +276,7 @@ bool Document::parse_helper(int startToken) Parser parser(_engine); QString source = _source; - lexer.setCode(source, /*line = */ 1, /*qmlMode = */_language == QmlLanguage); + lexer.setCode(source, /*line = */ 1, /*qmlMode = */isQmlLikeLanguage(_language)); CollectDirectives collectDirectives(path()); _engine->setDirectives(&collectDirectives); diff --git a/src/libs/qmljs/qmljsdocument.h b/src/libs/qmljs/qmljsdocument.h index c852a4ad11e6dab3e12e1e9eb3895c1facbb6118..d8798aee4dfe4205e406a7bee38be3bc98821fba 100644 --- a/src/libs/qmljs/qmljsdocument.h +++ b/src/libs/qmljs/qmljsdocument.h @@ -51,15 +51,20 @@ public: typedef QSharedPointer<const Document> Ptr; typedef QSharedPointer<Document> MutablePtr; - // used in a 3-bit bitfield enum Language { - QmlLanguage = 0, + UnknownLanguage = 0, JavaScriptLanguage = 1, JsonLanguage = 2, - UnknownLanguage = 3 + QmlLanguage = 3, + QmlQtQuick1Language = 4, + QmlQtQuick2Language = 5, + QmlQbsLanguage = 6, + QmlProjectLanguage = 7, + QmlTypeInfoLanguage = 8 }; + static bool isQmlLikeLanguage(Language languge); protected: Document(const QString &fileName, Language language); @@ -117,8 +122,8 @@ private: QString _source; QWeakPointer<Document> _ptr; int _editorRevision; - Language _language : 3; - bool _parsedCorrectly : 1; + Language _language; + bool _parsedCorrectly; // for documentFromSource friend class Snapshot; diff --git a/src/plugins/cpaster/protocol.cpp b/src/plugins/cpaster/protocol.cpp index f092ef09d1afa4c776e6c82b3363667585f9895c..7a8bcdc2b32071f83a6bc43eedfb0bcb909f58c8 100644 --- a/src/plugins/cpaster/protocol.cpp +++ b/src/plugins/cpaster/protocol.cpp @@ -96,6 +96,8 @@ Protocol::ContentType Protocol::contentType(const QString &mt) || mt == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)) return Cpp; if (mt == QLatin1String(QmlJSTools::Constants::QML_MIMETYPE) + || mt == QLatin1String(QmlJSTools::Constants::QMLPROJECT_MIMETYPE) + || mt == QLatin1String(QmlJSTools::Constants::QBS_MIMETYPE) || mt == QLatin1String(QmlJSTools::Constants::JS_MIMETYPE) || mt == QLatin1String(QmlJSTools::Constants::JSON_MIMETYPE)) return JavaScript; diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 74c33d738e5234c139ebc3dc1bd0fd80365e0fe7..2964c6b137205b0173576bddcc0e9b2970fbf414 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -170,7 +170,7 @@ const char C_HEADER_MIMETYPE[] = "text/x-chdr"; const char CPP_SOURCE_MIMETYPE[] = "text/x-c++src"; const char CPP_HEADER_MIMETYPE[] = "text/x-c++hdr"; const char FORM_MIMETYPE[] = "application/x-designer"; -const char QML_MIMETYPE[] = "application/x-qml"; +const char QML_MIMETYPE[] = "application/x-qml"; // separate def also in qmljstoolsconstants.h const char RESOURCE_MIMETYPE[] = "application/vnd.nokia.xml.qt.resource"; // Settings page diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 696ca553e8a51060e1042ac56c1457b3689a5f6c..73f1f4fce84be9072500063c04006a29aca41e31 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -796,7 +796,8 @@ FileType typeForFileName(const Core::MimeDatabase *db, const QFileInfo &file) return ResourceType; if (typeName == QLatin1String(Constants::FORM_MIMETYPE)) return FormType; - if (typeName == QLatin1String(Constants::QML_MIMETYPE)) + if (mt.subClassesOf().contains(QLatin1String(Constants::QML_MIMETYPE)) + || typeName == QLatin1String(Constants::QML_MIMETYPE)) return QMLType; return UnknownFileType; } diff --git a/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml b/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml index 6c17c14689096fc5878077d1a1481f9bc507ac80..a1bdef531efaff6cf227c50e7109ecdef7a15a02 100644 --- a/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml +++ b/src/plugins/qmljseditor/QmlJSEditor.mimetypes.xml @@ -5,10 +5,24 @@ <sub-class-of type="text/plain"/> <comment>QML file</comment> <glob pattern="*.qml"/> + </mime-type> + <mime-type type="application/x-qt.qbs+qml"> + <alias type="text/x-qt.qbs+qml"/> + <sub-class-of type="application/x-qml"/> + <comment>Qt Build Suite file</comment> + <glob pattern="*.qbs"/> + </mime-type> + <mime-type type="application/x-qmlproject"> + <alias type="text/x-qmlproject"/> + <sub-class-of type="application/x-qml"/> + <comment>Qt Creator Qt UI project file</comment> <glob pattern="*.qmlproject"/> + </mime-type> + <mime-type type="application/x-qt.meta-info+qml"> + <alias type="text/x-qt.meta-info+qml"/> + <sub-class-of type="application/x-qml"/> + <comment>QML file</comment> <glob pattern="*.qmltypes"/> - <glob pattern="*.qbs"/> - <glob pattern="*.qbp"/> </mime-type> <mime-type type="application/javascript"> <alias type="application/x-javascript"/> diff --git a/src/plugins/qmljseditor/qmljseditorfactory.cpp b/src/plugins/qmljseditor/qmljseditorfactory.cpp index 17a9841b5f487cedcd642bdc6191b3d1696efe7b..eecf99cfcd27a65064ac3f87002407e04fe8e583 100644 --- a/src/plugins/qmljseditor/qmljseditorfactory.cpp +++ b/src/plugins/qmljseditor/qmljseditorfactory.cpp @@ -59,6 +59,9 @@ QmlJSEditorFactory::QmlJSEditorFactory(QObject *parent) { m_mimeTypes << QLatin1String(QmlJSTools::Constants::QML_MIMETYPE) + << QLatin1String(QmlJSTools::Constants::QMLPROJECT_MIMETYPE) + << QLatin1String(QmlJSTools::Constants::QBS_MIMETYPE) + << QLatin1String(QmlJSTools::Constants::QMLTYPES_MIMETYPE) << QLatin1String(QmlJSTools::Constants::JS_MIMETYPE) << QLatin1String(QmlJSTools::Constants::JSON_MIMETYPE) ; diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp index 9cfb1073eae0573794189a8a110618207a256ce7..b6a71e3310cc9feb031a7796df476b8d045bc346 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.cpp +++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp @@ -70,27 +70,41 @@ using namespace QmlJSTools::Internal; static QStringList environmentImportPaths(); +static void mergeSuffixes(QStringList &l1, const QStringList &l2) +{ + if (!l2.isEmpty()) + l1 = l2; +} + QmlJS::Document::Language QmlJSTools::languageOfFile(const QString &fileName) { QStringList jsSuffixes(QLatin1String("js")); QStringList qmlSuffixes(QLatin1String("qml")); + QStringList qmlProjectSuffixes(QLatin1String("qmlproject")); QStringList jsonSuffixes(QLatin1String("json")); + QStringList qbsSuffixes(QLatin1String("qbs")); if (Core::ICore::instance()) { Core::MimeDatabase *db = Core::ICore::mimeDatabase(); Core::MimeType jsSourceTy = db->findByType(QLatin1String(Constants::JS_MIMETYPE)); - jsSuffixes = jsSourceTy.suffixes(); + mergeSuffixes(jsSuffixes, jsSourceTy.suffixes()); Core::MimeType qmlSourceTy = db->findByType(QLatin1String(Constants::QML_MIMETYPE)); - qmlSuffixes = qmlSourceTy.suffixes(); + mergeSuffixes(qmlSuffixes, qmlSourceTy.suffixes()); + Core::MimeType qbsSourceTy = db->findByType(QLatin1String(Constants::QBS_MIMETYPE)); + mergeSuffixes(qbsSuffixes, qbsSourceTy.suffixes()); + Core::MimeType qmlProjectSourceTy = db->findByType(QLatin1String(Constants::QMLPROJECT_MIMETYPE)); + mergeSuffixes(qbsSuffixes, qmlProjectSourceTy.suffixes()); Core::MimeType jsonSourceTy = db->findByType(QLatin1String(Constants::JSON_MIMETYPE)); - jsonSuffixes = jsonSourceTy.suffixes(); + mergeSuffixes(jsonSuffixes, jsonSourceTy.suffixes()); } const QFileInfo info(fileName); const QString fileSuffix = info.suffix(); if (jsSuffixes.contains(fileSuffix)) return QmlJS::Document::JavaScriptLanguage; - if (qmlSuffixes.contains(fileSuffix)) + if (qbsSuffixes.contains(fileSuffix)) + return QmlJS::Document::QmlQbsLanguage; + if (qmlSuffixes.contains(fileSuffix) || qmlProjectSuffixes.contains(fileSuffix)) return QmlJS::Document::QmlLanguage; if (jsonSuffixes.contains(fileSuffix)) return QmlJS::Document::JsonLanguage; diff --git a/src/plugins/qmljstools/qmljstoolsconstants.h b/src/plugins/qmljstools/qmljstoolsconstants.h index 4fb73ae2f798b952595a6adeb7365729d61bb253..dc7c7302426c99b0f97b117a2a95fc6424dfe4ad 100644 --- a/src/plugins/qmljstools/qmljstoolsconstants.h +++ b/src/plugins/qmljstools/qmljstoolsconstants.h @@ -35,7 +35,10 @@ namespace QmlJSTools { namespace Constants { -const char QML_MIMETYPE[] = "application/x-qml"; +const char QML_MIMETYPE[] = "application/x-qml"; // separate def also in projectexplorerconstants.h +const char QBS_MIMETYPE[] = "application/x-qt.qbs+qml"; +const char QMLPROJECT_MIMETYPE[] = "application/x-qmlproject"; +const char QMLTYPES_MIMETYPE[] = "application/x-qt.meta-info+qml"; const char JS_MIMETYPE[] = "application/javascript"; const char JSON_MIMETYPE[] = "application/json"; diff --git a/src/plugins/qmljstools/qmljstoolssettings.cpp b/src/plugins/qmljstools/qmljstoolssettings.cpp index be35adb0712f6159382030a74a2005fddd83883a..5291384194ebcd9173c4bdad3b11f3ebf6cd061d 100644 --- a/src/plugins/qmljstools/qmljstoolssettings.cpp +++ b/src/plugins/qmljstools/qmljstoolssettings.cpp @@ -140,6 +140,15 @@ QmlJSToolsSettings::QmlJSToolsSettings(QObject *parent) textEditorSettings->registerMimeTypeForLanguageId( QLatin1String(Constants::QML_MIMETYPE), Constants::QML_JS_SETTINGS_ID); + textEditorSettings->registerMimeTypeForLanguageId( + QLatin1String(Constants::QBS_MIMETYPE), + Constants::QML_JS_SETTINGS_ID); + textEditorSettings->registerMimeTypeForLanguageId( + QLatin1String(Constants::QMLPROJECT_MIMETYPE), + Constants::QML_JS_SETTINGS_ID); + textEditorSettings->registerMimeTypeForLanguageId( + QLatin1String(Constants::QMLTYPES_MIMETYPE), + Constants::QML_JS_SETTINGS_ID); textEditorSettings->registerMimeTypeForLanguageId( QLatin1String(Constants::JS_MIMETYPE), Constants::QML_JS_SETTINGS_ID); diff --git a/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp b/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp index 22c6eb72c1b2db73fddd7b231ce80b8c47aca621..9d142d0fe59668c6813fe68875421526641afd8d 100644 --- a/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerdetailsrewriter.cpp @@ -129,7 +129,7 @@ void QmlProfilerDetailsRewriter::requestDetailsForLocation(int type, QFileInfo fileInfo(localFile); if (!fileInfo.exists() || !fileInfo.isReadable()) return; - if (QmlJSTools::languageOfFile(localFile) != QmlJS::Document::QmlLanguage) + if (!QmlJS::Document::isQmlLikeLanguage(QmlJSTools::languageOfFile(localFile))) return; PendingEvent ev = {location, localFile, type}; diff --git a/src/plugins/qmlprojectmanager/qmlprojectconstants.h b/src/plugins/qmlprojectmanager/qmlprojectconstants.h index c0803d5d53c152be8c64c8bcfdb6e59bf062d253..db9e9bc76da7fa4ac31079e8a2c10063687652ff 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectconstants.h +++ b/src/plugins/qmlprojectmanager/qmlprojectconstants.h @@ -30,12 +30,14 @@ #ifndef QMLPROJECTCONSTANTS_H #define QMLPROJECTCONSTANTS_H +#include <qmljstools/qmljstoolsconstants.h> + namespace QmlProjectManager { namespace Constants { const char *const PROJECTCONTEXT = "QmlProject.ProjectContext"; const char *const LANG_QML = "QML"; -const char *const QMLMIMETYPE = "application/x-qmlproject"; +const char *const QMLPROJECT_MIMETYPE = QmlJSTools::Constants::QMLPROJECT_MIMETYPE; } // namespace Constants } // namespace QmlProjectManager diff --git a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp index ff09f1fba4fa47c6d3c4a6f571ba6fe7bce60785..0640b2fa50ca1c3ff567bec8f35799756ffffe11 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectfile.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectfile.cpp @@ -77,7 +77,7 @@ QString QmlProjectFile::suggestedFileName() const QString QmlProjectFile::mimeType() const { - return QLatin1String(Constants::QMLMIMETYPE); + return QLatin1String(Constants::QMLPROJECT_MIMETYPE); } bool QmlProjectFile::isModified() const diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp b/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp index e73fbb0a75e30879201ed6e79d531a288bbb061e..fe83c3079d21cf981e6fac45d09aa15519caf945 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp @@ -47,7 +47,7 @@ Manager::Manager() } QString Manager::mimeType() const -{ return QLatin1String(Constants::QMLMIMETYPE); } +{ return QLatin1String(Constants::QMLPROJECT_MIMETYPE); } ProjectExplorer::Project *Manager::openProject(const QString &fileName, QString *errorString) {