diff options
Diffstat (limited to 'src/qml/qml/qqmldirparser.cpp')
-rw-r--r-- | src/qml/qml/qqmldirparser.cpp | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/src/qml/qml/qqmldirparser.cpp b/src/qml/qml/qqmldirparser.cpp index 8fcab2e570..b23b760b78 100644 --- a/src/qml/qml/qqmldirparser.cpp +++ b/src/qml/qml/qqmldirparser.cpp @@ -116,7 +116,7 @@ bool QQmlDirParser::parse(const QString &source) if (ch->isNull()) break; - QString sections[3]; + QString sections[4]; int sectionCount = 0; do { @@ -126,7 +126,7 @@ bool QQmlDirParser::parse(const QString &source) } const QChar *start = ch; scanWord(ch); - if (sectionCount < 3) { + if (sectionCount < 4) { sections[sectionCount++] = source.mid(start-source.constData(), ch-start); } else { reportError(lineNumber, start-lineStart, QLatin1String("unexpected token")); @@ -167,7 +167,7 @@ bool QQmlDirParser::parse(const QString &source) _typeNamespace = sections[1]; } else if (sections[0] == QLatin1String("plugin")) { - if (sectionCount < 2) { + if (sectionCount < 2 || sectionCount > 3) { reportError(lineNumber, 0, QString::fromUtf8("plugin directive requires one or two arguments, but %1 were provided").arg(sectionCount - 1)); @@ -187,6 +187,43 @@ bool QQmlDirParser::parse(const QString &source) Component entry(sections[1], sections[2], -1, -1); entry.internal = true; _components.insertMulti(entry.typeName, entry); + } else if (sections[0] == QLatin1String("singleton")) { + if (sectionCount < 3 || sectionCount > 4) { + reportError(lineNumber, 0, + QString::fromUtf8("singleton types require 2 or 3 arguments, but %1 were provided").arg(sectionCount - 1)); + continue; + } else if (sectionCount == 3) { + // handle qmldir directory listing case where singleton is defined in the following pattern: + // singleton TestSingletonType TestSingletonType.qml + Component entry(sections[1], sections[2], -1, -1); + entry.singleton = true; + _components.insertMulti(entry.typeName, entry); + } else { + // handle qmldir module listing case where singleton is defined in the following pattern: + // singleton TestSingletonType 2.0 TestSingletonType20.qml + const QString &version = sections[2]; + const int dotIndex = version.indexOf(QLatin1Char('.')); + + if (dotIndex == -1) { + reportError(lineNumber, 0, QLatin1String("expected '.'")); + } else if (version.indexOf(QLatin1Char('.'), dotIndex + 1) != -1) { + reportError(lineNumber, 0, QLatin1String("unexpected '.'")); + } else { + bool validVersionNumber = false; + const int majorVersion = parseInt(QStringRef(&version, 0, dotIndex), &validVersionNumber); + + if (validVersionNumber) { + const int minorVersion = parseInt(QStringRef(&version, dotIndex+1, version.length()-dotIndex-1), &validVersionNumber); + + if (validVersionNumber) { + const QString &fileName = sections[3]; + Component entry(sections[1], fileName, majorVersion, minorVersion); + entry.singleton = true; + _components.insertMulti(entry.typeName, entry); + } + } + } + } } else if (sections[0] == QLatin1String("typeinfo")) { if (sectionCount != 2) { reportError(lineNumber, 0, |