diff --git a/src/PowerShellEditorServices/Services/Symbols/Visitors/SymbolVisitor.cs b/src/PowerShellEditorServices/Services/Symbols/Visitors/SymbolVisitor.cs index 08ab7db95..fda5a53dc 100644 --- a/src/PowerShellEditorServices/Services/Symbols/Visitors/SymbolVisitor.cs +++ b/src/PowerShellEditorServices/Services/Symbols/Visitors/SymbolVisitor.cs @@ -95,6 +95,21 @@ public override AstVisitAction VisitVariableExpression(VariableExpressionAst var return AstVisitAction.Continue; } + // Count $Function:MyFunction as function references. + if (variableExpressionAst.VariablePath.IsDriveQualified + && variableExpressionAst.VariablePath.DriveName.Equals("Function", StringComparison.OrdinalIgnoreCase)) + { + return _action(new SymbolReference( + SymbolType.Function, + "fn " + VisitorUtils.GetUnqualifiedVariableName(variableExpressionAst.VariablePath), + "$" + variableExpressionAst.VariablePath.UserPath, + variableExpressionAst.Extent, + variableExpressionAst.Extent, + _file, + false + )); + } + // TODO: Consider tracking unscoped variable references only when they're declared within // the same function definition. return _action(new SymbolReference( diff --git a/test/PowerShellEditorServices.Test.Shared/References/SimpleFile.ps1 b/test/PowerShellEditorServices.Test.Shared/References/SimpleFile.ps1 index 64f3d0f43..b5c1ef7ce 100644 --- a/test/PowerShellEditorServices.Test.Shared/References/SimpleFile.ps1 +++ b/test/PowerShellEditorServices.Test.Shared/References/SimpleFile.ps1 @@ -18,3 +18,5 @@ Write-Host Get-ChildItem My-Alias + +Invoke-Command -ScriptBlock ${Function:My-Function} diff --git a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs index 257e36880..3b69e07c7 100644 --- a/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs +++ b/test/PowerShellEditorServices.Test/Language/SymbolsServiceTests.cs @@ -223,6 +223,13 @@ public async Task FindsReferencesOnFunction() Assert.Equal("My-Function", i.Name); Assert.Equal(SymbolType.Function, i.Type); Assert.False(i.IsDeclaration); + }, + (i) => + { + Assert.Equal("fn My-Function", i.Id); + Assert.Equal("$Function:My-Function", i.Name); + Assert.Equal(SymbolType.Function, i.Type); + Assert.False(i.IsDeclaration); }); } @@ -246,7 +253,8 @@ await psesHost.ExecutePSCommandAsync( { AssertIsRegion(i.NameRegion, 20, 1, 20, 9); Assert.Equal("fn My-Alias", i.Id); - }); + }, + (i) => AssertIsRegion(i.NameRegion, 22, 29, 22, 52)); } [Fact] @@ -324,6 +332,13 @@ public void FindsOccurrencesOnFunction() Assert.Equal("fn My-Function", i.Id); Assert.Equal(SymbolType.Function, i.Type); Assert.False(i.IsDeclaration); + }, + (i) => + { + Assert.Equal("fn My-Function", i.Id); + Assert.Equal("$Function:My-Function", i.Name); + Assert.Equal(SymbolType.Function, i.Type); + Assert.False(i.IsDeclaration); }); }