qmljs: generalize language treatement

* better support qbs and similar non QtQuick qml languages
* begin to clean and migrate things from ModelManager to
  ModelManagerInterface

Change-Id: Ifa39dc1e4c568e9e21307f4913dcb5989e80420f
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@digia.com>
This commit is contained in:
Fawzi Mohamed
2014-01-22 18:38:45 +01:00
parent a8e8c5fe1d
commit a8ea0a0736
12 changed files with 118 additions and 80 deletions

View File

@@ -137,6 +137,34 @@ bool Document::isQmlLikeOrJsLanguage(Language::Enum language)
}
}
QList<Language::Enum> Document::companionLanguages(Language::Enum language)
{
QList<Language::Enum> langs;
langs << language;
switch (language) {
case Language::JavaScript:
case Language::Json:
case Language::QmlProject:
case Language::QmlTypeInfo:
break;
case Language::QmlQbs:
langs << Language::JavaScript;
break;
case Language::Qml:
langs << Language::QmlQtQuick1 << Language::QmlQtQuick2 << Language::JavaScript;
break;
case Language::QmlQtQuick1:
case Language::QmlQtQuick2:
langs << Language::Qml << Language::JavaScript;
break;
case Language::Unknown:
langs << Language::JavaScript << Language::Json << Language::QmlProject << Language:: QmlQbs
<< Language::QmlTypeInfo << Language::QmlQtQuick1 << Language::QmlQtQuick2 ;
break;
}
return langs;
}
Document::Document(const QString &fileName, Language::Enum language)
: _engine(0)
, _ast(0)
@@ -177,19 +205,6 @@ Document::MutablePtr Document::create(const QString &fileName, Language::Enum la
return doc;
}
Language::Enum Document::guessLanguageFromSuffix(const QString &fileName)
{
if (fileName.endsWith(QLatin1String(".qml"), Qt::CaseInsensitive))
return Language::Qml;
if (fileName.endsWith(QLatin1String(".qbs"), Qt::CaseInsensitive))
return Language::QmlQbs;
if (fileName.endsWith(QLatin1String(".js"), Qt::CaseInsensitive))
return Language::JavaScript;
if (fileName.endsWith(QLatin1String(".json"), Qt::CaseInsensitive))
return Language::Json;
return Language::Unknown;
}
Document::Ptr Document::ptr() const
{
return _ptr.toStrongRef();

View File

@@ -56,6 +56,7 @@ public:
static bool isQmlLikeLanguage(Language::Enum languge);
static bool isFullySupportedLanguage(Language::Enum language);
static bool isQmlLikeOrJsLanguage(Language::Enum language);
static QList<Language::Enum> companionLanguages(Language::Enum language);
protected:
Document(const QString &fileName, Language::Enum language);
@@ -63,7 +64,6 @@ public:
~Document();
static MutablePtr create(const QString &fileName, Language::Enum language);
static Language::Enum guessLanguageFromSuffix(const QString &fileName);
Document::Ptr ptr() const;

View File

@@ -330,7 +330,7 @@ Import LinkPrivate::importFileOrDirectory(Document::Ptr doc, const ImportInfo &i
->filesInQrcPath(path));
while (iter.hasNext()) {
iter.next();
if (Document::isQmlLikeLanguage(Document::guessLanguageFromSuffix(iter.key()))) {
if (Document::isQmlLikeLanguage(ModelManagerInterface::guessLanguageOfFile(iter.key()))) {
Document::Ptr importedDoc = snapshot.document(iter.value().at(0));
if (importedDoc && importedDoc->bind()->rootObjectValue()) {
const QString targetName = QFileInfo(iter.key()).baseName();

View File

@@ -29,6 +29,8 @@
#include "qmljsmodelmanagerinterface.h"
#include <QFileInfo>
using namespace QmlJS;
/*!
@@ -65,8 +67,54 @@ ModelManagerInterface::~ModelManagerInterface()
g_instance = 0;
}
static QHash<QString, Language::Enum> defaultLanguageMapping()
{
QHash<QString, Language::Enum> res;
res[QLatin1String("js")] = Language::JavaScript;
res[QLatin1String("qml")] = Language::Qml;
res[QLatin1String("qmltypes")] = Language::QmlTypeInfo;
res[QLatin1String("qmlproject")] = Language::QmlProject;
res[QLatin1String("json")] = Language::Json;
res[QLatin1String("qbs")] = Language::QmlQbs;
return res;
}
Language::Enum ModelManagerInterface::guessLanguageOfFile(const QString &fileName)
{
QHash<QString, Language::Enum> lMapping;
if (instance())
lMapping = instance()->languageForSuffix();
else
lMapping = defaultLanguageMapping();
const QFileInfo info(fileName);
const QString fileSuffix = info.suffix();
return lMapping.value(fileSuffix, Language::Unknown);
}
QStringList ModelManagerInterface::globPatternsForLanguages(const QList<Language::Enum> languages)
{
QHash<QString, Language::Enum> lMapping;
if (instance())
lMapping = instance()->languageForSuffix();
else
lMapping = defaultLanguageMapping();
QStringList patterns;
QHashIterator<QString,Language::Enum> i(lMapping);
while (i.hasNext()) {
i.next();
if (languages.contains(i.value()))
patterns << QLatin1String("*.") + i.key();
}
return patterns;
}
ModelManagerInterface *ModelManagerInterface::instance()
{
return g_instance;
}
QHash<QString, Language::Enum> ModelManagerInterface::languageForSuffix() const
{
return defaultLanguageMapping();
}

View File

@@ -139,6 +139,8 @@ public:
ModelManagerInterface(QObject *parent = 0);
virtual ~ModelManagerInterface();
static Language::Enum guessLanguageOfFile(const QString &fileName);
static QStringList globPatternsForLanguages(const QList<Language::Enum> languages);
static ModelManagerInterface *instance();
virtual WorkingCopy workingCopy() const = 0;
@@ -184,7 +186,6 @@ public:
// Blocks until all parsing threads are done. Used for testing.
virtual void joinAllThreads() = 0;
public slots:
virtual void resetCodeModel() = 0;
@@ -194,6 +195,8 @@ signals:
void aboutToRemoveFiles(const QStringList &files);
void libraryInfoUpdated(const QString &path, const QmlJS::LibraryInfo &info);
void projectInfoUpdated(const ProjectInfo &pinfo);
protected:
virtual QHash<QString,Language::Enum> languageForSuffix() const;
};
} // namespace QmlJS