From 319d5b9f20bf3fb75c4c7e0143cad50f0519398b Mon Sep 17 00:00:00 2001 From: MartinGC94 Date: Sun, 11 May 2025 12:51:37 +0200 Subject: [PATCH 1/3] Remove duplicate modules from completion results --- .../CommandCompletion/CompletionCompleters.cs | 8 +++- .../TabCompletion/TabCompletion.Tests.ps1 | 39 ++++++++++++++++--- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs index b5d3eb0cb42..5fde5060cbb 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs @@ -499,11 +499,16 @@ internal static List CompleteModuleName(CompletionContext cont nestedModulesToFilterOut = new(currentModule.NestedModules); } + var completedModules = new HashSet(StringComparer.OrdinalIgnoreCase); foreach (PSObject item in psObjects) { var moduleInfo = (PSModuleInfo)item.BaseObject; var completionText = moduleInfo.Name; - var listItemText = completionText; + if (!completedModules.Add(completionText)) + { + continue; + } + if (shortNameSearch && completionText.Contains('.') && !shortNamePattern.IsMatch(completionText.Substring(completionText.LastIndexOf('.') + 1)) @@ -524,6 +529,7 @@ internal static List CompleteModuleName(CompletionContext cont + moduleInfo.ModuleType.ToString() + "\r\nPath: " + moduleInfo.Path; + string listItemText = completionText; completionText = CompletionHelpers.QuoteCompletionText(completionText, quote); result.Add(new CompletionResult(completionText, listItemText, CompletionResultType.ParameterValue, toolTip)); diff --git a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 index f30e54438b6..901b0d12e2e 100644 --- a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 +++ b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 @@ -36,13 +36,13 @@ Describe "TabCompletion" -Tags CI { It 'Should not include duplicate command results' { $OldModulePath = $env:PSModulePath $tempDir = Join-Path -Path $TestDrive -ChildPath "TempPsModuleDir" + $ModuleDirs = @( + Join-Path $tempDir "TestModule1\1.0" + Join-Path $tempDir "TestModule1\1.1" + Join-Path $tempDir "TestModule2\1.0" + ) try { - $ModuleDirs = @( - Join-Path $tempDir "TestModule1\1.0" - Join-Path $tempDir "TestModule1\1.1" - Join-Path $tempDir "TestModule2\1.0" - ) foreach ($Dir in $ModuleDirs) { $NewDir = New-Item -Path $Dir -ItemType Directory -Force @@ -61,9 +61,38 @@ Describe "TabCompletion" -Tags CI { finally { $env:PSModulePath = $OldModulePath + Remove-Item -LiteralPath $ModuleDirs -Recurse -Force } } + It 'Should not include duplicate module results' { + $OldModulePath = $env:PSModulePath + $tempDir = Join-Path -Path $TestDrive -ChildPath "TempPsModuleDir" + try + { + $ModuleDirs = @( + Join-Path $tempDir "TestModule1\1.0" + Join-Path $tempDir "TestModule1\1.1" + ) + foreach ($Dir in $ModuleDirs) + { + $NewDir = New-Item -Path $Dir -ItemType Directory -Force + $ModuleName = $NewDir.Parent.Name + Set-Content -Value 'MyTestFunction{}' -LiteralPath "$($NewDir.FullName)\$ModuleName.psm1" + New-ModuleManifest -Path "$($NewDir.FullName)\$ModuleName.psd1" -RootModule "$ModuleName.psm1" -FunctionsToExport "MyTestFunction" -ModuleVersion $NewDir.Name + } + + $env:PSModulePath += [System.IO.Path]::PathSeparator + $tempDir + $Res = TabExpansion2 -inputScript 'Import-Module -Name TestModule' + $Res.CompletionMatches.Count | Should -Be 1 + $Res.CompletionMatches[0].CompletionText | Should -Be TestModule1 + } + finally + { + $env:PSModulePath = $OldModulePath + Remove-Item -LiteralPath $ModuleDirs -Recurse -Force + } + It 'Should complete dotnet method' { $res = TabExpansion2 -inputScript '(1).ToSt' -cursorColumn '(1).ToSt'.Length $res.CompletionMatches[0].CompletionText | Should -BeExactly 'ToString(' From ee3d8cea22305bb0bef8458857c7afcbb1e5453c Mon Sep 17 00:00:00 2001 From: MartinGC94 Date: Sun, 11 May 2025 15:55:46 +0200 Subject: [PATCH 2/3] Apply suggestion --- .../engine/CommandCompletion/CompletionCompleters.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs index 5fde5060cbb..8a010379110 100644 --- a/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs +++ b/src/System.Management.Automation/engine/CommandCompletion/CompletionCompleters.cs @@ -529,10 +529,9 @@ internal static List CompleteModuleName(CompletionContext cont + moduleInfo.ModuleType.ToString() + "\r\nPath: " + moduleInfo.Path; - string listItemText = completionText; completionText = CompletionHelpers.QuoteCompletionText(completionText, quote); - result.Add(new CompletionResult(completionText, listItemText, CompletionResultType.ParameterValue, toolTip)); + result.Add(new CompletionResult(completionText, listItemText: moduleInfo.Name, CompletionResultType.ParameterValue, toolTip)); } } From 5882ffa0c8bd3c91848921a529aaa0878716a4bd Mon Sep 17 00:00:00 2001 From: MartinGC94 <42123497+MartinGC94@users.noreply.github.com> Date: Sun, 11 May 2025 20:02:53 +0200 Subject: [PATCH 3/3] Add missing brace --- test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 index 901b0d12e2e..e088d368011 100644 --- a/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 +++ b/test/powershell/Host/TabCompletion/TabCompletion.Tests.ps1 @@ -92,6 +92,7 @@ Describe "TabCompletion" -Tags CI { $env:PSModulePath = $OldModulePath Remove-Item -LiteralPath $ModuleDirs -Recurse -Force } + } It 'Should complete dotnet method' { $res = TabExpansion2 -inputScript '(1).ToSt' -cursorColumn '(1).ToSt'.Length