TestOperationWalker.cs 20.6 KB
Newer Older
1 2
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.

3
using System;
4
using System.Collections.Immutable;
5 6
using System.Diagnostics;
using Microsoft.CodeAnalysis.CSharp;
7
using Microsoft.CodeAnalysis.Operations;
8
using Microsoft.CodeAnalysis.VisualBasic;
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
using Xunit;

namespace Microsoft.CodeAnalysis.Test.Utilities
{
    public sealed class TestOperationWalker : OperationWalker
    {
        private static TestOperationWalker s_instance;

        private TestOperationWalker()
            : base()
        { }

        public static TestOperationWalker GetInstance()
        {
            if (s_instance == null)
            {
                s_instance = new TestOperationWalker();
            }
            return s_instance;
        }

30
#if Test_IOperation_None_Kind
31 32 33 34 35 36 37 38 39 40 41 42 43
        internal override void VisitNoneOperation(IOperation operation)
        {
            Assert.True(false, "Encountered an IOperation with `Kind == OperationKind.None` while walking the operation tree.");
        }
#endif

        public override void Visit(IOperation operation)
        {
            if (operation != null)
            {
                var syntax = operation.Syntax;
                var type = operation.Type;
                var constantValue = operation.ConstantValue;
44
                var language = operation.Language;
45 46 47 48
            }
            base.Visit(operation);
        }

49
        public override void VisitBlock(IBlockOperation operation)
50 51 52 53 54 55
        {
            foreach (var local in operation.Locals)
            {
                // empty loop body, just want to make sure it won't crash.
            }

56
            base.VisitBlock(operation);
57 58
        }

59
        public override void VisitVariableDeclarationGroup(IVariableDeclarationGroupOperation operation)
60
        {
61
            base.VisitVariableDeclarationGroup(operation);
62 63
        }

64
        public override void VisitVariableDeclarator(IVariableDeclaratorOperation operation)
65
        {
66
            var symbol = operation.Symbol;
67

68
            base.VisitVariableDeclarator(operation);
69 70
        }

71
        public override void VisitVariableDeclaration(IVariableDeclarationOperation operation)
72
        {
73 74 75
            base.VisitVariableDeclaration(operation);
        }

76
        public override void VisitSwitch(ISwitchOperation operation)
77
        {
78
            base.VisitSwitch(operation);
79 80
        }

81
        public override void VisitSwitchCase(ISwitchCaseOperation operation)
82 83 84 85
        {
            base.VisitSwitchCase(operation);
        }

86
        public override void VisitSingleValueCaseClause(ISingleValueCaseClauseOperation operation)
87 88 89 90 91 92
        {
            var caseKind = operation.CaseKind;

            base.VisitSingleValueCaseClause(operation);
        }

93
        public override void VisitRelationalCaseClause(IRelationalCaseClauseOperation operation)
94 95 96 97 98 99 100
        {
            var caseKind = operation.CaseKind;
            var relation = operation.Relation;

            base.VisitRelationalCaseClause(operation);
        }

101
        public override void VisitDefaultCaseClause(IDefaultCaseClauseOperation operation)
102 103
        {
            base.VisitDefaultCaseClause(operation);
104 105
        }

106
        private void WalkLoop(ILoopOperation operation)
107 108
        {
            var loopKind = operation.LoopKind;
M
Manish Vasani 已提交
109 110 111 112 113 114
            foreach (var local in operation.Locals)
            {
                // empty loop body, just want to make sure it won't crash.
            }
        }

115
        public override void VisitWhileLoop(IWhileLoopOperation operation)
116
        {
117 118
            var conditionIsTop = operation.ConditionIsTop;
            var conditionIsUntil = operation.ConditionIsUntil;
119
            WalkLoop(operation);
120

121
            base.VisitWhileLoop(operation);
122 123
        }

124
        public override void VisitForLoop(IForLoopOperation operation)
125
        {
126
            WalkLoop(operation);
127

128
            base.VisitForLoop(operation);
129 130
        }

131
        public override void VisitForToLoop(IForToLoopOperation operation)
132
        {
133
            WalkLoop(operation);
134

135
            base.VisitForToLoop(operation);
136 137
        }

138
        public override void VisitForEachLoop(IForEachLoopOperation operation)
139
        {
140
            WalkLoop(operation);
141

142
            base.VisitForEachLoop(operation);
143 144
        }

145
        public override void VisitLabeled(ILabeledOperation operation)
146 147 148
        {
            var label = operation.Label;

149
            base.VisitLabeled(operation);
150 151
        }

152
        public override void VisitBranch(IBranchOperation operation)
153 154 155 156
        {
            var target = operation.Target;
            var branchKind = operation.BranchKind;

157
            base.VisitBranch(operation);
158 159
        }

160
        public override void VisitEmpty(IEmptyOperation operation)
161
        {
162
            base.VisitEmpty(operation);
163 164
        }

165
        public override void VisitReturn(IReturnOperation operation)
166
        {
167
            base.VisitReturn(operation);
168 169
        }

170
        public override void VisitLock(ILockOperation operation)
171
        {
172
            base.VisitLock(operation);
173 174
        }

175
        public override void VisitTry(ITryOperation operation)
176
        {
177
            base.VisitTry(operation);
178 179
        }

180
        public override void VisitCatchClause(ICatchClauseOperation operation)
181
        {
182
            var exceptionType = operation.ExceptionType;
M
Manish Vasani 已提交
183
            var locals = operation.Locals;
184

185
            base.VisitCatchClause(operation);
186 187
        }

188
        public override void VisitUsing(IUsingOperation operation)
189
        {
190
            base.VisitUsing(operation);
191 192
        }

193
        // https://github.com/dotnet/roslyn/issues/21281
194
        internal override void VisitFixed(IFixedOperation operation)
195
        {
196
            base.VisitFixed(operation);
197 198
        }

199
        public override void VisitExpressionStatement(IExpressionStatementOperation operation)
200 201 202 203
        {
            base.VisitExpressionStatement(operation);
        }

204
        internal override void VisitWith(IWithOperation operation)
205
        {
206
            base.VisitWith(operation);
207 208
        }

209
        public override void VisitStop(IStopOperation operation)
210
        {
211
            base.VisitStop(operation);
212 213
        }

214
        public override void VisitEnd(IEndOperation operation)
215
        {
216
            base.VisitEnd(operation);
217 218
        }

219
        public override void VisitInvocation(IInvocationOperation operation)
220 221 222 223
        {
            var targetMethod = operation.TargetMethod;
            var isVirtual = operation.IsVirtual;

224
            base.VisitInvocation(operation);
225 226
        }

227
        public override void VisitArgument(IArgumentOperation operation)
228 229 230 231 232 233 234
        {
            var argumentKind = operation.ArgumentKind;
            var parameter = operation.Parameter;

            base.VisitArgument(operation);
        }

235
        public override void VisitOmittedArgument(IOmittedArgumentOperation operation)
236
        {
237
            base.VisitOmittedArgument(operation);
238 239
        }

240
        public override void VisitArrayElementReference(IArrayElementReferenceOperation operation)
241
        {
242
            base.VisitArrayElementReference(operation);
243 244
        }

245
        internal override void VisitPointerIndirectionReference(IPointerIndirectionReferenceOperation operation)
246
        {
247
            base.VisitPointerIndirectionReference(operation);
248 249
        }

250
        public override void VisitLocalReference(ILocalReferenceOperation operation)
251 252
        {
            var local = operation.Local;
253
            var isDeclaration = operation.IsDeclaration;
254

255
            base.VisitLocalReference(operation);
256 257
        }

258
        public override void VisitParameterReference(IParameterReferenceOperation operation)
259 260 261
        {
            var parameter = operation.Parameter;

262
            base.VisitParameterReference(operation);
263 264
        }

265
        public override void VisitInstanceReference(IInstanceReferenceOperation operation)
266
        {
267
            base.VisitInstanceReference(operation);
268 269
        }

270
        public override void VisitFieldReference(IFieldReferenceOperation operation)
271 272 273 274
        {
            var member = operation.Member;
            var field = operation.Field;

275
            base.VisitFieldReference(operation);
276 277
        }

278
        public override void VisitMethodReference(IMethodReferenceOperation operation)
279 280 281 282
        {
            var member = operation.Member;
            var method = operation.Method;

283
            base.VisitMethodReference(operation);
284 285
        }

286
        public override void VisitPropertyReference(IPropertyReferenceOperation operation)
287 288 289 290
        {
            var member = operation.Member;
            var property = operation.Property;

291
            base.VisitPropertyReference(operation);
292 293
        }

294
        public override void VisitEventReference(IEventReferenceOperation operation)
295 296 297 298
        {
            var member = operation.Member;
            var eventSymbol = operation.Event;

299
            base.VisitEventReference(operation);
300 301
        }

302
        public override void VisitEventAssignment(IEventAssignmentOperation operation)
303 304 305
        {
            var adds = operation.Adds;

306
            base.VisitEventAssignment(operation);
307 308
        }

309
        public override void VisitConditionalAccess(IConditionalAccessOperation operation)
310
        {
311
            base.VisitConditionalAccess(operation);
312 313
        }

314
        public override void VisitConditionalAccessInstance(IConditionalAccessInstanceOperation operation)
315
        {
316
            base.VisitConditionalAccessInstance(operation);
317 318
        }

319
        internal override void VisitPlaceholder(IPlaceholderOperation operation)
320
        {
321
            base.VisitPlaceholder(operation);
322 323
        }

324
        public override void VisitUnaryOperator(IUnaryOperation operation)
325 326
        {
            var operatorMethod = operation.OperatorMethod;
327 328 329
            var unaryOperationKind = operation.OperatorKind;
            var isLifted = operation.IsLifted;
            var isChecked = operation.IsChecked;
330

331
            base.VisitUnaryOperator(operation);
332 333
        }

334
        public override void VisitBinaryOperator(IBinaryOperation operation)
335 336
        {
            var operatorMethod = operation.OperatorMethod;
337 338 339 340
            var binaryOperationKind = operation.OperatorKind;
            var isLifted = operation.IsLifted;
            var isChecked = operation.IsChecked;
            var isCompareText = operation.IsCompareText;
341

342
            base.VisitBinaryOperator(operation);
343 344
        }

345
        public override void VisitConversion(IConversionOperation operation)
346 347
        {
            var operatorMethod = operation.OperatorMethod;
348 349 350 351 352 353
            var conversion = operation.Conversion;
            var isChecked = operation.IsChecked;
            var isTryCast = operation.IsTryCast;
            switch (operation.Language)
            {
                case LanguageNames.CSharp:
354
                    CSharp.Conversion csharpConversion = CSharp.CSharpExtensions.GetConversion(operation);
355 356
                    break;
                case LanguageNames.VisualBasic:
357
                    VisualBasic.Conversion visualBasicConversion = VisualBasic.VisualBasicExtensions.GetConversion(operation);
358 359 360 361 362
                    break;
                default:
                    Debug.Fail($"Language {operation.Language} is unknown!");
                    break;
            }
363

364
            base.VisitConversion(operation);
365 366
        }

367
        public override void VisitConditional(IConditionalOperation operation)
368
        {
369
            bool isRef = operation.IsRef;
370
            base.VisitConditional(operation);
371 372
        }

373
        public override void VisitCoalesce(ICoalesceOperation operation)
374
        {
375
            base.VisitCoalesce(operation);
376 377
        }

378
        public override void VisitIsType(IIsTypeOperation operation)
379
        {
380
            var isType = operation.TypeOperand;
381

382
            base.VisitIsType(operation);
383 384
        }

385
        public override void VisitSizeOf(ISizeOfOperation operation)
386 387 388
        {
            var typeOperand = operation.TypeOperand;

389
            base.VisitSizeOf(operation);
390 391
        }

392
        public override void VisitTypeOf(ITypeOfOperation operation)
393 394 395
        {
            var typeOperand = operation.TypeOperand;

396
            base.VisitTypeOf(operation);
397 398
        }

399
        public override void VisitAnonymousFunction(IAnonymousFunctionOperation operation)
400
        {
401
            var signature = operation.Symbol;
402

403
            base.VisitAnonymousFunction(operation);
404 405
        }

406
        public override void VisitLocalFunction(ILocalFunctionOperation operation)
407
        {
408
            var localFunction = operation.Symbol;
409

410
            base.VisitLocalFunction(operation);
411 412
        }

413
        public override void VisitLiteral(ILiteralOperation operation)
414
        {
415
            base.VisitLiteral(operation);
416 417
        }

418
        public override void VisitAwait(IAwaitOperation operation)
419
        {
420
            base.VisitAwait(operation);
421 422
        }

423
        public override void VisitNameOf(INameOfOperation operation)
424
        {
425
            base.VisitNameOf(operation);
426 427
        }

428
        public override void VisitThrow(IThrowOperation operation)
429
        {
430
            base.VisitThrow(operation);
431 432
        }

433
        public override void VisitAddressOf(IAddressOfOperation operation)
434
        {
435
            base.VisitAddressOf(operation);
436 437
        }

438
        public override void VisitObjectCreation(IObjectCreationOperation operation)
439 440 441
        {
            var ctor = operation.Constructor;

442
            base.VisitObjectCreation(operation);
443 444
        }

445
        public override void VisitAnonymousObjectCreation(IAnonymousObjectCreationOperation operation)
446
        {
447
            base.VisitAnonymousObjectCreation(operation);
448 449
        }

M
Manish Vasani 已提交
450
        private void VisitDynamicArguments(HasDynamicArgumentsExpression operation)
451
        {
M
Manish Vasani 已提交
452 453
            var names = operation.ArgumentNames;
            var refKinds = operation.ArgumentRefKinds;
454 455
        }

456
        public override void VisitDynamicObjectCreation(IDynamicObjectCreationOperation operation)
457
        {
M
Manish Vasani 已提交
458
            VisitDynamicArguments((HasDynamicArgumentsExpression)operation);
459

460
            base.VisitDynamicObjectCreation(operation);
461 462
        }

463
        public override void VisitDynamicInvocation(IDynamicInvocationOperation operation)
464
        {
M
Manish Vasani 已提交
465
            VisitDynamicArguments((HasDynamicArgumentsExpression)operation);
466

467
            base.VisitDynamicInvocation(operation);
468 469
        }

470
        public override void VisitDynamicIndexerAccess(IDynamicIndexerAccessOperation operation)
471
        {
M
Manish Vasani 已提交
472
            VisitDynamicArguments((HasDynamicArgumentsExpression)operation);
473

474
            base.VisitDynamicIndexerAccess(operation);
475 476
        }

477
        public override void VisitObjectOrCollectionInitializer(IObjectOrCollectionInitializerOperation operation)
478
        {
479
            base.VisitObjectOrCollectionInitializer(operation);
480 481
        }

482
        public override void VisitMemberInitializer(IMemberInitializerOperation operation)
483
        {
484
            base.VisitMemberInitializer(operation);
485 486
        }

487
        public override void VisitCollectionElementInitializer(ICollectionElementInitializerOperation operation)
488 489 490 491
        {
            var addMethod = operation.AddMethod;
            var isDynamic = operation.IsDynamic;

492
            base.VisitCollectionElementInitializer(operation);
493 494
        }

495
        public override void VisitFieldInitializer(IFieldInitializerOperation operation)
496 497 498 499 500 501 502 503
        {
            foreach (var field in operation.InitializedFields)
            {
                // empty loop body, just want to make sure it won't crash.
            }
            base.VisitFieldInitializer(operation);
        }

504
        public override void VisitVariableInitializer(IVariableInitializerOperation operation)
505
        {
M
Manish Vasani 已提交
506
            base.VisitVariableInitializer(operation);
507 508
        }

509
        public override void VisitPropertyInitializer(IPropertyInitializerOperation operation)
510
        {
511
            var initializedProperty = operation.InitializedProperties;
512 513 514 515

            base.VisitPropertyInitializer(operation);
        }

516
        public override void VisitParameterInitializer(IParameterInitializerOperation operation)
517 518 519 520 521 522
        {
            var parameter = operation.Parameter;

            base.VisitParameterInitializer(operation);
        }

523
        public override void VisitArrayCreation(IArrayCreationOperation operation)
524
        {
525
            base.VisitArrayCreation(operation);
526 527
        }

528
        public override void VisitArrayInitializer(IArrayInitializerOperation operation)
529 530 531 532
        {
            base.VisitArrayInitializer(operation);
        }

533
        public override void VisitSimpleAssignment(ISimpleAssignmentOperation operation)
534
        {
535
            bool isRef = operation.IsRef;
536
            base.VisitSimpleAssignment(operation);
537 538
        }

539
        public override void VisitCompoundAssignment(ICompoundAssignmentOperation operation)
540 541
        {
            var operatorMethod = operation.OperatorMethod;
542
            var binaryOperationKind = operation.OperatorKind;
543 544 545 546 547
            var inConversion = operation.InConversion;
            var outConversion = operation.OutConversion;

            if (operation.Syntax.Language == LanguageNames.CSharp)
            {
F
Fredric Silberberg 已提交
548 549
                Assert.Throws<ArgumentException>("compoundAssignment", () => VisualBasic.VisualBasicExtensions.GetInConversion(operation));
                Assert.Throws<ArgumentException>("compoundAssignment", () => VisualBasic.VisualBasicExtensions.GetOutConversion(operation));
550 551
                var inConversionInteranl = CSharp.CSharpExtensions.GetInConversion(operation);
                var outConversionInteranl = CSharp.CSharpExtensions.GetOutConversion(operation);
552 553 554
            }
            else
            {
555 556 557 558
                Assert.Throws<ArgumentException>("compoundAssignment", () => CSharp.CSharpExtensions.GetInConversion(operation));
                Assert.Throws<ArgumentException>("compoundAssignment", () => CSharp.CSharpExtensions.GetOutConversion(operation));
                var inConversionInternal = VisualBasic.VisualBasicExtensions.GetInConversion(operation);
                var outConversionInternal = VisualBasic.VisualBasicExtensions.GetOutConversion(operation);
559
            }
560

561
            base.VisitCompoundAssignment(operation);
562 563
        }

564
        public override void VisitIncrementOrDecrement(IIncrementOrDecrementOperation operation)
565 566
        {
            var operatorMethod = operation.OperatorMethod;
567
            var isPostFix = operation.IsPostfix;
568

569
            base.VisitIncrementOrDecrement(operation);
570 571
        }

572
        public override void VisitParenthesized(IParenthesizedOperation operation)
573
        {
574
            base.VisitParenthesized(operation);
575 576
        }

577
        public override void VisitDynamicMemberReference(IDynamicMemberReferenceOperation operation)
578 579
        {
            var memberName = operation.MemberName;
580 581
            var typeArgs = operation.TypeArguments;
            var containingType = operation.ContainingType;
582

583
            base.VisitDynamicMemberReference(operation);
584 585
        }

586
        public override void VisitDefaultValue(IDefaultValueOperation operation)
587
        {
588
            base.VisitDefaultValue(operation);
589 590
        }

591
        public override void VisitTypeParameterObjectCreation(ITypeParameterObjectCreationOperation operation)
592
        {
593
            base.VisitTypeParameterObjectCreation(operation);
594 595
        }

596
        public override void VisitInvalid(IInvalidOperation operation)
597
        {
598
            base.VisitInvalid(operation);
599
        }
600

601
        public override void VisitTuple(ITupleOperation operation)
602
        {
603
            base.VisitTuple(operation);
604
        }
605

606
        public override void VisitInterpolatedString(IInterpolatedStringOperation operation)
607
        {
608
            base.VisitInterpolatedString(operation);
609 610
        }

611
        public override void VisitInterpolatedStringText(IInterpolatedStringTextOperation operation)
612 613 614 615
        {
            base.VisitInterpolatedStringText(operation);
        }

616
        public override void VisitInterpolation(IInterpolationOperation operation)
617 618 619
        {
            base.VisitInterpolation(operation);
        }
620

621
        public override void VisitConstantPattern(IConstantPatternOperation operation)
622 623 624 625
        {
            base.VisitConstantPattern(operation);
        }

626
        public override void VisitDeclarationPattern(IDeclarationPatternOperation operation)
627 628 629 630 631 632
        {
            var declaredSymbol = operation.DeclaredSymbol;

            base.VisitDeclarationPattern(operation);
        }

633
        public override void VisitIsPattern(IIsPatternOperation operation)
634
        {
635
            base.VisitIsPattern(operation);
636 637
        }

638
        public override void VisitPatternCaseClause(IPatternCaseClauseOperation operation)
639 640 641 642 643
        {
            var label = operation.Label;

            base.VisitPatternCaseClause(operation);
        }
644

645
        public override void VisitTranslatedQuery(ITranslatedQueryOperation operation)
646
        {
647
            base.VisitTranslatedQuery(operation);
648
        }
649
    }
S
Sam Harwell 已提交
650
}