diff --git a/src/PowerShellEditorServices/Services/Symbols/Visitors/SymbolVisitor.cs b/src/PowerShellEditorServices/Services/Symbols/Visitors/SymbolVisitor.cs index 1035f2557..08ab7db95 100644 --- a/src/PowerShellEditorServices/Services/Symbols/Visitors/SymbolVisitor.cs +++ b/src/PowerShellEditorServices/Services/Symbols/Visitors/SymbolVisitor.cs @@ -40,7 +40,7 @@ public override AstVisitAction VisitCommand(CommandAst commandAst) return _action(new SymbolReference( SymbolType.Function, - "fn " + CommandHelpers.StripModuleQualification(commandName, out _), + "fn " + VisitorUtils.GetUnqualifiedFunctionName(CommandHelpers.StripModuleQualification(commandName, out _)), commandName, commandAst.CommandElements[0].Extent, commandAst.Extent, @@ -64,7 +64,7 @@ public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst fun IScriptExtent nameExtent = VisitorUtils.GetNameExtent(functionDefinitionAst); return _action(new SymbolReference( symbolType, - "fn " + functionDefinitionAst.Name, + "fn " + VisitorUtils.GetUnqualifiedFunctionName(functionDefinitionAst.Name), VisitorUtils.GetFunctionDisplayName(functionDefinitionAst), nameExtent, functionDefinitionAst.Extent, diff --git a/src/PowerShellEditorServices/Utility/VisitorUtils.cs b/src/PowerShellEditorServices/Utility/VisitorUtils.cs index fbfdd1413..a35f402bf 100644 --- a/src/PowerShellEditorServices/Utility/VisitorUtils.cs +++ b/src/PowerShellEditorServices/Utility/VisitorUtils.cs @@ -33,6 +33,20 @@ internal static class VisitorUtils return PSESSymbols.AstOperations.TryGetInferredValue(expandableStringExpressionAst, out string value) ? value : null; } + // Strip the qualification, if there is any, so script:my-function is a reference of my-function etc. + internal static string GetUnqualifiedFunctionName(string name) + { + foreach (string scope in new string[] { "private:", "script:", "global:", "local:" }) + { + if (name.StartsWith(scope, StringComparison.OrdinalIgnoreCase)) + { + return name.Substring(scope.Length); + } + } + + return name; + } + // Strip the qualification, if there is any, so $var is a reference of $script:var etc. internal static string GetUnqualifiedVariableName(VariablePath variablePath) { diff --git a/test/PowerShellEditorServices.Test.Shared/Symbols/MultipleSymbols.ps1 b/test/PowerShellEditorServices.Test.Shared/Symbols/MultipleSymbols.ps1 index db53a6c1a..b4f54c329 100644 --- a/test/PowerShellEditorServices.Test.Shared/Symbols/MultipleSymbols.ps1 +++ b/test/PowerShellEditorServices.Test.Shared/Symbols/MultipleSymbols.ps1 @@ -4,7 +4,7 @@ $Script:ScriptVar2 = 2 "`$Script:ScriptVar2 is $Script:ScriptVar2" -function AFunction {} +function script:AFunction {} filter AFilter {$_} diff --git a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs index 0a066583c..257e36880 100644 --- a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs @@ -738,8 +738,9 @@ public void FindsSymbolsInFile() SymbolReference symbol = symbols.First(i => i.Type == SymbolType.Function); Assert.Equal("fn AFunction", symbol.Id); - Assert.Equal("function AFunction ()", symbol.Name); + Assert.Equal("function script:AFunction ()", symbol.Name); Assert.True(symbol.IsDeclaration); + Assert.Equal(2, GetOccurrences(symbol.NameRegion).Count()); symbol = symbols.First(i => i.Id == "fn AFilter"); Assert.Equal("filter AFilter ()", symbol.Name);