7#include <private/qqmljsutils_p.h>
8#include <private/qtqmlglobal_p.h>
10#include <QtCore/qtconfigmacros.h>
11#include <QtCore/qregularexpression.h>
12#include <QtCore/qdirlisting.h>
13#include <QtCore/qfile.h>
15#if QT_CONFIG(qmlcontextpropertydump)
16# include <QtCore/qsettings.h>
20# include <QtCore/qprocess.h>
32 R"x((\.|->)setContextProperty\s*\(\s*(QStringLiteral\s*\(|QString\s*\(|QLatin1String(View)?\s*\(|u)?\s*"([^"]*)")x"_L1;
41 const auto it = m_properties.find(name);
42 if (it != m_properties.end())
49 if (
const auto it = m_properties.find(name); it != m_properties.end()) {
50 it.value().append(property);
53 m_properties.insert(name, { property });
59 if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
62 const QString fileContent = QString::fromUtf8(file.readAll());
63 for (
const auto &match : s_matchSetContextProperty.globalMatch(fileContent)) {
64 const quint32 offset = match.capturedStart(s_contextPropertyNameIdxInPattern);
65 const quint32 length = match.capturedLength(s_contextPropertyNameIdxInPattern);
66 const auto [row, column] = QQmlJS::SourceLocation::rowAndColumnFrom(fileContent, offset);
67 const QQmlJS::SourceLocation sourceLocation{ offset, length, row, column };
69 add(match.captured(s_contextPropertyNameIdxInPattern),
70 HeuristicContextProperty{ filePath, sourceLocation });
76 const QStringList fileFilters{ QQmlJSUtils::cppFileFilters.begin(),
77 QQmlJSUtils::cppFileFilters.end() };
79 for (
const QString &url : rootUrls) {
80 for (
const auto &dirEntry : QDirListing{ url, fileFilters,
81 QDirListing::IteratorFlag::Recursive
82 | QDirListing::IteratorFlag::FilesOnly }) {
84 const QString filePath = dirEntry.filePath();
85 collectFromFile(filePath);
90#if QT_CONFIG(process) && !defined(Q_OS_WINDOWS)
102 result.collectFromDirs(cppSourceDirs);
107
108
109
110
116#if QT_CONFIG(process) && !defined(Q_OS_WINDOWS)
117 if (qEnvironmentVariableIsSet(
"QT_QML_NO_GREP")) {
123 QStringList arguments{
"--recursive"_L1,
125 "--files-with-matches"_L1,
126 "--extended-regexp"_L1,
131 for (
const auto &fileFilter : QQmlJSUtils::cppFileFilters)
132 arguments <<
"--include"_L1 << fileFilter;
134 arguments.append(dirs);
135 grep.start(
"grep"_L1, arguments);
136 grep.waitForFinished();
137 if (grep.exitStatus() == QProcess::NormalExit) {
138 switch (grep.exitCode()) {
140 const QString output = QString::fromUtf8(grep.readAllStandardOutput());
141 parseGrepOutput(output);
154#if QT_CONFIG(qmlcontextpropertydump)
157 constexpr int size = 4;
167 for (
int i = 0;
i <
size; ++
i) {
189#if QT_CONFIG(qmlcontextpropertydump)
195#if QT_CONFIG(qmlcontextpropertydump)
196 HeuristicContextProperties result;
197 std::vector<QString> names;
199 const int size = settings->beginReadArray(cachedHeuristicListKey);
200 for (
int i = 0; i < size; ++i) {
201 settings->setArrayIndex(i);
202 names.push_back(settings->value(
"name").toString());
204 settings->endArray();
206 for (
const auto &name : names) {
207 const int size = settings->beginReadArray(u"property_"_s.append(name));
208 for (
int i = 0; i < size; ++i) {
209 settings->setArrayIndex(i);
212 HeuristicContextProperty{
213 settings->value(
"fileName").toString(),
214 deserializeSourceLocation(settings->value(
"sourceLocation").toString()),
217 settings->endArray();
222 return HeuristicContextProperties{};
228#if QT_CONFIG(qmlcontextpropertydump)
229 QSettings settings(folder +
"/.qt/contextPropertyDump.ini"_L1, QSettings::IniFormat);
230 settings.beginWriteArray(cachedHeuristicListKey);
232 for (
const auto &[name, _] : m_properties) {
233 settings.setArrayIndex(index++);
234 settings.setValue(
"name", name);
238 for (
const auto &[name, definitions] : m_properties) {
239 settings.beginWriteArray(u"property_"_s.append(name));
240 for (
int i = 0; i < definitions.size(); ++i) {
241 settings.setArrayIndex(i);
242 settings.setValue(
"fileName", definitions[i].filename);
243 settings.setValue(
"sourceLocation", serializeSourceLocation(definitions[i].location));
void add(const QString &name, const HeuristicContextProperty &property)
static HeuristicContextProperties collectFrom(QSettings *settings)
void writeCache(const QString &folder) const
QList< HeuristicContextProperty > definitionsForName(const QString &name) const
static const QRegularExpression s_matchSetContextProperty
static constexpr QLatin1StringView s_pattern
static constexpr int s_contextPropertyNameIdxInPattern
Combined button and popup list for selecting options.