aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljsutils_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmlcompiler/qqmljsutils_p.h')
-rw-r--r--src/qmlcompiler/qqmljsutils_p.h84
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