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