Skip to content

Commit 5cf832f

Browse files
committed
Updating to fix AstVisitor2 issue
1 parent a37888b commit 5cf832f

File tree

7 files changed

+97
-38
lines changed

7 files changed

+97
-38
lines changed

src/PowerShellEditorServices/Language/AstOperations.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,22 @@ static public SymbolReference FindDefinitionOfSymbol(
176176
/// Finds all symbols in a script
177177
/// </summary>
178178
/// <param name="scriptAst">The abstract syntax tree of the given script</param>
179+
/// <param name="powerShellVersion">The PowerShell version the Ast was generated from</param>
179180
/// <returns>A collection of SymbolReference objects</returns>
180-
static public IEnumerable<SymbolReference> FindSymbolsInDocument(Ast scriptAst)
181+
static public IEnumerable<SymbolReference> FindSymbolsInDocument(Ast scriptAst, Version powerShellVersion)
181182
{
182-
FindSymbolsVisitor findSymbolsVisitor = new FindSymbolsVisitor();
183-
scriptAst.Visit(findSymbolsVisitor);
184-
185-
return findSymbolsVisitor.SymbolReferences;
183+
if (powerShellVersion >= new Version(5,0))
184+
{
185+
FindSymbolsVisitor2 findSymbolsVisitor = new FindSymbolsVisitor2();
186+
scriptAst.Visit(findSymbolsVisitor);
187+
return findSymbolsVisitor.SymbolReferences;
188+
}
189+
else
190+
{
191+
FindSymbolsVisitor findSymbolsVisitor = new FindSymbolsVisitor();
192+
scriptAst.Visit(findSymbolsVisitor);
193+
return findSymbolsVisitor.SymbolReferences;
194+
}
186195
}
187196

188197
/// <summary>

src/PowerShellEditorServices/Language/FindSymbolVisitor.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,7 @@ namespace Microsoft.PowerShell.EditorServices
1010
/// <summary>
1111
/// The visitor used to find the the symbol at a specfic location in the AST
1212
/// </summary>
13-
#if PowerShellv5
14-
internal class FindSymbolVisitor : AstVisitor2
15-
#else
1613
internal class FindSymbolVisitor : AstVisitor
17-
#endif
1814
{
1915
private int lineNumber;
2016
private int columnNumber;

src/PowerShellEditorServices/Language/FindSymbolsVisitor.cs

Lines changed: 4 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@ namespace Microsoft.PowerShell.EditorServices
1111
/// <summary>
1212
/// The visitor used to find all the symbols (function and class defs) in the AST.
1313
/// </summary>
14-
#if PowerShellv5
15-
internal class FindSymbolsVisitor : AstVisitor2
16-
#else
14+
/// <remarks>
15+
/// Requires PowerShell v3 or higher
16+
/// </remarks>
1717
internal class FindSymbolsVisitor : AstVisitor
18-
#endif
1918
{
2019
public List<SymbolReference> SymbolReferences { get; private set; }
2120

@@ -72,29 +71,7 @@ public override AstVisitAction VisitVariableExpression(VariableExpressionAst var
7271

7372
return AstVisitAction.Continue;
7473
}
75-
76-
#if PowerShell5
77-
public override AstVisitAction VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst)
78-
{
79-
IScriptExtent nameExtent = new ScriptExtent()
80-
{
81-
Text = configurationDefinitionAst.InstanceName.Extent.Text,
82-
StartLineNumber = configurationDefinitionAst.Extent.StartLineNumber,
83-
EndLineNumber = configurationDefinitionAst.Extent.EndLineNumber,
84-
StartColumnNumber = configurationDefinitionAst.Extent.StartColumnNumber,
85-
EndColumnNumber = configurationDefinitionAst.Extent.EndColumnNumber
86-
};
87-
88-
this.SymbolReferences.Add(
89-
new SymbolReference(
90-
SymbolType.Configuration,
91-
nameExtent));
92-
93-
return AstVisitAction.Continue;
94-
}
95-
#endif
96-
97-
74+
9875
private bool IsAssignedAtScriptScope(VariableExpressionAst variableExpressionAst)
9976
{
10077
Ast parent = variableExpressionAst.Parent;
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using System.Collections.Generic;
2+
using System.Management.Automation.Language;
3+
4+
namespace Microsoft.PowerShell.EditorServices
5+
{
6+
/// <summary>
7+
/// The visitor used to find all the symbols (function and class defs) in the AST.
8+
/// </summary>
9+
/// <remarks>
10+
/// Requires PowerShell v5 or higher
11+
/// </remarks>
12+
internal class FindSymbolsVisitor2 : AstVisitor2
13+
{
14+
private FindSymbolsVisitor findSymbolsVisitor;
15+
16+
public List<SymbolReference> SymbolReferences
17+
{
18+
get
19+
{
20+
return this.findSymbolsVisitor.SymbolReferences;
21+
}
22+
}
23+
24+
public FindSymbolsVisitor2()
25+
{
26+
this.findSymbolsVisitor = new FindSymbolsVisitor();
27+
}
28+
29+
/// <summary>
30+
/// Adds each function defintion as a
31+
/// </summary>
32+
/// <param name="functionDefinitionAst">A functionDefinitionAst object in the script's AST</param>
33+
/// <returns>A decision to stop searching if the right symbol was found,
34+
/// or a decision to continue if it wasn't found</returns>
35+
public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
36+
{
37+
return this.findSymbolsVisitor.VisitFunctionDefinition(functionDefinitionAst);
38+
}
39+
40+
/// <summary>
41+
/// Checks to see if this variable expression is the symbol we are looking for.
42+
/// </summary>
43+
/// <param name="variableExpressionAst">A VariableExpressionAst object in the script's AST</param>
44+
/// <returns>A descion to stop searching if the right symbol was found,
45+
/// or a decision to continue if it wasn't found</returns
46+
public override AstVisitAction VisitVariableExpression(VariableExpressionAst variableExpressionAst)
47+
{
48+
return this.findSymbolsVisitor.VisitVariableExpression(variableExpressionAst);
49+
}
50+
51+
public override AstVisitAction VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst)
52+
{
53+
IScriptExtent nameExtent = new ScriptExtent()
54+
{
55+
Text = configurationDefinitionAst.InstanceName.Extent.Text,
56+
StartLineNumber = configurationDefinitionAst.Extent.StartLineNumber,
57+
EndLineNumber = configurationDefinitionAst.Extent.EndLineNumber,
58+
StartColumnNumber = configurationDefinitionAst.Extent.StartColumnNumber,
59+
EndColumnNumber = configurationDefinitionAst.Extent.EndColumnNumber
60+
};
61+
62+
this.findSymbolsVisitor.SymbolReferences.Add(
63+
new SymbolReference(
64+
SymbolType.Configuration,
65+
nameExtent));
66+
67+
return AstVisitAction.Continue;
68+
}
69+
}
70+
}

src/PowerShellEditorServices/Language/LanguageService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public FindOccurrencesResult FindSymbolsInFile(ScriptFile scriptFile)
221221

222222
IEnumerable<SymbolReference> symbolReferencesinFile =
223223
AstOperations
224-
.FindSymbolsInDocument(scriptFile.ScriptAst)
224+
.FindSymbolsInDocument(scriptFile.ScriptAst, this.powerShellContext.PowerShellVersion)
225225
.Select(
226226
reference => {
227227
reference.SourceLine =

src/PowerShellEditorServices/PowerShellEditorServices.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
</Reference>
5353
<Reference Include="System" />
5454
<Reference Include="System.Core" />
55-
<Reference Include="System.Management.Automation"/>
55+
<Reference Include="System.Management.Automation" />
5656
<Reference Include="System.Xml.Linq" />
5757
<Reference Include="System.Data.DataSetExtensions" />
5858
<Reference Include="Microsoft.CSharp" />
@@ -79,6 +79,7 @@
7979
<Compile Include="Language\FindReferencesResult.cs" />
8080
<Compile Include="Language\FindReferencesVisitor.cs" />
8181
<Compile Include="Language\FindSymbolsVisitor.cs" />
82+
<Compile Include="Language\FindSymbolsVisitor2.cs" />
8283
<Compile Include="Language\FindSymbolVisitor.cs" />
8384
<Compile Include="Language\GetDefinitionResult.cs" />
8485
<Compile Include="Language\LanguageService.cs" />

test/PowerShellEditorServices.Test/Language/LanguageServiceTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@ public void LanguageServiceFindsSymbolsInFile()
266266
Assert.Equal(4, symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Function).Count());
267267
Assert.Equal(3, symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Variable).Count());
268268
Assert.Equal(1, symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Workflow).Count());
269+
Assert.Equal(1, symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Configuration).Count());
269270

270271
SymbolReference firstFunctionSymbol = symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Function).First();
271272
Assert.Equal("AFunction", firstFunctionSymbol.SymbolName);
@@ -281,6 +282,11 @@ public void LanguageServiceFindsSymbolsInFile()
281282
Assert.Equal("AWorkflow", firstWorkflowSymbol.SymbolName);
282283
Assert.Equal(23, firstWorkflowSymbol.ScriptRegion.StartLineNumber);
283284
Assert.Equal(1, firstWorkflowSymbol.ScriptRegion.StartColumnNumber);
285+
286+
SymbolReference firstConfigurationSymbol = symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Configuration).First();
287+
Assert.Equal("AConfiguration", firstConfigurationSymbol.SymbolName);
288+
Assert.Equal(25, firstConfigurationSymbol.ScriptRegion.StartLineNumber);
289+
Assert.Equal(1, firstConfigurationSymbol.ScriptRegion.StartColumnNumber);
284290
}
285291

286292
[Fact]

0 commit comments

Comments
 (0)