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