OperationCloner.cs 31.7 KB
Newer Older
1 2 3 4 5 6 7 8 9
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.

using System.Collections.Immutable;
using Roslyn.Utilities;

namespace Microsoft.CodeAnalysis.Semantics
{
    internal abstract class OperationCloner : OperationVisitor<object, IOperation>
    {
10
        protected T Visit<T>(T node) where T : IOperation
11 12 13 14
        {
            return (T)Visit(node, argument: null);
        }

15 16 17 18 19
        public IOperation Visit(IOperation operation)
        {
            return Visit(operation, argument: null);
        }

20 21 22 23 24 25 26 27
        public override IOperation DefaultVisit(IOperation operation, object argument)
        {
            // this should never reach, otherwise, there is missing override for IOperation type
            throw ExceptionUtilities.Unreachable;
        }

        internal override IOperation VisitNoneOperation(IOperation operation, object argument)
        {
J
jinuz420 已提交
28
            return Operation.CreateOperationNone(((Operation)operation).SemanticModel, operation.Syntax, operation.ConstantValue, () => VisitArray(operation.Children.ToImmutableArray()), operation.IsImplicit);
29 30 31 32 33 34 35 36 37 38
        }

        private ImmutableArray<T> VisitArray<T>(ImmutableArray<T> nodes) where T : IOperation
        {
            // clone the array
            return nodes.SelectAsArray(n => Visit(n));
        }

        public override IOperation VisitBlockStatement(IBlockStatement operation, object argument)
        {
J
jinuz420 已提交
39
            return new BlockStatement(VisitArray(operation.Statements), operation.Locals, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
40 41 42 43
        }

        public override IOperation VisitVariableDeclarationStatement(IVariableDeclarationStatement operation, object argument)
        {
J
jinuz420 已提交
44
            return new VariableDeclarationStatement(VisitArray(operation.Declarations), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
45 46 47 48
        }

        public override IOperation VisitVariableDeclaration(IVariableDeclaration operation, object argument)
        {
J
jinuz420 已提交
49
            return new VariableDeclaration(operation.Variables, Visit(operation.Initializer), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
50 51 52 53
        }

        public override IOperation VisitSwitchStatement(ISwitchStatement operation, object argument)
        {
J
jinuz420 已提交
54
            return new SwitchStatement(Visit(operation.Value), VisitArray(operation.Cases), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
55 56 57 58
        }

        public override IOperation VisitSwitchCase(ISwitchCase operation, object argument)
        {
J
jinuz420 已提交
59
            return new SwitchCase(VisitArray(operation.Clauses), VisitArray(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
60 61 62 63
        }

        public override IOperation VisitSingleValueCaseClause(ISingleValueCaseClause operation, object argument)
        {
J
jinuz420 已提交
64
            return new SingleValueCaseClause(Visit(operation.Value), operation.Equality, operation.CaseKind, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
65 66 67 68
        }

        public override IOperation VisitRelationalCaseClause(IRelationalCaseClause operation, object argument)
        {
J
jinuz420 已提交
69
            return new RelationalCaseClause(Visit(operation.Value), operation.Relation, operation.CaseKind, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
70 71 72 73
        }

        public override IOperation VisitRangeCaseClause(IRangeCaseClause operation, object argument)
        {
J
jinuz420 已提交
74
            return new RangeCaseClause(Visit(operation.MinimumValue), Visit(operation.MaximumValue), operation.CaseKind, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
75 76 77 78
        }

        public override IOperation VisitDefaultCaseClause(IDefaultCaseClause operation, object argument)
        {
J
jinuz420 已提交
79
            return new DefaultCaseClause(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
80 81 82 83
        }

        public override IOperation VisitIfStatement(IIfStatement operation, object argument)
        {
J
jinuz420 已提交
84
            return new IfStatement(Visit(operation.Condition), Visit(operation.IfTrueStatement), Visit(operation.IfFalseStatement), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
85 86
        }

87
        public override IOperation VisitDoLoopStatement(IDoLoopStatement operation, object argument)
88
        {
M
Manish Vasani 已提交
89
            return new DoLoopStatement(operation.DoLoopKind, Visit(operation.Condition), Visit(operation.Body), Visit(operation.InvalidCondition), operation.Locals, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
90 91 92 93
        }

        public override IOperation VisitWhileLoopStatement(IWhileLoopStatement operation, object argument)
        {
M
Manish Vasani 已提交
94
            return new WhileLoopStatement(Visit(operation.Condition), Visit(operation.Body), operation.Locals, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
95 96 97 98
        }

        public override IOperation VisitForLoopStatement(IForLoopStatement operation, object argument)
        {
99 100 101 102 103
            return new ForLoopStatement(VisitArray(operation.Before), Visit(operation.Condition), VisitArray(operation.AtLoopBottom), operation.Locals, Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
        }

        public override IOperation VisitForToLoopStatement(IForToLoopStatement operation, object argument)
        {
M
Manish Vasani 已提交
104
            return new ForToLoopStatement(operation.Locals, Visit(operation.LoopControlVariable), Visit(operation.InitialValue), Visit(operation.LimitValue), Visit(operation.StepValue), Visit(operation.Body), VisitArray(operation.NextVariables), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
105 106 107 108
        }

        public override IOperation VisitForEachLoopStatement(IForEachLoopStatement operation, object argument)
        {
M
Manish Vasani 已提交
109
            return new ForEachLoopStatement(operation.Locals, Visit(operation.LoopControlVariable), Visit(operation.Collection), VisitArray(operation.NextVariables), Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
110 111 112 113
        }

        public override IOperation VisitLabelStatement(ILabelStatement operation, object argument)
        {
J
jinuz420 已提交
114
            return new LabelStatement(operation.Label, Visit(operation.LabeledStatement), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
115 116 117 118
        }

        public override IOperation VisitBranchStatement(IBranchStatement operation, object argument)
        {
J
jinuz420 已提交
119
            return new BranchStatement(operation.Target, operation.BranchKind, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
120 121 122 123
        }

        public override IOperation VisitYieldBreakStatement(IReturnStatement operation, object argument)
        {
J
jinuz420 已提交
124
            return new ReturnStatement(operation.Kind, Visit(operation.ReturnedValue), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
125 126 127 128
        }

        public override IOperation VisitEmptyStatement(IEmptyStatement operation, object argument)
        {
J
jinuz420 已提交
129
            return new EmptyStatement(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
130 131 132 133
        }

        public override IOperation VisitReturnStatement(IReturnStatement operation, object argument)
        {
J
jinuz420 已提交
134
            return new ReturnStatement(operation.Kind, Visit(operation.ReturnedValue), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
135 136 137 138
        }

        public override IOperation VisitLockStatement(ILockStatement operation, object argument)
        {
139
            return new LockStatement(Visit(operation.Expression), Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
140 141 142 143
        }

        public override IOperation VisitTryStatement(ITryStatement operation, object argument)
        {
J
jinuz420 已提交
144
            return new TryStatement(Visit(operation.Body), VisitArray(operation.Catches), Visit(operation.FinallyHandler), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
145 146 147 148
        }

        public override IOperation VisitCatchClause(ICatchClause operation, object argument)
        {
J
jinuz420 已提交
149
            return new CatchClause(Visit(operation.Handler), operation.CaughtType, Visit(operation.Filter), operation.ExceptionLocal, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
150 151 152 153
        }

        public override IOperation VisitUsingStatement(IUsingStatement operation, object argument)
        {
J
jinuz420 已提交
154
            return new UsingStatement(Visit(operation.Body), Visit(operation.Declaration), Visit(operation.Value), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
155 156 157 158
        }

        public override IOperation VisitFixedStatement(IFixedStatement operation, object argument)
        {
J
jinuz420 已提交
159
            return new FixedStatement(Visit(operation.Variables), Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
160 161 162 163
        }

        public override IOperation VisitExpressionStatement(IExpressionStatement operation, object argument)
        {
J
jinuz420 已提交
164
            return new ExpressionStatement(Visit(operation.Expression), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
165 166 167 168
        }

        public override IOperation VisitWithStatement(IWithStatement operation, object argument)
        {
J
jinuz420 已提交
169
            return new WithStatement(Visit(operation.Body), Visit(operation.Value), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
170 171 172 173
        }

        public override IOperation VisitStopStatement(IStopStatement operation, object argument)
        {
J
jinuz420 已提交
174
            return new StopStatement(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
175 176 177 178
        }

        public override IOperation VisitEndStatement(IEndStatement operation, object argument)
        {
J
jinuz420 已提交
179
            return new EndStatement(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
180 181 182 183
        }

        public override IOperation VisitInvocationExpression(IInvocationExpression operation, object argument)
        {
J
jinuz420 已提交
184
            return new InvocationExpression(operation.TargetMethod, Visit(operation.Instance), operation.IsVirtual, VisitArray(operation.ArgumentsInEvaluationOrder), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
185 186 187 188
        }

        public override IOperation VisitArgument(IArgument operation, object argument)
        {
J
jinuz420 已提交
189
            return new Argument(operation.ArgumentKind, operation.Parameter, Visit(operation.Value), Visit(operation.InConversion), Visit(operation.OutConversion), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
190 191 192 193
        }

        public override IOperation VisitOmittedArgumentExpression(IOmittedArgumentExpression operation, object argument)
        {
J
jinuz420 已提交
194
            return new OmittedArgumentExpression(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
195 196 197 198
        }

        public override IOperation VisitArrayElementReferenceExpression(IArrayElementReferenceExpression operation, object argument)
        {
J
jinuz420 已提交
199
            return new ArrayElementReferenceExpression(Visit(operation.ArrayReference), VisitArray(operation.Indices), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
200 201 202 203
        }

        public override IOperation VisitPointerIndirectionReferenceExpression(IPointerIndirectionReferenceExpression operation, object argument)
        {
J
jinuz420 已提交
204
            return new PointerIndirectionReferenceExpression(Visit(operation.Pointer), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
205 206 207 208
        }

        public override IOperation VisitLocalReferenceExpression(ILocalReferenceExpression operation, object argument)
        {
J
jinuz420 已提交
209
            return new LocalReferenceExpression(operation.Local, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
210 211 212 213
        }

        public override IOperation VisitParameterReferenceExpression(IParameterReferenceExpression operation, object argument)
        {
J
jinuz420 已提交
214
            return new ParameterReferenceExpression(operation.Parameter, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
215 216 217 218
        }

        public override IOperation VisitInstanceReferenceExpression(IInstanceReferenceExpression operation, object argument)
        {
J
jinuz420 已提交
219
            return new InstanceReferenceExpression(operation.InstanceReferenceKind, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
220 221 222 223
        }

        public override IOperation VisitFieldReferenceExpression(IFieldReferenceExpression operation, object argument)
        {
J
jinuz420 已提交
224
            return new FieldReferenceExpression(operation.Field, Visit(operation.Instance), operation.Member, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
225 226 227 228
        }

        public override IOperation VisitMethodBindingExpression(IMethodBindingExpression operation, object argument)
        {
J
jinuz420 已提交
229
            return new MethodBindingExpression(operation.Method, operation.IsVirtual, Visit(operation.Instance), operation.Member, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
230 231 232 233
        }

        public override IOperation VisitPropertyReferenceExpression(IPropertyReferenceExpression operation, object argument)
        {
J
jinuz420 已提交
234
            return new PropertyReferenceExpression(operation.Property, Visit(operation.Instance), operation.Member, VisitArray(operation.ArgumentsInEvaluationOrder), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
235 236 237 238
        }

        public override IOperation VisitEventReferenceExpression(IEventReferenceExpression operation, object argument)
        {
J
jinuz420 已提交
239
            return new EventReferenceExpression(operation.Event, Visit(operation.Instance), operation.Member, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
240 241 242 243
        }

        public override IOperation VisitEventAssignmentExpression(IEventAssignmentExpression operation, object argument)
        {
J
jinuz420 已提交
244
            return new EventAssignmentExpression(Visit(operation.EventReference), Visit(operation.HandlerValue), operation.Adds, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
245 246 247 248
        }

        public override IOperation VisitConditionalAccessExpression(IConditionalAccessExpression operation, object argument)
        {
J
jinuz420 已提交
249
            return new ConditionalAccessExpression(Visit(operation.ConditionalValue), Visit(operation.ConditionalInstance), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
250 251 252 253
        }

        public override IOperation VisitConditionalAccessInstanceExpression(IConditionalAccessInstanceExpression operation, object argument)
        {
J
jinuz420 已提交
254
            return new ConditionalAccessInstanceExpression(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
255 256 257 258
        }

        public override IOperation VisitPlaceholderExpression(IPlaceholderExpression operation, object argument)
        {
J
jinuz420 已提交
259
            return new PlaceholderExpression(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
260 261 262 263
        }

        public override IOperation VisitUnaryOperatorExpression(IUnaryOperatorExpression operation, object argument)
        {
J
jinuz420 已提交
264
            return new UnaryOperatorExpression(operation.UnaryOperationKind, Visit(operation.Operand), operation.IsLifted, operation.UsesOperatorMethod, operation.OperatorMethod, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
265 266 267 268
        }

        public override IOperation VisitBinaryOperatorExpression(IBinaryOperatorExpression operation, object argument)
        {
J
jinuz420 已提交
269
            return new BinaryOperatorExpression(operation.BinaryOperationKind, Visit(operation.LeftOperand), Visit(operation.RightOperand), operation.IsLifted, operation.UsesOperatorMethod, operation.OperatorMethod, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
270 271
        }

272
        public override IOperation VisitConditionalExpression(IConditionalExpression operation, object argument)
273
        {
274
            return new ConditionalExpression(Visit(operation.Condition), Visit(operation.WhenTrue), Visit(operation.WhenFalse), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
275 276
        }

277
        public override IOperation VisitCoalesceExpression(ICoalesceExpression operation, object argument)
278
        {
279
            return new CoalesceExpression(Visit(operation.Expression), Visit(operation.WhenNull), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
280 281 282 283
        }

        public override IOperation VisitIsTypeExpression(IIsTypeExpression operation, object argument)
        {
J
jinuz420 已提交
284
            return new IsTypeExpression(Visit(operation.Operand), operation.IsType, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
285 286 287 288
        }

        public override IOperation VisitSizeOfExpression(ISizeOfExpression operation, object argument)
        {
J
jinuz420 已提交
289
            return new SizeOfExpression(operation.TypeOperand, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
290 291 292 293
        }

        public override IOperation VisitTypeOfExpression(ITypeOfExpression operation, object argument)
        {
J
jinuz420 已提交
294
            return new TypeOfExpression(operation.TypeOperand, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
295 296
        }

297
        public override IOperation VisitAnonymousFunctionExpression(IAnonymousFunctionExpression operation, object argument)
298
        {
299
            return new AnonymousFunctionExpression(operation.Symbol, Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
300 301 302 303
        }

        public override IOperation VisitLiteralExpression(ILiteralExpression operation, object argument)
        {
304
            return new LiteralExpression(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
305 306 307 308
        }

        public override IOperation VisitAwaitExpression(IAwaitExpression operation, object argument)
        {
J
jinuz420 已提交
309
            return new AwaitExpression(Visit(operation.AwaitedValue), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
310 311 312 313
        }

        public override IOperation VisitNameOfExpression(INameOfExpression operation, object argument)
        {
J
jinuz420 已提交
314
            return new NameOfExpression(Visit(operation.Argument), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
315 316 317 318
        }

        public override IOperation VisitThrowExpression(IThrowExpression operation, object argument)
        {
J
jinuz420 已提交
319
            return new ThrowExpression(Visit(operation.Expression), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
320 321 322 323
        }

        public override IOperation VisitAddressOfExpression(IAddressOfExpression operation, object argument)
        {
J
jinuz420 已提交
324
            return new AddressOfExpression(Visit(operation.Reference), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
325 326 327 328
        }

        public override IOperation VisitObjectCreationExpression(IObjectCreationExpression operation, object argument)
        {
J
jinuz420 已提交
329
            return new ObjectCreationExpression(operation.Constructor, Visit(operation.Initializer), VisitArray(operation.ArgumentsInEvaluationOrder), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
330 331 332 333
        }

        public override IOperation VisitAnonymousObjectCreationExpression(IAnonymousObjectCreationExpression operation, object argument)
        {
J
jinuz420 已提交
334
            return new AnonymousObjectCreationExpression(VisitArray(operation.Initializers), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
335 336 337 338
        }

        public override IOperation VisitObjectOrCollectionInitializerExpression(IObjectOrCollectionInitializerExpression operation, object argument)
        {
J
jinuz420 已提交
339
            return new ObjectOrCollectionInitializerExpression(VisitArray(operation.Initializers), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
340 341 342 343
        }

        public override IOperation VisitMemberInitializerExpression(IMemberInitializerExpression operation, object argument)
        {
J
jinuz420 已提交
344
            return new MemberInitializerExpression(Visit(operation.InitializedMember), Visit(operation.Initializer), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
345 346 347 348
        }

        public override IOperation VisitCollectionElementInitializerExpression(ICollectionElementInitializerExpression operation, object argument)
        {
J
jinuz420 已提交
349
            return new CollectionElementInitializerExpression(operation.AddMethod, VisitArray(operation.Arguments), operation.IsDynamic, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
350 351 352 353
        }

        public override IOperation VisitFieldInitializer(IFieldInitializer operation, object argument)
        {
J
jinuz420 已提交
354
            return new FieldInitializer(operation.InitializedFields, Visit(operation.Value), operation.Kind, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
355 356 357 358
        }

        public override IOperation VisitPropertyInitializer(IPropertyInitializer operation, object argument)
        {
J
jinuz420 已提交
359
            return new PropertyInitializer(operation.InitializedProperty, Visit(operation.Value), operation.Kind, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
360 361 362 363
        }

        public override IOperation VisitParameterInitializer(IParameterInitializer operation, object argument)
        {
J
jinuz420 已提交
364
            return new ParameterInitializer(operation.Parameter, Visit(operation.Value), operation.Kind, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
365 366 367 368
        }

        public override IOperation VisitArrayCreationExpression(IArrayCreationExpression operation, object argument)
        {
J
jinuz420 已提交
369
            return new ArrayCreationExpression(operation.ElementType, VisitArray(operation.DimensionSizes), Visit(operation.Initializer), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
370 371 372 373
        }

        public override IOperation VisitArrayInitializer(IArrayInitializer operation, object argument)
        {
J
jinuz420 已提交
374
            return new ArrayInitializer(VisitArray(operation.ElementValues), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
375 376 377 378
        }

        public override IOperation VisitSimpleAssignmentExpression(ISimpleAssignmentExpression operation, object argument)
        {
J
jinuz420 已提交
379
            return new SimpleAssignmentExpression(Visit(operation.Target), Visit(operation.Value), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
380 381 382 383
        }

        public override IOperation VisitCompoundAssignmentExpression(ICompoundAssignmentExpression operation, object argument)
        {
J
jinuz420 已提交
384
            return new CompoundAssignmentExpression(operation.BinaryOperationKind, operation.IsLifted, Visit(operation.Target), Visit(operation.Value), operation.UsesOperatorMethod, operation.OperatorMethod, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
385 386 387 388
        }

        public override IOperation VisitIncrementExpression(IIncrementExpression operation, object argument)
        {
J
jinuz420 已提交
389
            return new IncrementExpression(operation.IncrementOperationKind, Visit(operation.Target), operation.UsesOperatorMethod, operation.OperatorMethod, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
390 391 392 393
        }

        public override IOperation VisitParenthesizedExpression(IParenthesizedExpression operation, object argument)
        {
J
jinuz420 已提交
394
            return new ParenthesizedExpression(Visit(operation.Operand), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
395 396 397 398
        }

        public override IOperation VisitDynamicMemberReferenceExpression(IDynamicMemberReferenceExpression operation, object argument)
        {
J
jinuz420 已提交
399
            return new DynamicMemberReferenceExpression(Visit(operation.Instance), operation.MemberName, operation.TypeArguments, operation.ContainingType, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
400 401 402 403
        }

        public override IOperation VisitDynamicObjectCreationExpression(IDynamicObjectCreationExpression operation, object argument)
        {
J
jinuz420 已提交
404
            return new DynamicObjectCreationExpression(operation.Name, operation.ApplicableSymbols, VisitArray(operation.Arguments), operation.ArgumentNames, operation.ArgumentRefKinds, Visit(operation.Initializer), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
405 406 407 408
        }

        public override IOperation VisitDefaultValueExpression(IDefaultValueExpression operation, object argument)
        {
J
jinuz420 已提交
409
            return new DefaultValueExpression(((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
410 411 412 413
        }

        public override IOperation VisitTypeParameterObjectCreationExpression(ITypeParameterObjectCreationExpression operation, object argument)
        {
J
jinuz420 已提交
414
            return new TypeParameterObjectCreationExpression(Visit(operation.Initializer), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
415 416 417 418
        }

        public override IOperation VisitInvalidStatement(IInvalidStatement operation, object argument)
        {
J
jinuz420 已提交
419
            return new InvalidStatement(VisitArray(operation.Children.ToImmutableArray()), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
420 421 422 423
        }

        public override IOperation VisitInvalidExpression(IInvalidExpression operation, object argument)
        {
J
jinuz420 已提交
424
            return new InvalidExpression(VisitArray(operation.Children.ToImmutableArray()), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
425 426 427 428
        }

        public override IOperation VisitLocalFunctionStatement(ILocalFunctionStatement operation, object argument)
        {
J
jinuz420 已提交
429
            return new LocalFunctionStatement(operation.LocalFunctionSymbol, Visit(operation.Body), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
430 431 432 433
        }

        public override IOperation VisitInterpolatedStringExpression(IInterpolatedStringExpression operation, object argument)
        {
J
jinuz420 已提交
434
            return new InterpolatedStringExpression(VisitArray(operation.Parts), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
435 436 437 438
        }

        public override IOperation VisitInterpolatedStringText(IInterpolatedStringText operation, object argument)
        {
J
jinuz420 已提交
439
            return new InterpolatedStringText(Visit(operation.Text), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
440 441 442 443
        }

        public override IOperation VisitInterpolation(IInterpolation operation, object argument)
        {
J
jinuz420 已提交
444
            return new Interpolation(Visit(operation.Expression), Visit(operation.Alignment), Visit(operation.FormatString), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
445 446 447 448
        }

        public override IOperation VisitIsPatternExpression(IIsPatternExpression operation, object argument)
        {
J
jinuz420 已提交
449
            return new IsPatternExpression(Visit(operation.Expression), Visit(operation.Pattern), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
450 451 452 453
        }

        public override IOperation VisitConstantPattern(IConstantPattern operation, object argument)
        {
J
jinuz420 已提交
454
            return new ConstantPattern(Visit(operation.Value), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
455 456 457 458
        }

        public override IOperation VisitDeclarationPattern(IDeclarationPattern operation, object argument)
        {
J
jinuz420 已提交
459
            return new DeclarationPattern(operation.DeclaredSymbol, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
460 461 462 463
        }

        public override IOperation VisitPatternCaseClause(IPatternCaseClause operation, object argument)
        {
J
jinuz420 已提交
464
            return new PatternCaseClause(operation.Label, Visit(operation.Pattern), Visit(operation.GuardExpression), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
465 466 467 468
        }

        public override IOperation VisitTupleExpression(ITupleExpression operation, object argument)
        {
J
jinuz420 已提交
469
            return new TupleExpression(VisitArray(operation.Elements), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
470 471 472
        }
    }
}