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