MacroExpander: Return error from expandArgs and handle them

Change-Id: Ie4eea11d6e85ab45bc6abf7d255aa204b9c73c92
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-10-21 10:27:01 +02:00
parent ca38a7a2d3
commit d0707e17b3
7 changed files with 47 additions and 13 deletions

View File

@@ -19,8 +19,6 @@
namespace Utils { namespace Utils {
namespace Internal { namespace Internal {
static Q_LOGGING_CATEGORY(expanderLog, "qtc.utils.macroexpander", QtWarningMsg)
const char kFilePathPostfix[] = ":FilePath"; const char kFilePathPostfix[] = ":FilePath";
const char kPathPostfix[] = ":Path"; const char kPathPostfix[] = ":Path";
const char kNativeFilePathPostfix[] = ":NativeFilePath"; const char kNativeFilePathPostfix[] = ":NativeFilePath";
@@ -413,7 +411,8 @@ QVariant MacroExpander::expandVariant(const QVariant &v) const
return v; return v;
} }
QString MacroExpander::expandProcessArgs(const QString &argsWithVariables, Utils::OsType osType) const expected_str<QString> MacroExpander::expandProcessArgs(
const QString &argsWithVariables, Utils::OsType osType) const
{ {
QString result = argsWithVariables; QString result = argsWithVariables;
const bool ok = ProcessArgs::expandMacros( const bool ok = ProcessArgs::expandMacros(
@@ -421,7 +420,10 @@ QString MacroExpander::expandProcessArgs(const QString &argsWithVariables, Utils
[this](const QString &str, int *pos, QString *ret) { return d->findMacro(str, pos, ret); }, [this](const QString &str, int *pos, QString *ret) { return d->findMacro(str, pos, ret); },
osType); osType);
QTC_ASSERT(ok, qCDebug(expanderLog) << "Expanding failed: " << argsWithVariables); if (!ok) {
return make_unexpected(
Tr::tr("Failed to expand macros in process arguments: %1").arg(argsWithVariables));
}
return result; return result;
} }

View File

@@ -37,7 +37,7 @@ public:
QByteArray expand(const QByteArray &stringWithVariables) const; QByteArray expand(const QByteArray &stringWithVariables) const;
QVariant expandVariant(const QVariant &v) const; QVariant expandVariant(const QVariant &v) const;
QString expandProcessArgs( expected_str<QString> expandProcessArgs(
const QString &argsWithVariables, Utils::OsType osType = Utils::HostOsInfo::hostOs()) const; const QString &argsWithVariables, Utils::OsType osType = Utils::HostOsInfo::hostOs()) const;
using PrefixFunction = std::function<QString(QString)>; using PrefixFunction = std::function<QString(QString)>;

View File

@@ -923,7 +923,12 @@ void ExternalToolConfig::addCategory()
void ExternalToolConfig::updateEffectiveArguments() void ExternalToolConfig::updateEffectiveArguments()
{ {
m_arguments->setToolTip(Utils::globalMacroExpander()->expandProcessArgs(m_arguments->text())); const expected_str<QString> result = Utils::globalMacroExpander()->expandProcessArgs(
m_arguments->text());
if (result)
m_arguments->setToolTip(*result);
else
m_arguments->setToolTip(result.error());
} }
void ExternalToolConfig::editEnvironmentChanges() void ExternalToolConfig::editEnvironmentChanges()

View File

@@ -598,7 +598,10 @@ bool ExternalToolRunner::resolve()
} }
} }
m_resolvedArguments = expander->expandProcessArgs(m_tool->arguments()); const expected_str<QString> args = expander->expandProcessArgs(m_tool->arguments());
QTC_ASSERT_EXPECTED(args, return false);
m_resolvedArguments = *args;
m_resolvedInput = expander->expand(m_tool->input()); m_resolvedInput = expander->expand(m_tool->input());
m_resolvedWorkingDirectory = expander->expand(m_tool->workingDirectory()); m_resolvedWorkingDirectory = expander->expand(m_tool->workingDirectory());

View File

@@ -328,9 +328,11 @@ QString ArgumentsAspect::arguments() const
return m_arguments; return m_arguments;
m_currentlyExpanding = true; m_currentlyExpanding = true;
const QString expanded = macroExpander()->expandProcessArgs(m_arguments); const expected_str<QString> expanded = macroExpander()->expandProcessArgs(m_arguments);
QTC_ASSERT_EXPECTED(expanded, return m_arguments);
m_currentlyExpanding = false; m_currentlyExpanding = false;
return expanded; return *expanded;
} }
/*! /*!
@@ -962,7 +964,7 @@ X11ForwardingAspect::X11ForwardingAspect(AspectContainer *container)
QString X11ForwardingAspect::display() const QString X11ForwardingAspect::display() const
{ {
return !isChecked() ? QString() : macroExpander()->expandProcessArgs(value()); return !isChecked() ? QString() : macroExpander()->expand(value());
} }

View File

@@ -241,6 +241,7 @@ void QmakeBuildConfiguration::updateProblemLabel()
bool targetMismatch = false; bool targetMismatch = false;
bool incompatibleBuild = false; bool incompatibleBuild = false;
bool allGood = false; bool allGood = false;
bool invalidArguments = false;
// we only show if we actually have a qmake and makestep // we only show if we actually have a qmake and makestep
QString errorString; QString errorString;
if (qmakeStep() && makeStep()) { if (qmakeStep() && makeStep()) {
@@ -258,6 +259,9 @@ void QmakeBuildConfiguration::updateProblemLabel()
case QmakeBuildConfiguration::MakefileForWrongProject: case QmakeBuildConfiguration::MakefileForWrongProject:
targetMismatch = true; targetMismatch = true;
break; break;
case QmakeBuildConfiguration::InvalidArguments:
invalidArguments = true;
break;
} }
} }
@@ -305,6 +309,10 @@ void QmakeBuildConfiguration::updateProblemLabel()
} else if (unalignedBuildDir) { } else if (unalignedBuildDir) {
buildDirectoryAspect()->setProblem(unalignedBuildDirWarning()); buildDirectoryAspect()->setProblem(unalignedBuildDirWarning());
return; return;
} else if (invalidArguments) {
buildDirectoryAspect()->setProblem(
Tr::tr("Starting qmake failed with the following error: %1").arg(errorString));
return;
} }
buildDirectoryAspect()->setProblem({}); buildDirectoryAspect()->setProblem({});
@@ -516,8 +524,16 @@ QmakeBuildConfiguration::MakefileState QmakeBuildConfiguration::compareToImportF
// and compare that on its own // and compare that on its own
FilePath workingDirectory = makefile.parentDir(); FilePath workingDirectory = makefile.parentDir();
QStringList actualArgs; QStringList actualArgs;
QString allArgs = macroExpander()->expandProcessArgs(qs->allArguments( expected_str<QString> expandResult = macroExpander()->expandProcessArgs(
QtKitAspect::qtVersion(target()->kit()), QMakeStep::ArgumentFlag::Expand)); qs->allArguments(QtKitAspect::qtVersion(target()->kit()), QMakeStep::ArgumentFlag::Expand));
if (!expandResult) {
if (errorString)
*errorString = expandResult.error();
return InvalidArguments;
}
QString allArgs = *expandResult;
// This copies the settings from allArgs to actualArgs (minus some we // This copies the settings from allArgs to actualArgs (minus some we
// are not interested in), splitting them up into individual strings: // are not interested in), splitting them up into individual strings:
extractSpecFromArguments(&allArgs, workingDirectory, version, &actualArgs); extractSpecFromArguments(&allArgs, workingDirectory, version, &actualArgs);

View File

@@ -61,7 +61,13 @@ public:
Utils::FilePath makefile() const; Utils::FilePath makefile() const;
enum MakefileState { MakefileMatches, MakefileForWrongProject, MakefileIncompatible, MakefileMissing }; enum MakefileState {
MakefileMatches,
MakefileForWrongProject,
MakefileIncompatible,
MakefileMissing,
InvalidArguments
};
MakefileState compareToImportFrom(const Utils::FilePath &makefile, QString *errorString = nullptr); MakefileState compareToImportFrom(const Utils::FilePath &makefile, QString *errorString = nullptr);
static QString extractSpecFromArguments( static QString extractSpecFromArguments(
QString *arguments, const Utils::FilePath &directory, const QtSupport::QtVersion *version, QString *arguments, const Utils::FilePath &directory, const QtSupport::QtVersion *version,