提交 ea17e1a3 编写于 作者: H Heejae Chang

changed to return IEnumerable<IOpeartion> from ImmutableArray<IOperation> for...

changed to return IEnumerable<IOpeartion> from ImmutableArray<IOperation> for IOperationHasChildren and made all IOperation to implement that interface
上级 4176034f
// 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 System.Collections.Generic;
namespace Microsoft.CodeAnalysis.Semantics
{
......@@ -13,7 +13,7 @@ public interface IInvalidExpression : IOperation
/// <summary>
/// Child operations.
/// </summary>
ImmutableArray<IOperation> Children { get; }
IEnumerable<IOperation> Children { get; }
}
}
// 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 System.Collections.Generic;
namespace Microsoft.CodeAnalysis.Semantics
{
......@@ -16,7 +16,7 @@ public interface IInvalidStatement : IOperation
/// <summary>
/// Child operations.
/// </summary>
ImmutableArray<IOperation> Children { get; }
IEnumerable<IOperation> Children { get; }
}
}
// 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.Generic;
using System.Collections.Immutable;
using System.Runtime.CompilerServices;
......@@ -18,6 +19,6 @@ internal interface IOperationWithChildren: IOperation
/// An array of child operations for this operation.
/// </summary>
/// <remarks>Note that any of the child operation nodes may be null.</remarks>
ImmutableArray<IOperation> Children { get; }
IEnumerable<IOperation> Children { get; }
}
}
// 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;
using System.Collections.Generic;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Semantics;
......@@ -9,7 +10,7 @@ namespace Microsoft.CodeAnalysis
/// <summary>
/// Root type for representing the abstract semantics of C# and VB statements and expressions.
/// </summary>
internal abstract class Operation : IOperation
internal abstract class Operation : IOperation, IOperationWithChildren
{
public Operation(OperationKind kind, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue)
{
......@@ -39,6 +40,8 @@ public Operation(OperationKind kind, SyntaxNode syntax, ITypeSymbol type, Option
/// </summary>
public Optional<object> ConstantValue { get; }
public abstract IEnumerable<IOperation> Children { get; }
public abstract void Accept(OperationVisitor visitor);
public abstract TResult Accept<TArgument, TResult>(OperationVisitor<TArgument, TResult> visitor, TArgument argument);
......@@ -77,7 +80,7 @@ public void Accept(OperationVisitor visitor)
return visitor.VisitNoneOperation(this, argument);
}
public ImmutableArray<IOperation> Children => _getChildren();
public IEnumerable<IOperation> Children => _getChildren().NullToEmpty();
}
}
}
// 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 System.Collections.Generic;
namespace Microsoft.CodeAnalysis.Semantics
{
......@@ -12,14 +12,11 @@ public abstract class OperationWalker : OperationVisitor
{
private int _recursionDepth;
internal void VisitArray<T>(ImmutableArray<T> list) where T : IOperation
internal void VisitArray<T>(IEnumerable<T> list) where T : IOperation
{
if (!list.IsDefault)
foreach (var operation in list)
{
foreach (var operation in list)
{
Visit(operation);
}
Visit(operation);
}
}
......@@ -40,7 +37,7 @@ public override void Visit(IOperation operation)
}
}
internal override void VisitNoneOperation(IOperation operation)
public override void DefaultVisit(IOperation operation)
{
if (operation is IOperationWithChildren operationWithChildren)
{
......@@ -48,430 +45,12 @@ internal override void VisitNoneOperation(IOperation operation)
}
}
public override void VisitBlockStatement(IBlockStatement operation)
{
VisitArray(operation.Statements);
}
public override void VisitVariableDeclarationStatement(IVariableDeclarationStatement operation)
{
VisitArray(operation.Declarations);
}
public override void VisitVariableDeclaration(IVariableDeclaration operation)
{
Visit(operation.Initializer);
}
public override void VisitSwitchStatement(ISwitchStatement operation)
{
Visit(operation.Value);
VisitArray(operation.Cases);
}
public override void VisitSwitchCase(ISwitchCase operation)
{
VisitArray(operation.Clauses);
VisitArray(operation.Body);
}
public override void VisitSingleValueCaseClause(ISingleValueCaseClause operation)
{
Visit(operation.Value);
}
public override void VisitRelationalCaseClause(IRelationalCaseClause operation)
{
Visit(operation.Value);
}
public override void VisitRangeCaseClause(IRangeCaseClause operation)
{
Visit(operation.MinimumValue);
Visit(operation.MaximumValue);
}
public override void VisitDefaultCaseClause(IDefaultCaseClause operation)
{
}
public override void VisitIfStatement(IIfStatement operation)
{
Visit(operation.Condition);
Visit(operation.IfTrueStatement);
Visit(operation.IfFalseStatement);
}
public override void VisitWhileUntilLoopStatement(IWhileUntilLoopStatement operation)
internal override void VisitNoneOperation(IOperation operation)
{
if (operation.IsTopTest)
{
Visit(operation.Condition);
Visit(operation.Body);
}
else
if (operation is IOperationWithChildren operationWithChildren)
{
Visit(operation.Body);
Visit(operation.Condition);
VisitArray(operationWithChildren.Children);
}
}
public override void VisitForLoopStatement(IForLoopStatement operation)
{
VisitArray(operation.Before);
Visit(operation.Condition);
Visit(operation.Body);
VisitArray(operation.AtLoopBottom);
}
public override void VisitForEachLoopStatement(IForEachLoopStatement operation)
{
Visit(operation.Collection);
Visit(operation.Body);
}
public override void VisitLabelStatement(ILabelStatement operation)
{
Visit(operation.LabeledStatement);
}
public override void VisitBranchStatement(IBranchStatement operation)
{ }
public override void VisitYieldBreakStatement(IReturnStatement operation)
{ }
public override void VisitEmptyStatement(IEmptyStatement operation)
{ }
public override void VisitThrowStatement(IThrowStatement operation)
{
Visit(operation.ThrownObject);
}
public override void VisitReturnStatement(IReturnStatement operation)
{
Visit(operation.ReturnedValue);
}
public override void VisitLockStatement(ILockStatement operation)
{
Visit(operation.LockedObject);
Visit(operation.Body);
}
public override void VisitTryStatement(ITryStatement operation)
{
Visit(operation.Body);
VisitArray(operation.Catches);
Visit(operation.FinallyHandler);
}
public override void VisitCatchClause(ICatchClause operation)
{
Visit(operation.Filter);
Visit(operation.Handler);
}
public override void VisitUsingStatement(IUsingStatement operation)
{
Visit(operation.Declaration);
Visit(operation.Value);
Visit(operation.Body);
}
public override void VisitFixedStatement(IFixedStatement operation)
{
Visit(operation.Variables);
Visit(operation.Body);
}
public override void VisitExpressionStatement(IExpressionStatement operation)
{
Visit(operation.Expression);
}
public override void VisitWithStatement(IWithStatement operation)
{
Visit(operation.Value);
Visit(operation.Body);
}
public override void VisitStopStatement(IStopStatement operation)
{ }
public override void VisitEndStatement(IEndStatement operation)
{ }
public override void VisitInvocationExpression(IInvocationExpression operation)
{
Visit(operation.Instance);
VisitArray(operation.ArgumentsInEvaluationOrder);
}
public override void VisitArgument(IArgument operation)
{
Visit(operation.Value);
Visit(operation.InConversion);
Visit(operation.OutConversion);
}
public override void VisitOmittedArgumentExpression(IOmittedArgumentExpression operation)
{ }
public override void VisitArrayElementReferenceExpression(IArrayElementReferenceExpression operation)
{
Visit(operation.ArrayReference);
VisitArray(operation.Indices);
}
public override void VisitPointerIndirectionReferenceExpression(IPointerIndirectionReferenceExpression operation)
{
Visit(operation.Pointer);
}
public override void VisitLocalReferenceExpression(ILocalReferenceExpression operation)
{ }
public override void VisitParameterReferenceExpression(IParameterReferenceExpression operation)
{ }
public override void VisitSyntheticLocalReferenceExpression(ISyntheticLocalReferenceExpression operation)
{ }
public override void VisitInstanceReferenceExpression(IInstanceReferenceExpression operation)
{ }
public override void VisitFieldReferenceExpression(IFieldReferenceExpression operation)
{
Visit(operation.Instance);
}
public override void VisitMethodBindingExpression(IMethodBindingExpression operation)
{
Visit(operation.Instance);
}
public override void VisitPropertyReferenceExpression(IPropertyReferenceExpression operation)
{
Visit(operation.Instance);
VisitArray(operation.ArgumentsInEvaluationOrder);
}
public override void VisitEventReferenceExpression(IEventReferenceExpression operation)
{
Visit(operation.Instance);
}
public override void VisitEventAssignmentExpression(IEventAssignmentExpression operation)
{
Visit(operation.EventInstance);
Visit(operation.HandlerValue);
}
public override void VisitConditionalAccessExpression(IConditionalAccessExpression operation)
{
Visit(operation.ConditionalInstance);
Visit(operation.ConditionalValue);
}
public override void VisitConditionalAccessInstanceExpression(IConditionalAccessInstanceExpression operation)
{
}
public override void VisitPlaceholderExpression(IPlaceholderExpression operation)
{
}
public override void VisitUnaryOperatorExpression(IUnaryOperatorExpression operation)
{
Visit(operation.Operand);
}
public override void VisitBinaryOperatorExpression(IBinaryOperatorExpression operation)
{
Visit(operation.LeftOperand);
Visit(operation.RightOperand);
}
public override void VisitConversionExpression(IConversionExpression operation)
{
Visit(operation.Operand);
}
public override void VisitConditionalChoiceExpression(IConditionalChoiceExpression operation)
{
Visit(operation.Condition);
Visit(operation.IfTrueValue);
Visit(operation.IfFalseValue);
}
public override void VisitNullCoalescingExpression(INullCoalescingExpression operation)
{
Visit(operation.PrimaryOperand);
Visit(operation.SecondaryOperand);
}
public override void VisitIsTypeExpression(IIsTypeExpression operation)
{
Visit(operation.Operand);
}
public override void VisitSizeOfExpression(ISizeOfExpression operation)
{ }
public override void VisitTypeOfExpression(ITypeOfExpression operation)
{ }
public override void VisitLambdaExpression(ILambdaExpression operation)
{
Visit(operation.Body);
}
public override void VisitLocalFunctionStatement(ILocalFunctionStatement operation)
{
Visit(operation.Body);
}
public override void VisitLiteralExpression(ILiteralExpression operation)
{ }
public override void VisitAwaitExpression(IAwaitExpression operation)
{
Visit(operation.AwaitedValue);
}
public override void VisitNameOfExpression(INameOfExpression operation)
{
Visit(operation.Argument);
}
public override void VisitThrowExpression(IThrowExpression operation)
{
Visit(operation.Expression);
}
public override void VisitAddressOfExpression(IAddressOfExpression operation)
{
Visit(operation.Reference);
}
public override void VisitObjectCreationExpression(IObjectCreationExpression operation)
{
VisitArray(operation.ArgumentsInEvaluationOrder);
VisitArray(operation.Initializers);
}
public override void VisitAnonymousObjectCreationExpression(IAnonymousObjectCreationExpression operation)
{
VisitArray(operation.Initializers);
}
public override void VisitFieldInitializer(IFieldInitializer operation)
{
Visit(operation.Value);
}
public override void VisitPropertyInitializer(IPropertyInitializer operation)
{
Visit(operation.Value);
}
public override void VisitParameterInitializer(IParameterInitializer operation)
{
Visit(operation.Value);
}
public override void VisitArrayCreationExpression(IArrayCreationExpression operation)
{
VisitArray(operation.DimensionSizes);
Visit(operation.Initializer);
}
public override void VisitArrayInitializer(IArrayInitializer operation)
{
VisitArray(operation.ElementValues);
}
public override void VisitSimpleAssignmentExpression(ISimpleAssignmentExpression operation)
{
Visit(operation.Target);
Visit(operation.Value);
}
public override void VisitCompoundAssignmentExpression(ICompoundAssignmentExpression operation)
{
Visit(operation.Target);
Visit(operation.Value);
}
public override void VisitIncrementExpression(IIncrementExpression operation)
{
Visit(operation.Target);
}
public override void VisitParenthesizedExpression(IParenthesizedExpression operation)
{
Visit(operation.Operand);
}
public override void VisitLateBoundMemberReferenceExpression(ILateBoundMemberReferenceExpression operation)
{
Visit(operation.Instance);
}
public override void VisitDefaultValueExpression(IDefaultValueExpression operation)
{ }
public override void VisitTypeParameterObjectCreationExpression(ITypeParameterObjectCreationExpression operation)
{ }
public override void VisitInvalidStatement(IInvalidStatement operation)
{
VisitArray(operation.Children);
}
public override void VisitInvalidExpression(IInvalidExpression operation)
{
VisitArray(operation.Children);
}
public override void VisitInterpolatedStringExpression(IInterpolatedStringExpression operation)
{
VisitArray(operation.Parts);
}
public override void VisitInterpolatedStringText(IInterpolatedStringText operation)
{
Visit(operation.Text);
}
public override void VisitInterpolation(IInterpolation operation)
{
Visit(operation.Expression);
Visit(operation.Alignment);
Visit(operation.FormatString);
}
public override void VisitConstantPattern(IConstantPattern operation)
{
Visit(operation.Value);
}
public override void VisitDeclarationPattern(IDeclarationPattern operation)
{
}
public override void VisitIsPatternExpression(IIsPatternExpression operation)
{
Visit(operation.Expression);
Visit(operation.Pattern);
}
public override void VisitPatternCaseClause(IPatternCaseClause operation)
{
Visit(operation.Pattern);
Visit(operation.GuardExpression);
}
}
}
......@@ -232,17 +232,12 @@ private void Visit(IOperation operation, string header)
Unindent();
}
private void VisitArray<T>(ImmutableArray<T> list, string header, bool logElementCount)
private void VisitArray<T>(IEnumerable<T> list, string header, bool logElementCount)
where T : IOperation
{
Debug.Assert(!string.IsNullOrEmpty(header));
if (list.IsDefaultOrEmpty)
{
return;
}
var elementCount = logElementCount ? $"({list.Length})" : string.Empty;
var elementCount = logElementCount ? $"({list.Count()})" : string.Empty;
Indent();
LogString($"{header}{elementCount}: ");
VisitArray(list);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册