Skip to content

Commit 7ef643b

Browse files
committed
Fleshed out FindAstPositionVistor and fixed test
1 parent 759c712 commit 7ef643b

File tree

3 files changed

+373
-68
lines changed

3 files changed

+373
-68
lines changed

Engine/FindAstPositionVisitor.cs

Lines changed: 372 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,372 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System.Management.Automation.Language;
5+
6+
namespace Microsoft.Windows.PowerShell.ScriptAnalyzer
7+
{
8+
/// <summary>
9+
/// Provides an efficient way to find the position in the AST corresponding to a given script position.
10+
/// </summary>
11+
#if !(PSV3 || PSV4)
12+
public class FindAstPostitionVisitor : AstVisitor2
13+
#else
14+
public class FindAstPostitionVisitor : AstVisitor
15+
#endif
16+
{
17+
private IScriptPosition searchPosition;
18+
19+
/// <summary>
20+
/// Contains the position in the AST corresponding to the provided <see cref="IScriptPosition"/> upon completion of the <see cref="Ast.Visit(AstVisitor)"/> method.
21+
/// </summary>
22+
public Ast AstPosition { get; private set; }
23+
24+
/// <summary>
25+
/// Initializes a new instance of the <see cref="FindAstPostitionVisitor"/> class with the postition to search for.
26+
/// </summary>
27+
/// <param name="position">The script position to search for.</param>
28+
public FindAstPostitionVisitor(IScriptPosition position)
29+
{
30+
this.searchPosition = position;
31+
}
32+
33+
/// <summary>
34+
/// Traverses the AST based on offests to find the leaf node which contains the provided <see cref="IScriptPosition"/>.
35+
/// This method implements the entire functionality of this visitor. All <see cref="AstVisitor2"/> methods are overridden to simply invoke this one.
36+
/// </summary>
37+
/// <param name="ast">Current AST node to process.</param>
38+
/// <returns>An <see cref="AstVisitAction"/> indicating whether to visit children of the current node.</returns>
39+
private AstVisitAction Visit(Ast ast)
40+
{
41+
if (ast.Extent.StartOffset > searchPosition.Offset || ast.Extent.EndOffset < searchPosition.Offset)
42+
{
43+
return AstVisitAction.SkipChildren;
44+
}
45+
else
46+
{
47+
AstPosition = ast;
48+
return AstVisitAction.Continue;
49+
}
50+
}
51+
52+
public override AstVisitAction VisitArrayExpression(ArrayExpressionAst arrayExpressionAst)
53+
{
54+
return Visit(arrayExpressionAst);
55+
}
56+
57+
public override AstVisitAction VisitArrayLiteral(ArrayLiteralAst arrayLiteralAst)
58+
{
59+
return Visit(arrayLiteralAst);
60+
}
61+
62+
public override AstVisitAction VisitAssignmentStatement(AssignmentStatementAst assignmentStatementAst)
63+
{
64+
return Visit(assignmentStatementAst);
65+
}
66+
67+
public override AstVisitAction VisitAttribute(AttributeAst attributeAst)
68+
{
69+
return Visit(attributeAst);
70+
}
71+
72+
public override AstVisitAction VisitAttributedExpression(AttributedExpressionAst attributedExpressionAst)
73+
{
74+
return Visit(attributedExpressionAst);
75+
}
76+
77+
public override AstVisitAction VisitBinaryExpression(BinaryExpressionAst binaryExpressionAst)
78+
{
79+
return Visit(binaryExpressionAst);
80+
}
81+
82+
public override AstVisitAction VisitBlockStatement(BlockStatementAst blockStatementAst)
83+
{
84+
return Visit(blockStatementAst);
85+
}
86+
87+
public override AstVisitAction VisitBreakStatement(BreakStatementAst breakStatementAst)
88+
{
89+
return Visit(breakStatementAst);
90+
}
91+
92+
public override AstVisitAction VisitCatchClause(CatchClauseAst catchClauseAst)
93+
{
94+
return Visit(catchClauseAst);
95+
}
96+
97+
public override AstVisitAction VisitCommand(CommandAst commandAst)
98+
{
99+
return Visit(commandAst);
100+
}
101+
102+
public override AstVisitAction VisitCommandExpression(CommandExpressionAst commandExpressionAst)
103+
{
104+
return Visit(commandExpressionAst);
105+
}
106+
107+
public override AstVisitAction VisitCommandParameter(CommandParameterAst commandParameterAst)
108+
{
109+
return Visit(commandParameterAst);
110+
}
111+
112+
public override AstVisitAction VisitConstantExpression(ConstantExpressionAst constantExpressionAst)
113+
{
114+
return Visit(constantExpressionAst);
115+
}
116+
117+
public override AstVisitAction VisitContinueStatement(ContinueStatementAst continueStatementAst)
118+
{
119+
return Visit(continueStatementAst);
120+
}
121+
122+
public override AstVisitAction VisitConvertExpression(ConvertExpressionAst convertExpressionAst)
123+
{
124+
return Visit(convertExpressionAst);
125+
}
126+
127+
public override AstVisitAction VisitDataStatement(DataStatementAst dataStatementAst)
128+
{
129+
return Visit(dataStatementAst);
130+
}
131+
132+
public override AstVisitAction VisitDoUntilStatement(DoUntilStatementAst doUntilStatementAst)
133+
{
134+
return Visit(doUntilStatementAst);
135+
}
136+
137+
public override AstVisitAction VisitDoWhileStatement(DoWhileStatementAst doWhileStatementAst)
138+
{
139+
return Visit(doWhileStatementAst);
140+
}
141+
142+
public override AstVisitAction VisitErrorExpression(ErrorExpressionAst errorExpressionAst)
143+
{
144+
return Visit(errorExpressionAst);
145+
}
146+
147+
public override AstVisitAction VisitErrorStatement(ErrorStatementAst errorStatementAst)
148+
{
149+
return Visit(errorStatementAst);
150+
}
151+
152+
public override AstVisitAction VisitExitStatement(ExitStatementAst exitStatementAst)
153+
{
154+
return Visit(exitStatementAst);
155+
}
156+
157+
public override AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst)
158+
{
159+
return Visit(expandableStringExpressionAst);
160+
}
161+
162+
public override AstVisitAction VisitFileRedirection(FileRedirectionAst fileRedirectionAst)
163+
{
164+
return Visit(fileRedirectionAst);
165+
}
166+
167+
public override AstVisitAction VisitForEachStatement(ForEachStatementAst forEachStatementAst)
168+
{
169+
return Visit(forEachStatementAst);
170+
}
171+
172+
public override AstVisitAction VisitForStatement(ForStatementAst forStatementAst)
173+
{
174+
return Visit(forStatementAst);
175+
}
176+
177+
public override AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst)
178+
{
179+
return Visit(functionDefinitionAst);
180+
}
181+
182+
public override AstVisitAction VisitHashtable(HashtableAst hashtableAst)
183+
{
184+
return Visit(hashtableAst);
185+
}
186+
187+
public override AstVisitAction VisitIfStatement(IfStatementAst ifStatementAst)
188+
{
189+
return Visit(ifStatementAst);
190+
}
191+
192+
public override AstVisitAction VisitIndexExpression(IndexExpressionAst indexExpressionAst)
193+
{
194+
return Visit(indexExpressionAst);
195+
}
196+
197+
public override AstVisitAction VisitInvokeMemberExpression(InvokeMemberExpressionAst invokeMemberExpressionAst)
198+
{
199+
return Visit(invokeMemberExpressionAst);
200+
}
201+
202+
public override AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst)
203+
{
204+
return Visit(memberExpressionAst);
205+
}
206+
207+
public override AstVisitAction VisitMergingRedirection(MergingRedirectionAst mergingRedirectionAst)
208+
{
209+
return Visit(mergingRedirectionAst);
210+
}
211+
212+
public override AstVisitAction VisitNamedAttributeArgument(NamedAttributeArgumentAst namedAttributeArgumentAst)
213+
{
214+
return Visit(namedAttributeArgumentAst);
215+
}
216+
217+
public override AstVisitAction VisitNamedBlock(NamedBlockAst namedBlockAst)
218+
{
219+
return Visit(namedBlockAst);
220+
}
221+
222+
public override AstVisitAction VisitParamBlock(ParamBlockAst paramBlockAst)
223+
{
224+
return Visit(paramBlockAst);
225+
}
226+
227+
public override AstVisitAction VisitParameter(ParameterAst parameterAst)
228+
{
229+
return Visit(parameterAst);
230+
}
231+
232+
public override AstVisitAction VisitParenExpression(ParenExpressionAst parenExpressionAst)
233+
{
234+
return Visit(parenExpressionAst);
235+
}
236+
237+
public override AstVisitAction VisitPipeline(PipelineAst pipelineAst)
238+
{
239+
return Visit(pipelineAst);
240+
}
241+
242+
public override AstVisitAction VisitReturnStatement(ReturnStatementAst returnStatementAst)
243+
{
244+
return Visit(returnStatementAst);
245+
}
246+
247+
public override AstVisitAction VisitScriptBlock(ScriptBlockAst scriptBlockAst)
248+
{
249+
return Visit(scriptBlockAst);
250+
}
251+
252+
public override AstVisitAction VisitScriptBlockExpression(ScriptBlockExpressionAst scriptBlockExpressionAst)
253+
{
254+
return Visit(scriptBlockExpressionAst);
255+
}
256+
257+
public override AstVisitAction VisitStatementBlock(StatementBlockAst statementBlockAst)
258+
{
259+
return Visit(statementBlockAst);
260+
}
261+
262+
public override AstVisitAction VisitStringConstantExpression(StringConstantExpressionAst stringConstantExpressionAst)
263+
{
264+
return Visit(stringConstantExpressionAst);
265+
}
266+
267+
public override AstVisitAction VisitSubExpression(SubExpressionAst subExpressionAst)
268+
{
269+
return Visit(subExpressionAst);
270+
}
271+
272+
public override AstVisitAction VisitSwitchStatement(SwitchStatementAst switchStatementAst)
273+
{
274+
return Visit(switchStatementAst);
275+
}
276+
277+
public override AstVisitAction VisitThrowStatement(ThrowStatementAst throwStatementAst)
278+
{
279+
return Visit(throwStatementAst);
280+
}
281+
282+
public override AstVisitAction VisitTrap(TrapStatementAst trapStatementAst)
283+
{
284+
return Visit(trapStatementAst);
285+
}
286+
287+
public override AstVisitAction VisitTryStatement(TryStatementAst tryStatementAst)
288+
{
289+
return Visit(tryStatementAst);
290+
}
291+
292+
public override AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst)
293+
{
294+
return Visit(typeConstraintAst);
295+
}
296+
297+
public override AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst)
298+
{
299+
return Visit(typeExpressionAst);
300+
}
301+
302+
public override AstVisitAction VisitUnaryExpression(UnaryExpressionAst unaryExpressionAst)
303+
{
304+
return Visit(unaryExpressionAst);
305+
}
306+
307+
public override AstVisitAction VisitUsingExpression(UsingExpressionAst usingExpressionAst)
308+
{
309+
return Visit(usingExpressionAst);
310+
}
311+
312+
public override AstVisitAction VisitVariableExpression(VariableExpressionAst variableExpressionAst)
313+
{
314+
return Visit(variableExpressionAst);
315+
}
316+
317+
public override AstVisitAction VisitWhileStatement(WhileStatementAst whileStatementAst)
318+
{
319+
return Visit(whileStatementAst);
320+
}
321+
322+
#if !(PSV3 || PSV4)
323+
public override AstVisitAction VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst)
324+
{
325+
return Visit(baseCtorInvokeMemberExpressionAst);
326+
}
327+
328+
public override AstVisitAction VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst)
329+
{
330+
return Visit(configurationDefinitionAst);
331+
}
332+
333+
public override AstVisitAction VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordStatementAst)
334+
{
335+
return Visit(dynamicKeywordStatementAst);
336+
}
337+
338+
public override AstVisitAction VisitFunctionMember(FunctionMemberAst functionMemberAst)
339+
{
340+
return Visit(functionMemberAst);
341+
}
342+
343+
public override AstVisitAction VisitPropertyMember(PropertyMemberAst propertyMemberAst)
344+
{
345+
return Visit(propertyMemberAst);
346+
}
347+
348+
public override AstVisitAction VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst)
349+
{
350+
return Visit(typeDefinitionAst);
351+
}
352+
353+
public override AstVisitAction VisitUsingStatement(UsingStatementAst usingStatementAst)
354+
{
355+
return Visit(usingStatementAst);
356+
}
357+
#endif
358+
359+
#if !(NET452 || PSV6) // NET452 includes V3,4,5
360+
public override AstVisitAction VisitPipelineChain(PipelineChainAst pipelineChainAst)
361+
{
362+
return Visit(pipelineChainAst);
363+
}
364+
365+
public override AstVisitAction VisitTernaryExpression(TernaryExpressionAst ternaryExpressionAst)
366+
{
367+
return Visit(ternaryExpressionAst);
368+
}
369+
#endif
370+
371+
}
372+
}

0 commit comments

Comments
 (0)