Skip to content

Commit

Permalink
Refactor argument list creation to use common method.
Browse files Browse the repository at this point in the history
This is because we need to pass the parameter to handle the case in a native app where '-parm:value' is presented.
  • Loading branch information
JamesWTruher committed Mar 10, 2021
1 parent 077d0cf commit da24160
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ internal void BindParameters(Collection<CommandParameterInternal> parameters)
if (parameter.ParameterNameSpecified)
{
Diagnostics.Assert(!parameter.ParameterText.Contains(' '), "Parameters cannot have whitespace");
PossiblyGlobArg(parameter.ParameterText, StringConstantType.BareWord);
PossiblyGlobArg(parameter.ParameterText, parameter, StringConstantType.BareWord);

if (parameter.SpaceAfterParameter)
{
Expand Down Expand Up @@ -131,7 +131,7 @@ internal void BindParameters(Collection<CommandParameterInternal> parameters)
stringConstantType = StringConstantType.DoubleQuoted;
}

AppendOneNativeArgument(Context, argValue, arrayLiteralAst, sawVerbatimArgumentMarker, stringConstantType);
AppendOneNativeArgument(Context, parameter, argValue, arrayLiteralAst, sawVerbatimArgumentMarker, stringConstantType);
}
}
}
Expand Down Expand Up @@ -160,6 +160,28 @@ internal string[] ArgumentList
}
}

/// <summary>
/// Add an argument to the ArgumentList.
/// We may need to construct the argument out of the parameter text and the argument
/// in the case that we have a parameter that appears as "-switch:value".
/// </summary>
internal void AddToArgumentList(CommandParameterInternal parameter, string argument)
{

if (parameter.ParameterNameSpecified && parameter.ParameterText.EndsWith(":"))
{
if (argument != parameter.ParameterText)
{
_argumentList.Add(parameter.ParameterText + argument);
}
}
else
{
_argumentList.Add(argument);
}

}

private List<string> _argumentList = new List<string>();

/// <summary>
Expand Down Expand Up @@ -199,11 +221,12 @@ internal bool UseArgumentList
/// each of which will be stringized.
/// </summary>
/// <param name="context">Execution context instance.</param>
/// <param name="parameter">The parameter we're looking at</param>
/// <param name="obj">The object to append.</param>
/// <param name="argArrayAst">If the argument was an array literal, the Ast, otherwise null.</param>
/// <param name="sawVerbatimArgumentMarker">True if the argument occurs after --%.</param>
/// <param name="stringConstantType">Bare, SingleQuoted, or DoubleQuoted.</param>
private void AppendOneNativeArgument(ExecutionContext context, object obj, ArrayLiteralAst argArrayAst, bool sawVerbatimArgumentMarker, StringConstantType stringConstantType)
private void AppendOneNativeArgument(ExecutionContext context, CommandParameterInternal parameter, object obj, ArrayLiteralAst argArrayAst, bool sawVerbatimArgumentMarker, StringConstantType stringConstantType)
{
IEnumerator list = LanguagePrimitives.GetEnumerator(obj);

Expand Down Expand Up @@ -272,12 +295,12 @@ private void AppendOneNativeArgument(ExecutionContext context, object obj, Array
if (stringConstantType == StringConstantType.DoubleQuoted)
{
_arguments.Append(ResolvePath(arg, Context));
_argumentList.Add(ResolvePath(arg, Context));
AddToArgumentList(parameter, ResolvePath(arg, Context));
}
else
{
_arguments.Append(arg);
_argumentList.Add(arg);
AddToArgumentList(parameter, arg);
}

// need to escape all trailing backslashes so the native command receives it correctly
Expand All @@ -296,22 +319,22 @@ private void AppendOneNativeArgument(ExecutionContext context, object obj, Array
// We have a literal array, so take the extent, break it on spaces and add them to the argument list.
foreach (string element in argArrayAst.Extent.Text.Split(" ", StringSplitOptions.RemoveEmptyEntries))
{
PossiblyGlobArg(element, stringConstantType);
PossiblyGlobArg(element, parameter, stringConstantType);
}

break;
}
else
{
PossiblyGlobArg(arg, stringConstantType);
PossiblyGlobArg(arg, parameter, stringConstantType);
}
}
}
}
else if (UseArgumentList && currentObj != null)
{
// add empty strings to arglist, but not nulls
_argumentList.Add(arg);
AddToArgumentList(parameter, arg);
}
}
while (list != null);
Expand All @@ -322,8 +345,9 @@ private void AppendOneNativeArgument(ExecutionContext context, object obj, Array
/// On Unix, do globbing as appropriate, otherwise just append <paramref name="arg"/>.
/// </summary>
/// <param name="arg">The argument that possibly needs expansion.</param>
/// <param name="parameter">The parameter we're looking at</param>
/// <param name="stringConstantType">Bare, SingleQuoted, or DoubleQuoted.</param>
private void PossiblyGlobArg(string arg, StringConstantType stringConstantType)
private void PossiblyGlobArg(string arg, CommandParameterInternal parameter, StringConstantType stringConstantType)
{
var argExpanded = false;

Expand Down Expand Up @@ -363,7 +387,6 @@ private void PossiblyGlobArg(string arg, StringConstantType stringConstantType)
foreach (var path in paths)
{
_arguments.Append(sep);
// _argumentList.Add(sep);
sep = " ";
var expandedPath = (path.BaseObject as FileSystemInfo).FullName;
if (normalizePath)
Expand All @@ -377,12 +400,12 @@ private void PossiblyGlobArg(string arg, StringConstantType stringConstantType)
_arguments.Append('"');
_arguments.Append(expandedPath);
_arguments.Append('"');
_argumentList.Add(expandedPath);
AddToArgumentList(parameter, expandedPath);
}
else
{
_arguments.Append(expandedPath);
_argumentList.Add(expandedPath);
AddToArgumentList(parameter, expandedPath);
}

argExpanded = true;
Expand All @@ -399,14 +422,14 @@ private void PossiblyGlobArg(string arg, StringConstantType stringConstantType)
if (string.Equals(arg, "~"))
{
_arguments.Append(home);
_argumentList.Add(home);
AddToArgumentList(parameter, home);
argExpanded = true;
}
else if (arg.StartsWith("~/", StringComparison.OrdinalIgnoreCase))
{
var replacementString = home + arg.Substring(1);
_arguments.Append(replacementString);
_argumentList.Add(replacementString);
AddToArgumentList(parameter, replacementString);
argExpanded = true;
}
}
Expand All @@ -421,7 +444,7 @@ private void PossiblyGlobArg(string arg, StringConstantType stringConstantType)
if (!argExpanded)
{
_arguments.Append(arg);
_argumentList.Add(arg);
AddToArgumentList(parameter, arg);
}
}

Expand Down
4 changes: 2 additions & 2 deletions test/powershell/Host/ConsoleHost.Tests.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -235,8 +235,8 @@ Describe "ConsoleHost unit tests" -tags "Feature" {
$observed | Should -BeExactly "h-llo"
}

It "Empty command should fail" {
& $powershell -noprofile -c ''
It "Missing command should fail" {
& $powershell -noprofile -c
$LASTEXITCODE | Should -Be 64
}

Expand Down

0 comments on commit da24160

Please sign in to comment.