bool Bind::visit(UiImport *ast) { ComponentVersion version; if (ast->versionToken.isValid()) { const QString versionString = _doc->source().mid(ast->versionToken.offset, ast->versionToken.length); version = ComponentVersion(versionString); if (!version.isValid()) { _diagnosticMessages->append( errorMessage(ast->versionToken, tr("expected two numbers separated by a dot"))); } } if (ast->importUri) { if (!version.isValid()) { _diagnosticMessages->append( errorMessage(ast, tr("package import requires a version number"))); } _imports += ImportInfo::moduleImport(toString(ast->importUri), version, ast->importId.toString(), ast); } else if (!ast->fileName.isEmpty()) { _imports += ImportInfo::pathImport(_doc->path(), ast->fileName.toString(), version, ast->importId.toString(), ast); } else { _imports += ImportInfo::invalidImport(ast); } return false; }
void TypeDescriptionReader::readDocument(UiProgram *ast) { if (!ast) { addError(SourceLocation(), tr("Could not parse document.")); return; } if (!ast->headers || ast->headers->next || !AST::cast<AST::UiImport *>(ast->headers->headerItem)) { addError(SourceLocation(), tr("Expected a single import.")); return; } UiImport *import = AST::cast<AST::UiImport *>(ast->headers->headerItem); if (toString(import->importUri) != QLatin1String("QtQuick.tooling")) { addError(import->importToken, tr("Expected import of QtQuick.tooling.")); return; } ComponentVersion version; const QString versionString = _source.mid(import->versionToken.offset, import->versionToken.length); const int dotIdx = versionString.indexOf(QLatin1Char('.')); if (dotIdx != -1) { version = ComponentVersion(versionString.left(dotIdx).toInt(), versionString.mid(dotIdx + 1).toInt()); } if (version.majorVersion() != 1) { addError(import->versionToken, tr("Major version different from 1 not supported.")); return; } if (version.minorVersion() > 1) addWarning(import->versionToken, tr("Reading only version 1.1 parts.")); if (!ast->members || !ast->members->member || ast->members->next) { addError(SourceLocation(), tr("Expected document to contain a single object definition.")); return; } UiObjectDefinition *module = dynamic_cast<UiObjectDefinition *>(ast->members->member); if (!module) { addError(SourceLocation(), tr("Expected document to contain a single object definition.")); return; } if (toString(module->qualifiedTypeNameId) != QLatin1String("Module")) { addError(SourceLocation(), tr("Expected document to contain a Module {} member.")); return; } readModule(module); }
bool Bind::visit(UiImport *ast) { ComponentVersion version; if (ast->versionToken.isValid()) { const QString versionString = _doc->source().mid(ast->versionToken.offset, ast->versionToken.length); version = ComponentVersion(versionString); if (!version.isValid()) { _diagnosticMessages->append( errorMessage(ast->versionToken, tr("expected two numbers separated by a dot"))); } } if (ast->importUri) { if (!version.isValid()) { _diagnosticMessages->append( errorMessage(ast, tr("package import requires a version number"))); } const QString importId = ast->importId.toString(); ImportInfo import = ImportInfo::moduleImport(toString(ast->importUri), version, importId, ast); if (_doc->language() == Dialect::Qml) { const QString importStr = import.name() + importId; if (ModelManagerInterface::instance()) { QmlLanguageBundles langBundles = ModelManagerInterface::instance()->extendedBundles(); QmlBundle qq1 = langBundles.bundleForLanguage(Dialect::QmlQtQuick1); QmlBundle qq2 = langBundles.bundleForLanguage(Dialect::QmlQtQuick2); bool isQQ1 = qq1.supportedImports().contains(importStr); bool isQQ2 = qq2.supportedImports().contains(importStr); if (isQQ1 && ! isQQ2) _doc->setLanguage(Dialect::QmlQtQuick1); if (isQQ2 && ! isQQ1) _doc->setLanguage(Dialect::QmlQtQuick2); } } _imports += import; } else if (!ast->fileName.isEmpty()) { _imports += ImportInfo::pathImport(_doc->path(), ast->fileName.toString(), version, ast->importId.toString(), ast); } else { _imports += ImportInfo::invalidImport(ast); } return false; }
bool operator<=(const ComponentVersion &lhs, const ComponentVersion &rhs) { return lhs.majorVersion() < rhs.majorVersion() || (lhs.majorVersion() == rhs.majorVersion() && lhs.minorVersion() <= rhs.minorVersion()); }
bool operator==(const ComponentVersion &lhs, const ComponentVersion &rhs) { return lhs.majorVersion() == rhs.majorVersion() && lhs.minorVersion() == rhs.minorVersion(); }