Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Updating to fix AstVisitor2 issue
  • Loading branch information
adamdriscoll committed Jan 4, 2016
commit 5cf832fb056d5877e2dcfa2d3e42da6b88d74227
19 changes: 14 additions & 5 deletions src/PowerShellEditorServices/Language/AstOperations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -176,13 +176,22 @@ static public SymbolReference FindDefinitionOfSymbol(
/// Finds all symbols in a script
/// </summary>
/// <param name="scriptAst">The abstract syntax tree of the given script</param>
/// <param name="powerShellVersion">The PowerShell version the Ast was generated from</param>
/// <returns>A collection of SymbolReference objects</returns>
static public IEnumerable<SymbolReference> FindSymbolsInDocument(Ast scriptAst)
static public IEnumerable<SymbolReference> FindSymbolsInDocument(Ast scriptAst, Version powerShellVersion)
{
FindSymbolsVisitor findSymbolsVisitor = new FindSymbolsVisitor();
scriptAst.Visit(findSymbolsVisitor);

return findSymbolsVisitor.SymbolReferences;
if (powerShellVersion >= new Version(5,0))
{
FindSymbolsVisitor2 findSymbolsVisitor = new FindSymbolsVisitor2();
scriptAst.Visit(findSymbolsVisitor);
return findSymbolsVisitor.SymbolReferences;
}
else
{
FindSymbolsVisitor findSymbolsVisitor = new FindSymbolsVisitor();
scriptAst.Visit(findSymbolsVisitor);
return findSymbolsVisitor.SymbolReferences;
}
}

/// <summary>
Expand Down
4 changes: 0 additions & 4 deletions src/PowerShellEditorServices/Language/FindSymbolVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,7 @@ namespace Microsoft.PowerShell.EditorServices
/// <summary>
/// The visitor used to find the the symbol at a specfic location in the AST
/// </summary>
#if PowerShellv5
internal class FindSymbolVisitor : AstVisitor2
#else
internal class FindSymbolVisitor : AstVisitor
#endif
{
private int lineNumber;
private int columnNumber;
Expand Down
31 changes: 4 additions & 27 deletions src/PowerShellEditorServices/Language/FindSymbolsVisitor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,10 @@ namespace Microsoft.PowerShell.EditorServices
/// <summary>
/// The visitor used to find all the symbols (function and class defs) in the AST.
/// </summary>
#if PowerShellv5
internal class FindSymbolsVisitor : AstVisitor2
#else
/// <remarks>
/// Requires PowerShell v3 or higher
/// </remarks>
internal class FindSymbolsVisitor : AstVisitor
#endif
{
public List<SymbolReference> SymbolReferences { get; private set; }

Expand Down Expand Up @@ -72,29 +71,7 @@ public override AstVisitAction VisitVariableExpression(VariableExpressionAst var

return AstVisitAction.Continue;
}

#if PowerShell5
public override AstVisitAction VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst)
{
IScriptExtent nameExtent = new ScriptExtent()
{
Text = configurationDefinitionAst.InstanceName.Extent.Text,
StartLineNumber = configurationDefinitionAst.Extent.StartLineNumber,
EndLineNumber = configurationDefinitionAst.Extent.EndLineNumber,
StartColumnNumber = configurationDefinitionAst.Extent.StartColumnNumber,
EndColumnNumber = configurationDefinitionAst.Extent.EndColumnNumber
};

this.SymbolReferences.Add(
new SymbolReference(
SymbolType.Configuration,
nameExtent));

return AstVisitAction.Continue;
}
#endif



private bool IsAssignedAtScriptScope(VariableExpressionAst variableExpressionAst)
{
Ast parent = variableExpressionAst.Parent;
Expand Down
70 changes: 70 additions & 0 deletions src/PowerShellEditorServices/Language/FindSymbolsVisitor2.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
using System.Collections.Generic;
using System.Management.Automation.Language;

namespace Microsoft.PowerShell.EditorServices
{
/// <summary>
/// The visitor used to find all the symbols (function and class defs) in the AST.
/// </summary>
/// <remarks>
/// Requires PowerShell v5 or higher
/// </remarks>
internal class FindSymbolsVisitor2 : AstVisitor2
{
private FindSymbolsVisitor findSymbolsVisitor;

public List<SymbolReference> SymbolReferences
{
get
{
return this.findSymbolsVisitor.SymbolReferences;
}
}

public FindSymbolsVisitor2()
{
this.findSymbolsVisitor = new FindSymbolsVisitor();
}

/// <summary>
/// Adds each function defintion as a
/// </summary>
/// <param name="functionDefinitionAst">A functionDefinitionAst object in the script's AST</param>
/// <returns>A decision to stop searching if the right symbol was found,
/// or a decision to continue if it wasn't found</returns>
public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
{
return this.findSymbolsVisitor.VisitFunctionDefinition(functionDefinitionAst);
}

/// <summary>
/// Checks to see if this variable expression is the symbol we are looking for.
/// </summary>
/// <param name="variableExpressionAst">A VariableExpressionAst object in the script's AST</param>
/// <returns>A descion to stop searching if the right symbol was found,
/// or a decision to continue if it wasn't found</returns
public override AstVisitAction VisitVariableExpression(VariableExpressionAst variableExpressionAst)
{
return this.findSymbolsVisitor.VisitVariableExpression(variableExpressionAst);
}

public override AstVisitAction VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst)
{
IScriptExtent nameExtent = new ScriptExtent()
{
Text = configurationDefinitionAst.InstanceName.Extent.Text,
StartLineNumber = configurationDefinitionAst.Extent.StartLineNumber,
EndLineNumber = configurationDefinitionAst.Extent.EndLineNumber,
StartColumnNumber = configurationDefinitionAst.Extent.StartColumnNumber,
EndColumnNumber = configurationDefinitionAst.Extent.EndColumnNumber
};

this.findSymbolsVisitor.SymbolReferences.Add(
new SymbolReference(
SymbolType.Configuration,
nameExtent));

return AstVisitAction.Continue;
}
}
}
2 changes: 1 addition & 1 deletion src/PowerShellEditorServices/Language/LanguageService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ public FindOccurrencesResult FindSymbolsInFile(ScriptFile scriptFile)

IEnumerable<SymbolReference> symbolReferencesinFile =
AstOperations
.FindSymbolsInDocument(scriptFile.ScriptAst)
.FindSymbolsInDocument(scriptFile.ScriptAst, this.powerShellContext.PowerShellVersion)
.Select(
reference => {
reference.SourceLine =
Expand Down
3 changes: 2 additions & 1 deletion src/PowerShellEditorServices/PowerShellEditorServices.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Management.Automation"/>
<Reference Include="System.Management.Automation" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
Expand All @@ -79,6 +79,7 @@
<Compile Include="Language\FindReferencesResult.cs" />
<Compile Include="Language\FindReferencesVisitor.cs" />
<Compile Include="Language\FindSymbolsVisitor.cs" />
<Compile Include="Language\FindSymbolsVisitor2.cs" />
<Compile Include="Language\FindSymbolVisitor.cs" />
<Compile Include="Language\GetDefinitionResult.cs" />
<Compile Include="Language\LanguageService.cs" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,7 @@ public void LanguageServiceFindsSymbolsInFile()
Assert.Equal(4, symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Function).Count());
Assert.Equal(3, symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Variable).Count());
Assert.Equal(1, symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Workflow).Count());
Assert.Equal(1, symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Configuration).Count());

SymbolReference firstFunctionSymbol = symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Function).First();
Assert.Equal("AFunction", firstFunctionSymbol.SymbolName);
Expand All @@ -281,6 +282,11 @@ public void LanguageServiceFindsSymbolsInFile()
Assert.Equal("AWorkflow", firstWorkflowSymbol.SymbolName);
Assert.Equal(23, firstWorkflowSymbol.ScriptRegion.StartLineNumber);
Assert.Equal(1, firstWorkflowSymbol.ScriptRegion.StartColumnNumber);

SymbolReference firstConfigurationSymbol = symbolsResult.FoundOccurrences.Where(r => r.SymbolType == SymbolType.Configuration).First();
Assert.Equal("AConfiguration", firstConfigurationSymbol.SymbolName);
Assert.Equal(25, firstConfigurationSymbol.ScriptRegion.StartLineNumber);
Assert.Equal(1, firstConfigurationSymbol.ScriptRegion.StartColumnNumber);
}

[Fact]
Expand Down