Skip to content

Commit d49d8f4

Browse files
committed
Resurrect alias support for FindReferences
In ancient times, commit 633e36b implemented support for aliases when finding references. This was removed during the OmniSharp rewrite because it needed the pipeline thread, which was not yet available. With that work complete, this can now be resurrected.
1 parent e72a796 commit d49d8f4

File tree

3 files changed

+39
-25
lines changed

3 files changed

+39
-25
lines changed

src/PowerShellEditorServices/Services/Symbols/SymbolsService.cs

+38-4
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ internal class SymbolsService
3939

4040
private readonly ConcurrentDictionary<string, ICodeLensProvider> _codeLensProviders;
4141
private readonly ConcurrentDictionary<string, IDocumentSymbolProvider> _documentSymbolProviders;
42-
42+
private readonly Dictionary<String, List<String>> _cmdletToAliasDictionary;
43+
private readonly Dictionary<String, String> _aliasToCmdletDictionary;
4344
#endregion
4445

4546
#region Constructors
@@ -84,6 +85,10 @@ public SymbolsService(
8485
{
8586
_documentSymbolProviders.TryAdd(documentSymbolProvider.ProviderId, documentSymbolProvider);
8687
}
88+
89+
_cmdletToAliasDictionary = new Dictionary<String, List<String>>(StringComparer.OrdinalIgnoreCase);
90+
_aliasToCmdletDictionary = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
91+
GetAliases();
8792
}
8893

8994
#endregion
@@ -186,8 +191,6 @@ public List<SymbolReference> FindReferencesOfSymbol(
186191
return null;
187192
}
188193

189-
// NOTE: we use to make sure aliases were loaded but took it out because we needed the pipeline thread.
190-
191194
// We want to look for references first in referenced files, hence we use ordered dictionary
192195
// TODO: File system case-sensitivity is based on filesystem not OS, but OS is a much cheaper heuristic
193196
var fileMap = RuntimeInformation.IsOSPlatform(OSPlatform.Linux)
@@ -221,7 +224,8 @@ public List<SymbolReference> FindReferencesOfSymbol(
221224
IEnumerable<SymbolReference> references = AstOperations.FindReferencesOfSymbol(
222225
file.ScriptAst,
223226
foundSymbol,
224-
needsAliases: false);
227+
_cmdletToAliasDictionary,
228+
_aliasToCmdletDictionary);
225229

226230
foreach (SymbolReference reference in references)
227231
{
@@ -490,6 +494,36 @@ await CommandHelpers.GetCommandInfoAsync(
490494
return foundDefinition;
491495
}
492496

497+
/// <summary>
498+
/// Gets all aliases found in the runspace
499+
/// </summary>
500+
private async void GetAliases()
501+
{
502+
IEnumerable<CommandInfo> aliases = await _executionService.ExecuteDelegateAsync<IEnumerable<CommandInfo>>(
503+
nameof(GetAliases),
504+
PowerShell.Execution.ExecutionOptions.Default,
505+
(pwsh, _) =>
506+
{
507+
CommandInvocationIntrinsics invokeCommand = pwsh.Runspace.SessionStateProxy.InvokeCommand;
508+
return invokeCommand.GetCommands("*", CommandTypes.Alias, nameIsPattern: true);
509+
},
510+
System.Threading.CancellationToken.None).ConfigureAwait(false);
511+
512+
foreach (AliasInfo aliasInfo in aliases)
513+
{
514+
if (!_cmdletToAliasDictionary.ContainsKey(aliasInfo.Definition))
515+
{
516+
_cmdletToAliasDictionary.Add(aliasInfo.Definition, new List<String>() { aliasInfo.Name });
517+
}
518+
else
519+
{
520+
_cmdletToAliasDictionary[aliasInfo.Definition].Add(aliasInfo.Name);
521+
}
522+
523+
_aliasToCmdletDictionary.Add(aliasInfo.Name, aliasInfo.Definition);
524+
}
525+
}
526+
493527
/// <summary>
494528
/// Gets a path from a dot-source symbol.
495529
/// </summary>

test/PowerShellEditorServices.Test.Shared/References/FindsReferencesOnBuiltInCommandWithAlias.cs

-12
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,4 @@ public static class FindsReferencesOnBuiltInCommandWithAliasData
1717
endColumnNumber: 0,
1818
endOffset: 0);
1919
}
20-
public static class FindsReferencesOnBuiltInAliasData
21-
{
22-
public static readonly ScriptRegion SourceDetails = new(
23-
file: TestUtilities.NormalizePath("References/SimpleFile.ps1"),
24-
text: string.Empty,
25-
startLineNumber: 15,
26-
startColumnNumber: 2,
27-
startOffset: 0,
28-
endLineNumber: 0,
29-
endColumnNumber: 0,
30-
endOffset: 0);
31-
}
3220
}

test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs

+1-9
Original file line numberDiff line numberDiff line change
@@ -203,20 +203,12 @@ public void FindsOccurrencesOnParameter()
203203
Assert.Equal(3, occurrencesResult[occurrencesResult.Count - 1].ScriptRegion.StartLineNumber);
204204
}
205205

206-
[Fact(Skip = "TODO Fix this test. A possible bug in PSES product code.")]
206+
[Fact]
207207
public void FindsReferencesOnCommandWithAlias()
208208
{
209209
List<SymbolReference> referencesResult = GetReferences(FindsReferencesOnBuiltInCommandWithAliasData.SourceDetails);
210210
Assert.Equal(4, referencesResult.Count);
211211
Assert.Equal("gci", referencesResult[1].SymbolName);
212-
Assert.Equal("Get-ChildItem", referencesResult[referencesResult.Count - 1].SymbolName);
213-
}
214-
215-
[Fact(Skip = "TODO Fix this test. A possible bug in PSES product code.")]
216-
public void FindsReferencesOnAlias()
217-
{
218-
List<SymbolReference> referencesResult = GetReferences(FindsReferencesOnBuiltInCommandWithAliasData.SourceDetails);
219-
Assert.Equal(4, referencesResult.Count);
220212
Assert.Equal("dir", referencesResult[2].SymbolName);
221213
Assert.Equal("Get-ChildItem", referencesResult[referencesResult.Count - 1].SymbolName);
222214
}

0 commit comments

Comments
 (0)