ProjectExplorer: More customwizard code cosmetics

Change-Id: I42311bb5f8e6503a8f81dafd5c7487aaaaf84a0c
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
hjk
2025-04-17 12:51:11 +02:00
parent 645685fb43
commit c1c374150d
4 changed files with 54 additions and 47 deletions

View File

@@ -160,11 +160,10 @@ BaseFileWizard *CustomWizard::create(const WizardDialogParameters &p) const
}
// Read out files and store contents with field contents replaced.
static Result<> createFile(CustomWizardFile cwFile,
static Result<GeneratedFile> createFile(CustomWizardFile cwFile,
const QString &sourceDirectory,
const FilePath &targetDirectory,
const CustomProjectWizard::FieldReplacementMap &fm,
GeneratedFiles *files)
const CustomProjectWizard::FieldReplacementMap &fm)
{
const QChar slash = QLatin1Char('/');
const QString sourcePath = sourceDirectory + slash + cwFile.source;
@@ -197,8 +196,7 @@ static Result<> createFile(CustomWizardFile cwFile,
if (cwFile.openProject)
attributes |= GeneratedFile::OpenProjectAttribute;
generatedFile.setAttributes(attributes);
files->push_back(generatedFile);
return ResultOk;
return generatedFile;
}
// Helper to find a specific wizard page of a wizard by type.
@@ -242,7 +240,13 @@ GeneratedFiles CustomWizard::generateFiles(const QWizard *dialog, QString *error
str << " '" << it.key() << "' -> '" << it.value() << "'\n";
qWarning("%s", qPrintable(logText));
}
return generateWizardFiles(errorMessage);
const Result<GeneratedFiles> res = generateWizardFiles();
if (!res) {
if (errorMessage)
*errorMessage = res.error();
return {};
}
return res.value();
}
Result<> CustomWizard::writeFiles(const GeneratedFiles &files) const
@@ -285,7 +289,7 @@ Result<> CustomWizard::writeFiles(const GeneratedFiles &files) const
return ResultOk;
}
GeneratedFiles CustomWizard::generateWizardFiles(QString *errorMessage) const
Result<GeneratedFiles> CustomWizard::generateWizardFiles() const
{
GeneratedFiles rc;
const CustomWizardContextPtr ctx = context();
@@ -296,24 +300,24 @@ GeneratedFiles CustomWizard::generateWizardFiles(QString *errorMessage) const
qDebug() << "CustomWizard::generateWizardFiles: in "
<< ctx->targetPath << ", using: " << ctx->replacements;
// If generator script is non-empty, do a dry run to get it's files.
// If generator script is non-empty, do a dry run to get its files.
if (!d->m_parameters->filesGeneratorScript.isEmpty()) {
rc += dryRunCustomWizardGeneratorScript(scriptWorkingDirectory(ctx, d->m_parameters),
Result<QList<GeneratedFile>> res =
dryRunCustomWizardGeneratorScript(scriptWorkingDirectory(ctx, d->m_parameters),
d->m_parameters->filesGeneratorScript,
d->m_parameters->filesGeneratorScriptArguments,
ctx->replacements,
errorMessage);
if (rc.isEmpty())
return rc;
ctx->replacements);
if (!res)
return res;
rc.append(res.value());
}
// Add the template files specified by the <file> elements.
for (const CustomWizardFile &file : std::as_const(d->m_parameters->files)) {
const Result<> res = createFile(file, d->m_parameters->directory, ctx->targetPath, context()->replacements, &rc);
if (!res) {
if (errorMessage)
errorMessage->append(res.error());
return {};
}
const Result<GeneratedFile> res = createFile(file, d->m_parameters->directory,
ctx->targetPath, context()->replacements);
if (!res)
return ResultError(res.error());
rc.append(res.value());
}
return rc;
@@ -514,8 +518,13 @@ GeneratedFiles CustomProjectWizard::generateFiles(const QWizard *w, QString *err
ctx->replacements = fieldReplacementMap;
if (CustomWizardPrivate::verbose)
qDebug() << "CustomProjectWizard::generateFiles" << dialog << ctx->targetPath << ctx->replacements;
const GeneratedFiles generatedFiles = generateWizardFiles(errorMessage);
return generatedFiles;
const Result<GeneratedFiles> generatedFiles = generateWizardFiles();
if (!generatedFiles) {
if (errorMessage)
*errorMessage = generatedFiles.error();
return {};
}
return *generatedFiles;
}
/*!

View File

@@ -80,7 +80,7 @@ protected:
using CustomWizardContextPtr = std::shared_ptr<Internal::CustomWizardContext>;
// generate files in path
Core::GeneratedFiles generateWizardFiles(QString *errorMessage) const;
Utils::Result<Core::GeneratedFiles> generateWizardFiles() const;
// Create replacement map as static base fields + QWizard fields
FieldReplacementMap replacementMap(const QWizard *w) const;
Utils::Result<> writeFiles(const Core::GeneratedFiles &files) const override;

View File

@@ -14,6 +14,7 @@
#include <QFileInfo>
#include <QDebug>
using namespace Core;
using namespace Utils;
namespace ProjectExplorer::Internal {
@@ -114,39 +115,37 @@ static Result<>
\sa runCustomWizardGeneratorScript, ProjectExplorer::CustomWizard
*/
Core::GeneratedFiles
Result<QList<GeneratedFile>>
dryRunCustomWizardGeneratorScript(const QString &targetPath,
const QStringList &script,
const QList<GeneratorScriptArgument> &arguments,
const QMap<QString, QString> &fieldMap,
QString *errorMessage)
const QMap<QString, QString> &fieldMap)
{
// Run in temporary directory as the target path may not exist yet.
QString stdOut;
const Result<> res = runGenerationScriptHelper(Utils::TemporaryDirectory::masterDirectoryFilePath(),
const Result<> res = runGenerationScriptHelper(TemporaryDirectory::masterDirectoryFilePath(),
script, arguments, true, fieldMap, &stdOut);
if (!res) {
*errorMessage = res.error();
return Core::GeneratedFiles();
}
Core::GeneratedFiles files;
if (!res)
return ResultError(res.error());
GeneratedFiles files;
// Parse the output consisting of lines with ',' separated tokens.
// (file name + attributes matching those of the <file> element)
const QStringList lines = stdOut.split(QLatin1Char('\n'));
for (const QString &line : lines) {
const QString trimmed = line.trimmed();
if (!trimmed.isEmpty()) {
Core::GeneratedFile file;
Core::GeneratedFile::Attributes attributes = Core::GeneratedFile::CustomGeneratorAttribute;
GeneratedFile file;
GeneratedFile::Attributes attributes = GeneratedFile::CustomGeneratorAttribute;
const QStringList tokens = line.split(QLatin1Char(','));
const int count = tokens.count();
for (int i = 0; i < count; i++) {
const QString &token = tokens.at(i);
if (i) {
if (token == QLatin1String(customWizardFileOpenEditorAttributeC))
attributes |= Core::GeneratedFile::OpenEditorAttribute;
attributes |= GeneratedFile::OpenEditorAttribute;
else if (token == QLatin1String(customWizardFileOpenProjectAttributeC))
attributes |= Core::GeneratedFile::OpenProjectAttribute;
attributes |= GeneratedFile::OpenProjectAttribute;
} else {
// Token 0 is file name. Wizard wants native names.
// Expand to full path if relative
@@ -165,7 +164,7 @@ Core::GeneratedFiles
if (CustomWizard::verbose()) {
QDebug nospace = qDebug().nospace();
nospace << script << " generated:\n";
for (const Core::GeneratedFile &f : std::as_const(files))
for (const GeneratedFile &f : std::as_const(files))
nospace << ' ' << f.filePath() << f.attributes() << '\n';
}
return files;

View File

@@ -18,12 +18,11 @@ class GeneratorScriptArgument;
QStringList fixGeneratorScript(const QString &configFile, QString attributeIn);
// Step 1) Do a dry run of the generation script to get a list of files on stdout
QList<Core::GeneratedFile>
Utils::Result<QList<Core::GeneratedFile>>
dryRunCustomWizardGeneratorScript(const QString &targetPath,
const QStringList &script,
const QList<GeneratorScriptArgument> &arguments,
const QMap<QString, QString> &fieldMap,
QString *errorMessage);
const QMap<QString, QString> &fieldMap);
// Step 2) Generate files
Utils::Result<> runCustomWizardGeneratorScript(const QString &targetPath,