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

Address PR feedback

上级 2796b59c
...@@ -1173,13 +1173,13 @@ private IDoLoopStatement CreateBoundDoStatementOperation(BoundDoStatement boundD ...@@ -1173,13 +1173,13 @@ private IDoLoopStatement CreateBoundDoStatementOperation(BoundDoStatement boundD
DoLoopKind doLoopKind = DoLoopKind.DoWhileBottomLoop; DoLoopKind doLoopKind = DoLoopKind.DoWhileBottomLoop;
Lazy<IOperation> condition = new Lazy<IOperation>(() => Create(boundDoStatement.Condition)); Lazy<IOperation> condition = new Lazy<IOperation>(() => Create(boundDoStatement.Condition));
Lazy<IOperation> body = new Lazy<IOperation>(() => Create(boundDoStatement.Body)); 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>(); ImmutableArray<ILocalSymbol> locals = boundDoStatement.Locals.As<ILocalSymbol>();
SyntaxNode syntax = boundDoStatement.Syntax; SyntaxNode syntax = boundDoStatement.Syntax;
ITypeSymbol type = null; ITypeSymbol type = null;
Optional<object> constantValue = default(Optional<object>); Optional<object> constantValue = default(Optional<object>);
bool isImplicit = boundDoStatement.WasCompilerGenerated; 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) private IForLoopStatement CreateBoundForStatementOperation(BoundForStatement boundForStatement)
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
using Roslyn.Test.Utilities; using Roslyn.Test.Utilities;
using Xunit; using Xunit;
namespace Microsoft.CodeAnalysis.CSharp.UnitTests namespace Microsoft.CodeAnalysis.CSharp.UnitTests
{ {
public partial class IOperationTests : SemanticModelTestBase public partial class IOperationTests : SemanticModelTestBase
...@@ -883,6 +882,38 @@ public static void M((int, int)[] x) ...@@ -883,6 +882,38 @@ public static void M((int, int)[] x)
VerifyOperationTreeAndDiagnosticsForTest<ForEachVariableStatementSyntax>(source, expectedOperationTree, expectedDiagnostics); 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)] [CompilerTrait(CompilerFeature.IOperation)]
[Fact, WorkItem(17602, "https://github.com/dotnet/roslyn/issues/17602")] [Fact, WorkItem(17602, "https://github.com/dotnet/roslyn/issues/17602")]
public void IForEachLoopStatement_WithInvalidLoopControlVariable() public void IForEachLoopStatement_WithInvalidLoopControlVariable()
...@@ -956,5 +987,37 @@ public static void M((int, int)[] x) ...@@ -956,5 +987,37 @@ public static void M((int, int)[] x)
VerifyOperationTreeAndDiagnosticsForTest<BlockSyntax>(source, expectedOperationTree, expectedDiagnostics); 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() ...@@ -37,7 +37,7 @@ static void Main()
Condition: IBinaryOperatorExpression (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i < 4') Condition: IBinaryOperatorExpression (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i < 4')
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i') Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 4) (Syntax: '4') Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 4) (Syntax: '4')
InvalidCondition: null IgnoredCondition: null
Body: IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }') Body: IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'sum += ids[i];') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'sum += ids[i];')
Expression: ICompoundAssignmentExpression (BinaryOperatorKind.Add) (OperationKind.CompoundAssignmentExpression, Type: System.Int32) (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) ...@@ -1065,7 +1065,7 @@ static bool TakeOutParam<T>(T y, out T x)
Operand: ILocalReferenceExpression: x1 (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'x1') Operand: ILocalReferenceExpression: x1 (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'x1')
InConversion: null InConversion: null
OutConversion: null OutConversion: null
InvalidCondition: null IgnoredCondition: null
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }') Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: '{ ... }')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'f = false;') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'f = false;')
Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'f = false') Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Boolean) (Syntax: 'f = false')
......
...@@ -5040,16 +5040,16 @@ internal abstract partial class BaseDoLoopStatement : LoopStatement, IDoLoopStat ...@@ -5040,16 +5040,16 @@ internal abstract partial class BaseDoLoopStatement : LoopStatement, IDoLoopStat
/// </summary> /// </summary>
public DoLoopKind DoLoopKind { get; } public DoLoopKind DoLoopKind { get; }
protected abstract IOperation ConditionImpl { get; } protected abstract IOperation ConditionImpl { get; }
protected abstract IOperation InvalidConditionImpl { get; } protected abstract IOperation IgnoredConditionImpl { get; }
public override IEnumerable<IOperation> Children public override IEnumerable<IOperation> Children
{ {
get get
{ {
yield return Condition; yield return Condition;
yield return Body; yield return Body;
if (InvalidCondition != null) if (IgnoredCondition != null)
{ {
yield return InvalidCondition; yield return IgnoredCondition;
} }
} }
} }
...@@ -5058,12 +5058,12 @@ public override IEnumerable<IOperation> Children ...@@ -5058,12 +5058,12 @@ public override IEnumerable<IOperation> Children
/// </summary> /// </summary>
public IOperation Condition => Operation.SetParentOperation(ConditionImpl, this); public IOperation Condition => Operation.SetParentOperation(ConditionImpl, this);
/// <summary> /// <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. /// 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. /// This property should be null for all non-error cases.
/// </summary> /// </summary>
public IOperation InvalidCondition => Operation.SetParentOperation(InvalidConditionImpl, this); public IOperation IgnoredCondition => Operation.SetParentOperation(IgnoredConditionImpl, this);
public override void Accept(OperationVisitor visitor) public override void Accept(OperationVisitor visitor)
{ {
visitor.VisitDoLoopStatement(this); visitor.VisitDoLoopStatement(this);
...@@ -5079,16 +5079,16 @@ public override void Accept(OperationVisitor visitor) ...@@ -5079,16 +5079,16 @@ public override void Accept(OperationVisitor visitor)
/// </summary> /// </summary>
internal sealed partial class DoLoopStatement : BaseDoLoopStatement, IDoLoopStatement 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) base(doLoopKind, locals, semanticModel, syntax, type, constantValue, isImplicit)
{ {
ConditionImpl = condition; ConditionImpl = condition;
BodyImpl = body; BodyImpl = body;
InvalidConditionImpl = invalidConditionOpt; IgnoredConditionImpl = ignoredConditionOpt;
} }
protected override IOperation ConditionImpl { get; } protected override IOperation ConditionImpl { get; }
protected override IOperation BodyImpl { get; } protected override IOperation BodyImpl { get; }
protected override IOperation InvalidConditionImpl { get; } protected override IOperation IgnoredConditionImpl { get; }
} }
/// <summary> /// <summary>
...@@ -5098,18 +5098,18 @@ internal sealed partial class LazyDoLoopStatement : BaseDoLoopStatement, IDoLoop ...@@ -5098,18 +5098,18 @@ internal sealed partial class LazyDoLoopStatement : BaseDoLoopStatement, IDoLoop
{ {
private readonly Lazy<IOperation> _lazyCondition; private readonly Lazy<IOperation> _lazyCondition;
private readonly Lazy<IOperation> _lazyBody; 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) base(doLoopKind, locals, semanticModel, syntax, type, constantValue, isImplicit)
{ {
_lazyCondition = condition ?? throw new System.ArgumentNullException(nameof(condition)); _lazyCondition = condition ?? throw new System.ArgumentNullException(nameof(condition));
_lazyBody = body ?? throw new System.ArgumentNullException(nameof(body)); _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 ConditionImpl => _lazyCondition.Value;
protected override IOperation BodyImpl => _lazyBody.Value; protected override IOperation BodyImpl => _lazyBody.Value;
protected override IOperation InvalidConditionImpl => _lazyInvalidCondition.Value; protected override IOperation IgnoredConditionImpl => _lazyIgnoredCondition.Value;
} }
/// <summary> /// <summary>
......
...@@ -22,12 +22,12 @@ public interface IDoLoopStatement : ILoopStatement ...@@ -22,12 +22,12 @@ public interface IDoLoopStatement : ILoopStatement
DoLoopKind DoLoopKind { get; } DoLoopKind DoLoopKind { get; }
/// <summary> /// <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. /// 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. /// This property should be null for all non-error cases.
/// </summary> /// </summary>
IOperation InvalidCondition { get; } IOperation IgnoredCondition { get; }
} }
} }
...@@ -22,7 +22,7 @@ public interface ILoopStatement : IOperation ...@@ -22,7 +22,7 @@ public interface ILoopStatement : IOperation
/// </summary> /// </summary>
IOperation Body { get; } IOperation Body { get; }
/// <summary> /// <summary>
/// Declarations local to the loop. /// Declared locals.
/// </summary> /// </summary>
ImmutableArray<ILocalSymbol> Locals { get; } ImmutableArray<ILocalSymbol> Locals { get; }
} }
......
...@@ -86,7 +86,7 @@ public override IOperation VisitIfStatement(IIfStatement operation, object argum ...@@ -86,7 +86,7 @@ public override IOperation VisitIfStatement(IIfStatement operation, object argum
public override IOperation VisitDoLoopStatement(IDoLoopStatement operation, object argument) 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) public override IOperation VisitWhileLoopStatement(IWhileLoopStatement operation, object argument)
......
...@@ -924,7 +924,7 @@ Namespace Microsoft.CodeAnalysis.Semantics ...@@ -924,7 +924,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
Dim doLoopKind As DoLoopKind = GetDoLoopKind(boundDoLoopStatement) Dim doLoopKind As DoLoopKind = GetDoLoopKind(boundDoLoopStatement)
Dim condition As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundDoLoopStatement.ConditionOpt)) 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 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 If doLoopKind = DoLoopKind.Invalid Then
Debug.Assert(boundDoLoopStatement.TopConditionOpt IsNot Nothing) Debug.Assert(boundDoLoopStatement.TopConditionOpt IsNot Nothing)
Debug.Assert(boundDoLoopStatement.BottomConditionOpt IsNot Nothing) Debug.Assert(boundDoLoopStatement.BottomConditionOpt IsNot Nothing)
...@@ -940,7 +940,7 @@ Namespace Microsoft.CodeAnalysis.Semantics ...@@ -940,7 +940,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
Dim type As ITypeSymbol = Nothing Dim type As ITypeSymbol = Nothing
Dim constantValue As [Optional](Of Object) = New [Optional](Of Object)() Dim constantValue As [Optional](Of Object) = New [Optional](Of Object)()
Dim isImplicit As Boolean = boundDoLoopStatement.WasCompilerGenerated 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 End Function
Private Shared Function GetDoLoopKind(boundDoLoopStatement As BoundDoLoopStatement) As DoLoopKind Private Shared Function GetDoLoopKind(boundDoLoopStatement As BoundDoLoopStatement) As DoLoopKind
...@@ -964,7 +964,9 @@ Namespace Microsoft.CodeAnalysis.Semantics ...@@ -964,7 +964,9 @@ Namespace Microsoft.CodeAnalysis.Semantics
End Function End Function
Private Function CreateBoundForToStatementOperation(boundForToStatement As BoundForToStatement) As IForToLoopStatement 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 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 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)) Dim limitValue As Lazy(Of IOperation) = New Lazy(Of IOperation)(Function() Create(boundForToStatement.LimitValue))
...@@ -984,7 +986,9 @@ Namespace Microsoft.CodeAnalysis.Semantics ...@@ -984,7 +986,9 @@ Namespace Microsoft.CodeAnalysis.Semantics
End Function End Function
Private Function CreateBoundForEachStatementOperation(boundForEachStatement As BoundForEachStatement) As IForEachLoopStatement 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 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 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)) 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.Semantics
Imports Microsoft.CodeAnalysis.Test.Utilities Imports Microsoft.CodeAnalysis.Test.Utilities
...@@ -34,7 +34,7 @@ IDoLoopStatement (DoLoopKind: DoWhileBottomLoop) (LoopKind.Do) (OperationKind.Lo ...@@ -34,7 +34,7 @@ IDoLoopStatement (DoLoopKind: DoWhileBottomLoop) (LoopKind.Do) (OperationKind.Lo
Condition: IBinaryOperatorExpression (BinaryOperatorKind.LessThan, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i < 4') Condition: IBinaryOperatorExpression (BinaryOperatorKind.LessThan, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i < 4')
Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i') Left: ILocalReferenceExpression: i (OperationKind.LocalReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 4) (Syntax: '4') 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') Body: IBlockStatement (2 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... While i < 4')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'sum += ids(i)') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'sum += ids(i)')
Expression: ICompoundAssignmentExpression (BinaryOperatorKind.Add, Checked) (OperationKind.CompoundAssignmentExpression, Type: System.Int32) (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 ...@@ -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') Left: IFieldReferenceExpression: C.X As System.Int32 (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'X')
Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'X') Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'X')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0') 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') Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do Until X ... Loop')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'X = X - 1') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'X = X - 1')
Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (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 ...@@ -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()') Condition: IInvocationExpression ( Function C.G() As System.Boolean) (OperationKind.InvocationExpression, Type: System.Boolean) (Syntax: 'G()')
Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'G') Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'G')
Arguments(0) Arguments(0)
InvalidCondition: null IgnoredCondition: null
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do While G( ... Loop') Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do While G( ... Loop')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Console.WriteLine(1)') 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)') 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 ...@@ -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()') Condition: IInvocationExpression ( Function C.G() As System.Boolean) (OperationKind.InvocationExpression, Type: System.Boolean) (Syntax: 'G()')
Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'G') Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'G')
Arguments(0) Arguments(0)
InvalidCondition: null IgnoredCondition: null
Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... p While G()') Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... p While G()')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'Console.WriteLine(1)') 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)') 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 ...@@ -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') Left: IFieldReferenceExpression: C.X As System.Int32 (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'X')
Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'X') Instance Receiver: IInstanceReferenceExpression (OperationKind.InstanceReferenceExpression, Type: C) (Syntax: 'X')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0') 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') Body: IBlockStatement (1 statements) (OperationKind.BlockStatement) (Syntax: 'Do'BIND:"Do ... Until X < 0')
IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'X = X - 1') IExpressionStatement (OperationKind.ExpressionStatement) (Syntax: 'X = X - 1')
Expression: ISimpleAssignmentExpression (OperationKind.SimpleAssignmentExpression, Type: System.Int32) (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 ...@@ -1128,7 +1128,7 @@ IDoLoopStatement (DoLoopKind: Invalid) (LoopKind.Do) (OperationKind.LoopStatemen
Condition: IBinaryOperatorExpression (BinaryOperatorKind.GreaterThan, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i > 0') Condition: IBinaryOperatorExpression (BinaryOperatorKind.GreaterThan, Checked) (OperationKind.BinaryOperatorExpression, Type: System.Boolean) (Syntax: 'i > 0')
Left: IParameterReferenceExpression: i (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'i') Left: IParameterReferenceExpression: i (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0') 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') Left: IParameterReferenceExpression: i (OperationKind.ParameterReferenceExpression, Type: System.Int32) (Syntax: 'i')
Right: ILiteralExpression (OperationKind.LiteralExpression, Type: System.Int32, Constant: 0) (Syntax: '0') 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') Body: IBlockStatement (1 statements) (OperationKind.BlockStatement, IsInvalid) (Syntax: 'Do While i ... ntil i <= 0')
......
...@@ -414,7 +414,7 @@ public override void VisitDoLoopStatement(IDoLoopStatement operation) ...@@ -414,7 +414,7 @@ public override void VisitDoLoopStatement(IDoLoopStatement operation)
LogLoopStatementHeader(operation); LogLoopStatementHeader(operation);
Visit(operation.Condition, "Condition"); Visit(operation.Condition, "Condition");
Visit(operation.InvalidCondition, "InvalidCondition"); Visit(operation.IgnoredCondition, "IgnoredCondition");
Visit(operation.Body, "Body"); Visit(operation.Body, "Body");
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册