Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,18 @@ protected override void ProcessRecord()
/// </summary>
public class PropertyTypeArgumentCompleter : IArgumentCompleter
{
private static readonly string[] s_RegistryPropertyTypes = new string[]
private static readonly CompletionHelpers.CompletionDisplayInfoMapper RegistryPropertyTypeDisplayInfoMapper = registryPropertyType => registryPropertyType switch
{
"String" => new(TabCompletionStrings.RegistryStringToolTip, "String"),
"ExpandString" => new(TabCompletionStrings.RegistryExpandStringToolTip, "ExpandString"),
"Binary" => new(TabCompletionStrings.RegistryBinaryToolTip, "Binary"),
"DWord" => new(TabCompletionStrings.RegistryDWordToolTip, "DWord"),
"MultiString" => new(TabCompletionStrings.RegistryMultiStringToolTip, "MultiString"),
"QWord" => new(TabCompletionStrings.RegistryQWordToolTip, "QWord"),
_ => new(TabCompletionStrings.RegistryUnknownToolTip, "Unknown")
};

private static readonly IReadOnlyList<string> s_RegistryPropertyTypes = new List<string>(capacity: 7)
{
"String",
"ExpandString",
Expand All @@ -200,17 +211,6 @@ public class PropertyTypeArgumentCompleter : IArgumentCompleter
"Unknown"
};

private static string GetRegistryPropertyTypeToolTip(string propertyTypeName) => propertyTypeName switch
{
"String" => TabCompletionStrings.RegistryStringToolTip,
"ExpandString" => TabCompletionStrings.RegistryExpandStringToolTip,
"Binary" => TabCompletionStrings.RegistryBinaryToolTip,
"DWord" => TabCompletionStrings.RegistryDWordToolTip,
"MultiString" => TabCompletionStrings.RegistryMultiStringToolTip,
"QWord" => TabCompletionStrings.RegistryQWordToolTip,
_ => TabCompletionStrings.RegistryUnknownToolTip
};

/// <summary>
/// Returns completion results for PropertyType parameter.
/// </summary>
Expand All @@ -230,7 +230,7 @@ public IEnumerable<CompletionResult> CompleteArgument(
? CompletionHelpers.GetMatchingResults(
wordToComplete,
possibleCompletionValues: s_RegistryPropertyTypes,
toolTipMapping: GetRegistryPropertyTypeToolTip,
displayInfoMapper: RegistryPropertyTypeDisplayInfoMapper,
resultType: CompletionResultType.ParameterValue)
: [];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,28 +172,28 @@ public sealed class SeparatorArgumentCompleter : IArgumentCompleter
"`r`n";
#endif

private static readonly Dictionary<string, (string Tooltip, string ListItemText)> s_separatorMappings = new(capacity: 7)
private static readonly CompletionHelpers.CompletionDisplayInfoMapper SeparatorDisplayInfoMapper = separator => separator switch
{
{ ",", (TabCompletionStrings.SeparatorCommaToolTip, "Comma") },
{ ", ", (TabCompletionStrings.SeparatorCommaSpaceToolTip, "Comma-Space") },
{ ";", (TabCompletionStrings.SeparatorSemiColonToolTip, "Semi-Colon") },
{ "; ", (TabCompletionStrings.SeparatorSemiColonSpaceToolTip, "Semi-Colon-Space") },
{ NewLineText, (StringUtil.Format(TabCompletionStrings.SeparatorNewlineToolTip, NewLineText), "Newline") },
{ "-", (TabCompletionStrings.SeparatorDashToolTip, "Dash") },
{ " ", (TabCompletionStrings.SeparatorSpaceToolTip, "Space") },
"," => new(TabCompletionStrings.SeparatorCommaToolTip, "Comma"),
", " => new(TabCompletionStrings.SeparatorCommaSpaceToolTip, "Comma-Space"),
";" => new(TabCompletionStrings.SeparatorSemiColonToolTip, "Semi-Colon"),
"; " => new(TabCompletionStrings.SeparatorSemiColonSpaceToolTip, "Semi-Colon-Space"),
"-" => new(TabCompletionStrings.SeparatorDashToolTip, "Dash"),
" " => new(TabCompletionStrings.SeparatorSpaceToolTip, "Space"),
_ when separator == NewLineText => new(StringUtil.Format(TabCompletionStrings.SeparatorNewlineToolTip, NewLineText), "Newline"),
Comment thread
ArmaanMcleod marked this conversation as resolved.
Outdated
_ => new(separator, separator)
};

private static readonly IEnumerable<string> s_separatorValues = s_separatorMappings.Keys;

private static string GetSeparatorToolTip(string separator)
=> s_separatorMappings.TryGetValue(separator, out var mapping)
? mapping.Tooltip
: separator;

private static string GetSeparatorListItemText(string separator)
=> s_separatorMappings.TryGetValue(separator, out var mapping)
? mapping.ListItemText
: separator;
private static readonly IReadOnlyList<string> s_separatorValues = new List<string>(capacity: 7)
{
",",
", ",
";",
"; ",
NewLineText,
"-",
" ",
};

/// <summary>
/// Returns completion results for Separator parameter.
Expand All @@ -213,8 +213,7 @@ public IEnumerable<CompletionResult> CompleteArgument(
=> CompletionHelpers.GetMatchingResults(
wordToComplete,
possibleCompletionValues: s_separatorValues,
listItemTextMapping: GetSeparatorListItemText,
toolTipMapping: GetSeparatorToolTip,
displayInfoMapper: SeparatorDisplayInfoMapper,
resultType: CompletionResultType.ParameterValue);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,18 @@ internal static class CompletionHelpers
/// </summary>
/// <param name="wordToComplete">The word to complete.</param>
/// <param name="possibleCompletionValues">The possible completion values to iterate.</param>
/// <param name="toolTipMapping">The optional tool tip mapping delegate.</param>
/// <param name="listItemTextMapping">The optional list item text mapping delegate.</param>
/// <param name="displayInfoMapper">The optional completion display info mapper delegate for tool tip and list item text.</param>
/// <param name="resultType">The optional completion result type. Default is Text.</param>
/// <param name="matchStrategy">The optional match strategy delegate.</param>
/// <returns>List of matching completion results.</returns>
internal static IEnumerable<CompletionResult> GetMatchingResults(
string wordToComplete,
IEnumerable<string> possibleCompletionValues,
Func<string, string> toolTipMapping = null,
Func<string, string> listItemTextMapping = null,
CompletionDisplayInfoMapper displayInfoMapper = null,
CompletionResultType resultType = CompletionResultType.Text,
MatchStrategy matchStrategy = null)
{
displayInfoMapper ??= DefaultDisplayInfoMapper;
matchStrategy ??= DefaultMatch;

string quote = HandleDoubleAndSingleQuote(ref wordToComplete);
Expand All @@ -49,14 +48,48 @@ internal static IEnumerable<CompletionResult> GetMatchingResults(
if (matchStrategy(value, wordToComplete))
{
string completionText = QuoteCompletionText(value, quote);
string toolTip = toolTipMapping?.Invoke(value) ?? value;
string listItemText = listItemTextMapping?.Invoke(value) ?? value;

CompletionDisplayInfo displayInfo = displayInfoMapper(value);
string toolTip = displayInfo.ToolTip;
string listItemText = displayInfo.ListItemText;

yield return new CompletionResult(completionText, listItemText, resultType, toolTip);
}
}
}

/// <summary>
/// Represents the display information for a completion result.
/// </summary>
internal class CompletionDisplayInfo
Comment thread
ArmaanMcleod marked this conversation as resolved.
Outdated
{
public string ToolTip { get; set; }

public string ListItemText { get; set; }

public CompletionDisplayInfo(string toolTip, string listItemText)
{
ToolTip = toolTip;
ListItemText = listItemText;
}
}

/// <summary>
/// Provides the display information for a completion result.
/// This delegate is used to map a string value to its corresponding display information.
/// </summary>
/// <param name="value">The input value to be mapped</param>
/// <returns>Completion display info containing tool tip and list item text.</returns>
internal delegate CompletionDisplayInfo CompletionDisplayInfoMapper(string value);

/// <summary>
/// Provides the default display information for a completion result.
/// Defaults to using the input value for both the tool tip and list item text.
/// </summary>
/// <returns>Completion display info containing tool tip and list item text.</returns>
internal static readonly CompletionDisplayInfoMapper DefaultDisplayInfoMapper = value
=> new CompletionDisplayInfo(value, value);

/// <summary>
/// Normalizes the input string to an expandable string format for PowerShell.
/// </summary>
Expand Down