提交 3b9ccedf 编写于 作者: M Manish Vasani

Address PR feedback

上级 2796b59c
......@@ -1173,13 +1173,13 @@ private IDoLoopStatement CreateBoundDoStatementOperation(BoundDoStatement boundD
DoLoopKind doLoopKind = DoLoopKind.DoWhileBottomLoop;
Lazy<IOperation> condition = new Lazy<IOperation>(() => Create(boundDoStatement.Condition));
Lazy<IOperation> body = new Lazy<IOperation>(() => Create(boundDoStatement.Body));
Lazy<IOperation> invalidCondition = new Lazy<IOperation>(() => null);
Lazy<IOperation> ignoredCondition = new Lazy<IOperation>(() => null);
ImmutableArray<ILocalSymbol> locals = boundDoStatement.Locals.As<ILocalSymbol>();
SyntaxNode syntax = boundDoStatement.Syntax;
ITypeSymbol type = null;
Optional<object> constantValue = default(Optional<object>);
bool isImplicit = boundDoStatement.WasCompilerGenerated;
return new LazyDoLoopStatement(doLoopKind, condition, body, invalidCondition, locals, _semanticModel, syntax, type, constantValue, isImplicit);
return new LazyDoLoopStatement(doLoopKind, condition, body, ignoredCondition, locals, _semanticModel, syntax, type, constantValue, isImplicit);
}
private IForLoopStatement CreateBoundForStatementOperation(BoundForStatement boundForStatement)
......
......@@ -5,7 +5,6 @@
using Roslyn.Test.Utilities;
using Xunit;
namespace Microsoft.CodeAnalysis.CSharp.UnitTests
{
public partial class IOperationTests : SemanticModelTestBase
......@@ -883,6 +882,38 @@ public static void M((int, int)[] x)
VerifyOperationTreeAndDiagnosticsForTest<ForEachVariableStatementSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact, WorkItem(17602, "https://github.com/dotnet/roslyn/issues/17602")]
public void IForEachLoopStatement_WithNestedDeconstructDeclaration()
{
string source = @"
class X
{
public static void M((int, (int, int))[] x)
{
/*<bind>*/foreach (var (a, (b, c)) in x)
{
}/*</bind>*/
}
}
";
string expectedOperationTree = @"
IForEachLoopStatement (LoopKind.ForEach) (OperationKind.LoopStatement) (Syntax: 'foreach (va ... }')
Locals: Local_1: System.Int32 a
Local_2: System.Int32 b
Local_3: System.Int32 c
LoopControlVariable: IOperation: (OperationKind.None) (Syntax: 'var (a, (b, c))')
Collection: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Collections.IEnumerable) (Syntax: 'x')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null)
Operand: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: (System.Int32, (System.Int32, System.Int32))[]) (Syntax: 'x')
Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
NextVariables(0)
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<ForEachVariableStatementSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact, WorkItem(17602, "https://github.com/dotnet/roslyn/issues/17602")]
public void IForEachLoopStatement_WithInvalidLoopControlVariable()
......@@ -956,5 +987,37 @@ public static void M((int, int)[] x)
VerifyOperationTreeAndDiagnosticsForTest<BlockSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact, WorkItem(17602, "https://github.com/dotnet/roslyn/issues/17602")]
public void IForEachLoopStatement_WithInvalidLoopControlVariable_02()
{
string source = @"
class X
{
public static void M(int[] x)
/*<bind>*/{
foreach (x[0] in x)
{
}
}/*</bind>*/
}
";
string expectedOperationTree = @"
IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: '{ ... }')
IForEachLoopStatement (LoopKind.ForEach) (OperationKind.LoopStatement, IsInvalid) (Syntax: 'foreach (x[ ... }')
LoopControlVariable: null
Collection: IConversionExpression (Implicit, TryCast: False, Unchecked) (OperationKind.ConversionExpression, Type: System.Collections.IEnumerable) (Syntax: 'x')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null)
Operand: IParameterReferenceExpression: x (OperationKind.ParameterReferenceExpression, Type: System.Int32[]) (Syntax: 'x')
Body: IBlockStatement (0 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
NextVariables(0)
";
var expectedDiagnostics = new DiagnosticDescription[] {
Diagnostic(ErrorCode.ERR_BadForeachDecl, "in").WithLocation(6, 23)
};
VerifyOperationTreeAndDiagnosticsForTest<BlockSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
}
}
......@@ -37,7 +37,7 @@ static void Main()
Condition: IBinaryOperatorExpression (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i < 4')
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 4) (Syntax: '4')
InvalidCondition: null
IgnoredCondition: null
Body: IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'sum += ids[i];')
Expression: ICompoundAssignmentExpression (BinaryOperatorKind.Add) (OperationKind.CompoundAssignmentExpression, Type: System.Int32) (Syntax: 'sum += ids[i]')
......@@ -1065,7 +1065,7 @@ static bool TakeOutParam<T>(T y, out T x)
Operand: ILocalReferenceExpression: x1 (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'x1')
InConversion: null
OutConversion: null
InvalidCondition: null
IgnoredCondition: null
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'f = false;')
Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'f = false')
......
......@@ -5040,16 +5040,16 @@ internal abstract partial class BaseDoLoopStatement : LoopStatement, IDoLoopStat
/// </summary>
public DoLoopKind DoLoopKind { get; }
protected abstract IOperation ConditionImpl { get; }
protected abstract IOperation InvalidConditionImpl { get; }
protected abstract IOperation IgnoredConditionImpl { get; }
public override IEnumerable<IOperation> Children
{
get
{
yield return Condition;
yield return Body;
if (InvalidCondition != null)
if (IgnoredCondition != null)
{
yield return InvalidCondition;
yield return IgnoredCondition;
}
}
}
......@@ -5058,12 +5058,12 @@ public override IEnumerable<IOperation> Children
/// </summary>
public IOperation Condition => Operation.SetParentOperation(ConditionImpl, this);
/// <summary>
/// Additional conditional supplied for loop in error cases.
/// Additional conditional supplied for loop in error cases, which is ignored by the compiler.
/// For example, for VB 'Do While' or 'Do Until' loop with syntax errors where both the top and bottom conditions are provided.
/// The top condition is preferred and exposed as <see cref="Condition"/> and the bottom condition is exposed by this property.
/// The top condition is preferred and exposed as <see cref="Condition"/> and the bottom condition is ignored and exposed by this property.
/// This property should be null for all non-error cases.
/// </summary>
public IOperation InvalidCondition => Operation.SetParentOperation(InvalidConditionImpl, this);
public IOperation IgnoredCondition => Operation.SetParentOperation(IgnoredConditionImpl, this);
public override void Accept(OperationVisitor visitor)
{
visitor.VisitDoLoopStatement(this);
......@@ -5079,16 +5079,16 @@ public override void Accept(OperationVisitor visitor)
/// </summary>
internal sealed partial class DoLoopStatement : BaseDoLoopStatement, IDoLoopStatement
{
public DoLoopStatement(DoLoopKind doLoopKind, IOperation condition, IOperation body, IOperation invalidConditionOpt, ImmutableArray<ILocalSymbol> locals, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
public DoLoopStatement(DoLoopKind doLoopKind, IOperation condition, IOperation body, IOperation ignoredConditionOpt, ImmutableArray<ILocalSymbol> locals, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(doLoopKind, locals, semanticModel, syntax, type, constantValue, isImplicit)
{
ConditionImpl = condition;
BodyImpl = body;
InvalidConditionImpl = invalidConditionOpt;
IgnoredConditionImpl = ignoredConditionOpt;
}
protected override IOperation ConditionImpl { get; }
protected override IOperation BodyImpl { get; }
protected override IOperation InvalidConditionImpl { get; }
protected override IOperation IgnoredConditionImpl { get; }
}
/// <summary>
......@@ -5098,18 +5098,18 @@ internal sealed partial class LazyDoLoopStatement : BaseDoLoopStatement, IDoLoop
{
private readonly Lazy<IOperation> _lazyCondition;
private readonly Lazy<IOperation> _lazyBody;
private readonly Lazy<IOperation> _lazyInvalidCondition;
private readonly Lazy<IOperation> _lazyIgnoredCondition;
public LazyDoLoopStatement(DoLoopKind doLoopKind, Lazy<IOperation> condition, Lazy<IOperation> body, Lazy<IOperation> invalidCondition, ImmutableArray<ILocalSymbol> locals, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
public LazyDoLoopStatement(DoLoopKind doLoopKind, Lazy<IOperation> condition, Lazy<IOperation> body, Lazy<IOperation> ignoredCondition, ImmutableArray<ILocalSymbol> locals, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(doLoopKind, locals, semanticModel, syntax, type, constantValue, isImplicit)
{
_lazyCondition = condition ?? throw new System.ArgumentNullException(nameof(condition));
_lazyBody = body ?? throw new System.ArgumentNullException(nameof(body));
_lazyInvalidCondition = invalidCondition ?? throw new System.ArgumentNullException(nameof(invalidCondition));
_lazyIgnoredCondition = ignoredCondition ?? throw new System.ArgumentNullException(nameof(ignoredCondition));
}
protected override IOperation ConditionImpl => _lazyCondition.Value;
protected override IOperation BodyImpl => _lazyBody.Value;
protected override IOperation InvalidConditionImpl => _lazyInvalidCondition.Value;
protected override IOperation IgnoredConditionImpl => _lazyIgnoredCondition.Value;
}
/// <summary>
......
......@@ -22,12 +22,12 @@ public interface IDoLoopStatement : ILoopStatement
DoLoopKind DoLoopKind { get; }
/// <summary>
/// Additional conditional supplied for loop in error cases.
/// Additional conditional supplied for loop in error cases, which is ignored by the compiler.
/// For example, for VB 'Do While' or 'Do Until' loop with syntax errors where both the top and bottom conditions are provided.
/// The top condition is preferred and exposed as <see cref="Condition"/> and the bottom condition is exposed by this property.
/// The top condition is preferred and exposed as <see cref="Condition"/> and the bottom condition is ignored and exposed by this property.
/// This property should be null for all non-error cases.
/// </summary>
IOperation InvalidCondition { get; }
IOperation IgnoredCondition { get; }
}
}
......@@ -22,7 +22,7 @@ public interface ILoopStatement : IOperation
/// </summary>
IOperation Body { get; }
/// <summary>
/// Declarations local to the loop.
/// Declared locals.
/// </summary>
ImmutableArray<ILocalSymbol> Locals { get; }
}
......
......@@ -86,7 +86,7 @@ public override IOperation VisitIfStatement(IIfStatement operation, object argum
public override IOperation VisitDoLoopStatement(IDoLoopStatement operation, object argument)
{
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);
return new DoLoopStatement(operation.DoLoopKind, Visit(operation.Condition), Visit(operation.Body), Visit(operation.IgnoredCondition), operation.Locals, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitWhileLoopStatement(IWhileLoopStatement operation, object argument)
......
......@@ -924,7 +924,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
Dim doLoopKind As DoLoopKind = GetDoLoopKind(boundDoLoopStatement)
Dim condition As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundDoLoopStatement.ConditionOpt))
Dim body As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundDoLoopStatement.Body))
Dim invalidConditionOpt As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function()
Dim ignoredConditionOpt As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function()
If doLoopKind = DoLoopKind.Invalid Then
Debug.Assert(boundDoLoopStatement.TopConditionOpt IsNot Nothing)
Debug.Assert(boundDoLoopStatement.BottomConditionOpt IsNot Nothing)
......@@ -940,7 +940,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
Dim type As ITypeSymbol = Nothing
Dim constantValue As [Optional](Of Object) = New [Optional](Of Object)()
Dim isImplicit As Boolean = boundDoLoopStatement.WasCompilerGenerated
Return New LazyDoLoopStatement(doLoopKind, condition, body, invalidConditionOpt, locals, _semanticModel, syntax, type, constantValue, isImplicit)
Return New LazyDoLoopStatement(doLoopKind, condition, body, ignoredConditionOpt, locals, _semanticModel, syntax, type, constantValue, isImplicit)
End Function
Private Shared Function GetDoLoopKind(boundDoLoopStatement As BoundDoLoopStatement) As DoLoopKind
......@@ -964,7 +964,9 @@ Namespace Microsoft.CodeAnalysis.Semantics
End Function
Private Function CreateBoundForToStatementOperation(boundForToStatement As BoundForToStatement) As IForToLoopStatement
Dim locals As ImmutableArray(Of ILocalSymbol) = If(boundForToStatement.DeclaredOrInferredLocalOpt IsNot Nothing, ImmutableArray.Create(Of ILocalSymbol)(boundForToStatement.DeclaredOrInferredLocalOpt), ImmutableArray(Of ILocalSymbol).Empty)
Dim locals As ImmutableArray(Of ILocalSymbol) = If(boundForToStatement.DeclaredOrInferredLocalOpt IsNot Nothing,
ImmutableArray.Create(Of ILocalSymbol)(boundForToStatement.DeclaredOrInferredLocalOpt),
ImmutableArray(Of ILocalSymbol).Empty)
Dim loopControlVariable As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForToStatement.ControlVariable))
Dim initialValue As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForToStatement.InitialValue))
Dim limitValue As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForToStatement.LimitValue))
......@@ -984,7 +986,9 @@ Namespace Microsoft.CodeAnalysis.Semantics
End Function
Private Function CreateBoundForEachStatementOperation(boundForEachStatement As BoundForEachStatement) As IForEachLoopStatement
Dim locals As ImmutableArray(Of ILocalSymbol) = If(boundForEachStatement.DeclaredOrInferredLocalOpt IsNot Nothing, ImmutableArray.Create(Of ILocalSymbol)(boundForEachStatement.DeclaredOrInferredLocalOpt), ImmutableArray(Of ILocalSymbol).Empty)
Dim locals As ImmutableArray(Of ILocalSymbol) = If(boundForEachStatement.DeclaredOrInferredLocalOpt IsNot Nothing,
ImmutableArray.Create(Of ILocalSymbol)(boundForEachStatement.DeclaredOrInferredLocalOpt),
ImmutableArray(Of ILocalSymbol).Empty)
Dim loopControlVariable As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForEachStatement.ControlVariable))
Dim collection As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForEachStatement.Collection))
Dim body As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForEachStatement.Body))
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports Microsoft.CodeAnalysis.Semantics
Imports Microsoft.CodeAnalysis.Test.Utilities
......@@ -34,7 +34,7 @@ IDoLoopStatement (DoLoopKind: DoWhileBottomLoop) (LoopKind.Do) (OperationKind.Lo
Condition: IBinaryOperatorExpression (BinaryOperatorKind.LessThan, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i < 4')
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 4) (Syntax: '4')
InvalidCondition: null
IgnoredCondition: null
Body: IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... While i < 4')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'sum += ids(i)')
Expression: ICompoundAssignmentExpression (BinaryOperatorKind.Add, Checked) (OperationKind.CompoundAssignmentExpression, Type: System.Int32) (Syntax: 'sum += ids(i)')
......@@ -71,7 +71,7 @@ IDoLoopStatement (DoLoopKind: DoUntilTopLoop) (LoopKind.Do) (OperationKind.LoopS
Left: IFieldReferenceExpression: C.X As System.Int32 (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'X')
Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'X')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
InvalidCondition: null
IgnoredCondition: null
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do Until X ... Loop')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'X = X - 1')
Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'X = X - 1')
......@@ -973,7 +973,7 @@ IDoLoopStatement (DoLoopKind: DoWhileTopLoop) (LoopKind.Do) (OperationKind.LoopS
Condition: IInvocationExpression ( Function C.G() As System.Boolean) (OperationKind.InvocationExpression, Type: System.Boolean) (Syntax: 'G()')
Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'G')
Arguments(0)
InvalidCondition: null
IgnoredCondition: null
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do While G( ... Loop')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Console.WriteLine(1)')
Expression: IInvocationExpression (Sub System.Console.WriteLine(value As System.Int32)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'Console.WriteLine(1)')
......@@ -1012,7 +1012,7 @@ IDoLoopStatement (DoLoopKind: DoWhileBottomLoop) (LoopKind.Do) (OperationKind.Lo
Condition: IInvocationExpression ( Function C.G() As System.Boolean) (OperationKind.InvocationExpression, Type: System.Boolean) (Syntax: 'G()')
Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'G')
Arguments(0)
InvalidCondition: null
IgnoredCondition: null
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... p While G()')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Console.WriteLine(1)')
Expression: IInvocationExpression (Sub System.Console.WriteLine(value As System.Int32)) (OperationKind.InvocationExpression, Type: System.Void) (Syntax: 'Console.WriteLine(1)')
......@@ -1046,7 +1046,7 @@ IDoLoopStatement (DoLoopKind: DoUntilBottomLoop) (LoopKind.Do) (OperationKind.Lo
Left: IFieldReferenceExpression: C.X As System.Int32 (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'X')
Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'X')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
InvalidCondition: null
IgnoredCondition: null
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... Until X < 0')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'X = X - 1')
Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (Syntax: 'X = X - 1')
......@@ -1128,7 +1128,7 @@ IDoLoopStatement (DoLoopKind: Invalid) (LoopKind.Do) (OperationKind.LoopStatemen
Condition: IBinaryOperatorExpression (BinaryOperatorKind.GreaterThan, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i > 0')
Left: IParameterReferenceExpression: i (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
InvalidCondition: IBinaryOperatorExpression (BinaryOperatorKind.LessThanOrEqual, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i <= 0')
IgnoredCondition: IBinaryOperatorExpression (BinaryOperatorKind.LessThanOrEqual, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i <= 0')
Left: IParameterReferenceExpression: i (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0')
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'Do While i ... ntil i <= 0')
......
......@@ -414,7 +414,7 @@ public override void VisitDoLoopStatement(IDoLoopStatement operation)
LogLoopStatementHeader(operation);
Visit(operation.Condition, "Condition");
Visit(operation.InvalidCondition, "InvalidCondition");
Visit(operation.IgnoredCondition, "IgnoredCondition");
Visit(operation.Body, "Body");
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册