Skip to content

Commit 422e2cd

Browse files
Strip scope from function references (#1990)
Like methods we just bucket them as overloads, which means that it works better than before despite not being perfect.
1 parent 9ee381f commit 422e2cd

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

src/PowerShellEditorServices/Services/Symbols/Visitors/SymbolVisitor.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public override AstVisitAction VisitCommand(CommandAst commandAst)
4040

4141
return _action(new SymbolReference(
4242
SymbolType.Function,
43-
"fn " + CommandHelpers.StripModuleQualification(commandName, out _),
43+
"fn " + VisitorUtils.GetUnqualifiedFunctionName(CommandHelpers.StripModuleQualification(commandName, out _)),
4444
commandName,
4545
commandAst.CommandElements[0].Extent,
4646
commandAst.Extent,
@@ -64,7 +64,7 @@ public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst fun
6464
IScriptExtent nameExtent = VisitorUtils.GetNameExtent(functionDefinitionAst);
6565
return _action(new SymbolReference(
6666
symbolType,
67-
"fn " + functionDefinitionAst.Name,
67+
"fn " + VisitorUtils.GetUnqualifiedFunctionName(functionDefinitionAst.Name),
6868
VisitorUtils.GetFunctionDisplayName(functionDefinitionAst),
6969
nameExtent,
7070
functionDefinitionAst.Extent,

src/PowerShellEditorServices/Utility/VisitorUtils.cs

+14
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,20 @@ internal static class VisitorUtils
3333
return PSESSymbols.AstOperations.TryGetInferredValue(expandableStringExpressionAst, out string value) ? value : null;
3434
}
3535

36+
// Strip the qualification, if there is any, so script:my-function is a reference of my-function etc.
37+
internal static string GetUnqualifiedFunctionName(string name)
38+
{
39+
foreach (string scope in new string[] { "private:", "script:", "global:", "local:" })
40+
{
41+
if (name.StartsWith(scope, StringComparison.OrdinalIgnoreCase))
42+
{
43+
return name.Substring(scope.Length);
44+
}
45+
}
46+
47+
return name;
48+
}
49+
3650
// Strip the qualification, if there is any, so $var is a reference of $script:var etc.
3751
internal static string GetUnqualifiedVariableName(VariablePath variablePath)
3852
{

test/PowerShellEditorServices.Test.Shared/Symbols/MultipleSymbols.ps1

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ $Script:ScriptVar2 = 2
44

55
"`$Script:ScriptVar2 is $Script:ScriptVar2"
66

7-
function AFunction {}
7+
function script:AFunction {}
88

99
filter AFilter {$_}
1010

test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -738,8 +738,9 @@ public void FindsSymbolsInFile()
738738

739739
SymbolReference symbol = symbols.First(i => i.Type == SymbolType.Function);
740740
Assert.Equal("fn AFunction", symbol.Id);
741-
Assert.Equal("function AFunction ()", symbol.Name);
741+
Assert.Equal("function script:AFunction ()", symbol.Name);
742742
Assert.True(symbol.IsDeclaration);
743+
Assert.Equal(2, GetOccurrences(symbol.NameRegion).Count());
743744

744745
symbol = symbols.First(i => i.Id == "fn AFilter");
745746
Assert.Equal("filter AFilter ()", symbol.Name);

0 commit comments

Comments
 (0)