diff options
Diffstat (limited to 'src/qmlcompiler/qqmljsutils_p.h')
-rw-r--r-- | src/qmlcompiler/qqmljsutils_p.h | 84 |
1 files changed, 52 insertions, 32 deletions
diff --git a/src/qmlcompiler/qqmljsutils_p.h b/src/qmlcompiler/qqmljsutils_p.h index 15425d0cab..bca4b1df38 100644 --- a/src/qmlcompiler/qqmljsutils_p.h +++ b/src/qmlcompiler/qqmljsutils_p.h @@ -14,17 +14,20 @@ // // We mean it. -#include <private/qtqmlcompilerexports_p.h> +#include <qtqmlcompilerexports.h> #include "qqmljslogger_p.h" #include "qqmljsregistercontent_p.h" #include "qqmljsscope_p.h" #include "qqmljsmetatypes_p.h" +#include <QtCore/qdir.h> #include <QtCore/qstack.h> #include <QtCore/qstring.h> -#include <QtCore/qstringview.h> #include <QtCore/qstringbuilder.h> +#include <QtCore/qstringview.h> + +#include <QtQml/private/qqmlsignalnames_p.h> #include <private/qduplicatetracker_p.h> #include <optional> @@ -64,7 +67,7 @@ static auto getQQmlJSScopeFromSmartPtr(const From &p) -> decltype(p.get()) class QQmlJSTypeResolver; class QQmlJSScopesById; -struct Q_QMLCOMPILER_PRIVATE_EXPORT QQmlJSUtils +struct Q_QMLCOMPILER_EXPORT QQmlJSUtils { /*! \internal Returns escaped version of \a s. This function is mostly useful for code @@ -73,7 +76,10 @@ struct Q_QMLCOMPILER_PRIVATE_EXPORT QQmlJSUtils static QString escapeString(QString s) { using namespace Qt::StringLiterals; - return s.replace(u'\\', u"\\\\"_s).replace(u'"', u"\\\""_s).replace(u'\n', u"\\n"_s); + return s.replace('\\'_L1, "\\\\"_L1) + .replace('"'_L1, "\\\""_L1) + .replace('\n'_L1, "\\n"_L1) + .replace('?'_L1, "\\?"_L1); } /*! \internal @@ -99,26 +105,6 @@ struct Q_QMLCOMPILER_PRIVATE_EXPORT QQmlJSUtils return type; } - /*! \internal - Returns a signal name from \a handlerName string. - */ - static std::optional<QString> signalName(QStringView handlerName) - { - if (handlerName.startsWith(u"on") && handlerName.size() > 2) { - QString signal = handlerName.mid(2).toString(); - for (int i = 0; i < signal.size(); ++i) { - QChar &ch = signal[i]; - if (ch.isLower()) - return {}; - if (ch.isUpper()) { - ch = ch.toLower(); - return signal; - } - } - } - return {}; - } - static std::optional<QQmlJSMetaProperty> changeHandlerProperty(const QQmlJSScope::ConstPtr &scope, QStringView signalName) { @@ -134,6 +120,21 @@ struct Q_QMLCOMPILER_PRIVATE_EXPORT QQmlJSUtils return {}; } + static std::optional<QQmlJSMetaProperty> + propertyFromChangedHandler(const QQmlJSScope::ConstPtr &scope, QStringView changedHandler) + { + auto signalName = QQmlSignalNames::changedHandlerNameToPropertyName(changedHandler); + if (!signalName) + return {}; + + auto p = scope->property(*signalName); + const bool isBindable = !p.bindable().isEmpty(); + const bool canNotify = !p.notify().isEmpty(); + if (p.isValid() && (isBindable || canNotify)) + return p; + return {}; + } + static bool hasCompositeBase(const QQmlJSScope::ConstPtr &scope) { if (!scope) @@ -141,7 +142,7 @@ struct Q_QMLCOMPILER_PRIVATE_EXPORT QQmlJSUtils const auto base = scope->baseType(); if (!base) return false; - return base->isComposite() && base->scopeType() == QQmlJSScope::QMLScope; + return base->isComposite() && base->scopeType() == QQmlSA::ScopeType::QMLScope; } enum PropertyAccessor { @@ -359,21 +360,40 @@ struct Q_QMLCOMPILER_PRIVATE_EXPORT QQmlJSUtils act(begin->scope, begin->extensionSpecifier); } - static std::optional<FixSuggestion> didYouMean(const QString &userInput, + static std::optional<QQmlJSFixSuggestion> didYouMean(const QString &userInput, QStringList candidates, QQmlJS::SourceLocation location); static std::variant<QString, QQmlJS::DiagnosticMessage> sourceDirectoryPath(const QQmlJSImporter *importer, const QString &buildDirectoryPath); + + template <typename Container> + static void deduplicate(Container &container) + { + std::sort(container.begin(), container.end()); + auto erase = std::unique(container.begin(), container.end()); + container.erase(erase, container.end()); + } + + static QStringList cleanPaths(QStringList &&paths) + { + for (QString &path : paths) + path = QDir::cleanPath(path); + return std::move(paths); + } }; -bool Q_QMLCOMPILER_PRIVATE_EXPORT canStrictlyCompareWithVar( - const QQmlJSTypeResolver *typeResolver, const QQmlJSRegisterContent &lhsContent, - const QQmlJSRegisterContent &rhsContent); +bool Q_QMLCOMPILER_EXPORT canStrictlyCompareWithVar( + const QQmlJSTypeResolver *typeResolver, const QQmlJSScope::ConstPtr &lhsType, + const QQmlJSScope::ConstPtr &rhsType); + +bool Q_QMLCOMPILER_EXPORT canCompareWithQObject( + const QQmlJSTypeResolver *typeResolver, const QQmlJSScope::ConstPtr &lhsType, + const QQmlJSScope::ConstPtr &rhsType); -bool Q_QMLCOMPILER_PRIVATE_EXPORT canCompareWithQObject(const QQmlJSTypeResolver *typeResolver, - const QQmlJSRegisterContent &lhsContent, - const QQmlJSRegisterContent &rhsContent); +bool Q_QMLCOMPILER_EXPORT canCompareWithQUrl( + const QQmlJSTypeResolver *typeResolver, const QQmlJSScope::ConstPtr &lhsType, + const QQmlJSScope::ConstPtr &rhsType); QT_END_NAMESPACE |