Implemented C# heirarchy changes discussed in design meeting.

上级 2951716a
...@@ -268,9 +268,9 @@ private ImmutableArray<IOperation> GetIOperationChildren(BoundNode boundNode) ...@@ -268,9 +268,9 @@ private ImmutableArray<IOperation> GetIOperationChildren(BoundNode boundNode)
return builder.ToImmutableAndFree(); return builder.ToImmutableAndFree();
} }
private IVariableDeclarationOperation CreateVariableDeclaration(BoundLocalDeclaration boundNode) private ISingleVariableDeclarationOperation CreateVariableDeclaration(BoundLocalDeclaration boundNode)
{ {
return (IVariableDeclarationOperation)_cache.GetOrAdd(boundNode, n => CreateVariableDeclarationInternal((BoundLocalDeclaration)n, n.Syntax)); return (ISingleVariableDeclarationOperation)_cache.GetOrAdd(boundNode, n => CreateVariableDeclarationInternal((BoundLocalDeclaration)n, n.Syntax));
} }
private IPlaceholderOperation CreateBoundDeconstructValuePlaceholderOperation(BoundDeconstructValuePlaceholder boundDeconstructValuePlaceholder) private IPlaceholderOperation CreateBoundDeconstructValuePlaceholderOperation(BoundDeconstructValuePlaceholder boundDeconstructValuePlaceholder)
...@@ -1506,6 +1506,7 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo ...@@ -1506,6 +1506,7 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo
SyntaxNode varStatement; SyntaxNode varStatement;
SyntaxNode varDeclaration; SyntaxNode varDeclaration;
SyntaxNode varDeclarator;
switch (kind) switch (kind)
{ {
case SyntaxKind.LocalDeclarationStatement: case SyntaxKind.LocalDeclarationStatement:
...@@ -1516,8 +1517,9 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo ...@@ -1516,8 +1517,9 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo
// var statement points to LocalDeclarationStatementSyntax // var statement points to LocalDeclarationStatementSyntax
varStatement = statement; varStatement = statement;
// var declaration points to VariableDeclaratorSyntax varDeclaration = statement.Declaration;
varDeclaration = statement.Declaration.Variables.First();
varDeclarator = statement.Declaration.Variables.First();
break; break;
} }
case SyntaxKind.VariableDeclarator: case SyntaxKind.VariableDeclarator:
...@@ -1526,8 +1528,10 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo ...@@ -1526,8 +1528,10 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo
// var statement points to VariableDeclarationSyntax // var statement points to VariableDeclarationSyntax
varStatement = node.Parent; varStatement = node.Parent;
varDeclaration = node.Parent;
// var declaration points to VariableDeclaratorSyntax // var declaration points to VariableDeclaratorSyntax
varDeclaration = node; varDeclarator = node;
break; break;
} }
default: default:
...@@ -1535,27 +1539,44 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo ...@@ -1535,27 +1539,44 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo
Debug.Fail($"Unexpected syntax: {kind}"); Debug.Fail($"Unexpected syntax: {kind}");
// otherwise, they points to whatever bound nodes are pointing to. // otherwise, they points to whatever bound nodes are pointing to.
varStatement = varDeclaration = node; varStatement = varDeclaration = varDeclarator = node;
break; break;
} }
} }
Lazy<ImmutableArray<IVariableDeclarationOperation>> declarations = new Lazy<ImmutableArray<IVariableDeclarationOperation>>(() => ImmutableArray.Create(CreateVariableDeclarationInternal(boundLocalDeclaration, varDeclaration)).CastArray<IVariableDeclarationOperation>()); Lazy<ImmutableArray<ISingleVariableDeclarationOperation>> declarations = new Lazy<ImmutableArray<ISingleVariableDeclarationOperation>>(() => ImmutableArray.Create(CreateVariableDeclarationInternal(boundLocalDeclaration, varDeclarator)));
// In the case of a for loop, varStatement and varDeclaration will be the same syntax node. We can only have one explicit operation, so make
// sure this node is implicit in that scenario
bool multiVariableImplicit = (varStatement == varDeclaration) || boundLocalDeclaration.WasCompilerGenerated;
// In C#, the MultiVariable initializer will always be null, but we can't pass null as the actual lazy. We assume that all lazy elements always exist
Lazy<IVariableInitializerOperation> initializer = new Lazy<IVariableInitializerOperation>(() => null);
IMultiVariableDeclarationOperation multiVariableDeclaration = new LazyMultiVariableDeclaration(declarations, initializer, _semanticModel, varDeclaration, null, default, multiVariableImplicit);
ITypeSymbol type = null; ITypeSymbol type = null;
Optional<object> constantValue = default(Optional<object>); Optional<object> constantValue = default(Optional<object>);
bool isImplicit = boundLocalDeclaration.WasCompilerGenerated; bool isImplicit = boundLocalDeclaration.WasCompilerGenerated;
return new LazyVariableDeclarationGroupOperation(declarations, _semanticModel, varStatement, type, constantValue, isImplicit); return new VariableDeclarationGroupOperation(ImmutableArray.Create(multiVariableDeclaration), _semanticModel, varStatement, type, constantValue, isImplicit);
} }
private IVariableDeclarationGroupOperation CreateBoundMultipleLocalDeclarationsOperation(BoundMultipleLocalDeclarations boundMultipleLocalDeclarations) private IVariableDeclarationGroupOperation CreateBoundMultipleLocalDeclarationsOperation(BoundMultipleLocalDeclarations boundMultipleLocalDeclarations)
{ {
Lazy<ImmutableArray<IVariableDeclarationOperation>> declarations = new Lazy<ImmutableArray<IVariableDeclarationOperation>>(() => Lazy<ImmutableArray<ISingleVariableDeclarationOperation>> declarations = new Lazy<ImmutableArray<ISingleVariableDeclarationOperation>>(() =>
boundMultipleLocalDeclarations.LocalDeclarations.SelectAsArray(declaration => (IVariableDeclarationOperation)CreateVariableDeclaration(declaration))); boundMultipleLocalDeclarations.LocalDeclarations.SelectAsArray(declaration => CreateVariableDeclaration(declaration)));
SyntaxNode syntax = boundMultipleLocalDeclarations.Syntax; // In C#, the MultiVariable initializer will always be null, but we can't pass null as the actual lazy. We assume that all lazy elements always exist
Lazy<IVariableInitializerOperation> initializer = new Lazy<IVariableInitializerOperation>(() => null);
// The syntax for the boundMultipleLocalDeclarations can either be a LocalDeclarationStatement or a VariableDeclaration, depending on the context
// (using/fixed/etc statements vs variable declaration). If the former, we make the MultiVariableDeclarationOperation implicit
SyntaxNode declarationGroupSyntax = boundMultipleLocalDeclarations.Syntax;
SyntaxNode declarationSyntax = declarationGroupSyntax.IsKind(SyntaxKind.LocalDeclarationStatement) ?
((LocalDeclarationStatementSyntax)declarationGroupSyntax).Declaration :
declarationGroupSyntax;
bool declarationIsImplicit = declarationGroupSyntax == declarationSyntax || boundMultipleLocalDeclarations.WasCompilerGenerated;
IMultiVariableDeclarationOperation multiVariableDeclaration = new LazyMultiVariableDeclaration(declarations, initializer, _semanticModel, declarationSyntax, null, default, declarationIsImplicit);
ITypeSymbol type = null; ITypeSymbol type = null;
Optional<object> constantValue = default(Optional<object>); Optional<object> constantValue = default(Optional<object>);
bool isImplicit = boundMultipleLocalDeclarations.WasCompilerGenerated; bool isImplicit = boundMultipleLocalDeclarations.WasCompilerGenerated;
return new LazyVariableDeclarationGroupOperation(declarations, _semanticModel, syntax, type, constantValue, isImplicit); return new VariableDeclarationGroupOperation(ImmutableArray.Create(multiVariableDeclaration), _semanticModel, declarationGroupSyntax, type, constantValue, isImplicit);
} }
private ILabeledOperation CreateBoundLabelStatementOperation(BoundLabelStatement boundLabelStatement) private ILabeledOperation CreateBoundLabelStatementOperation(BoundLabelStatement boundLabelStatement)
......
...@@ -304,17 +304,21 @@ public void F(int dimension) ...@@ -304,17 +304,21 @@ public void F(int dimension)
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int[] x = { 1, 2 };') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int[] x = { 1, 2 };')
ISingleVariableDeclarationOperation (Symbol: System.Int32[] x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x = { 1, 2 }') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int[] x = { 1, 2 }')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= { 1, 2 }') ISingleVariableDeclarationOperation (Symbol: System.Int32[] x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x = { 1, 2 }')
IArrayCreationOperation (OperationKind.ArrayCreation, Type: System.Int32[]) (Syntax: '{ 1, 2 }')
Dimension Sizes(1):
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 2, IsImplicit) (Syntax: '{ 1, 2 }')
Initializer: Initializer:
IArrayInitializerOperation (2 elements) (OperationKind.ArrayInitializer, Type: null) (Syntax: '{ 1, 2 }') IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= { 1, 2 }')
Element Values(2): IArrayCreationOperation (OperationKind.ArrayCreation, Type: System.Int32[]) (Syntax: '{ 1, 2 }')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 1) (Syntax: '1') Dimension Sizes(1):
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 2) (Syntax: '2') ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 2, IsImplicit) (Syntax: '{ 1, 2 }')
Initializer:
IArrayInitializerOperation (2 elements) (OperationKind.ArrayInitializer, Type: null) (Syntax: '{ 1, 2 }')
Element Values(2):
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 1) (Syntax: '1')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 2) (Syntax: '2')
Initializer:
null
"; ";
var expectedDiagnostics = DiagnosticDescription.None; var expectedDiagnostics = DiagnosticDescription.None;
......
...@@ -31,22 +31,26 @@ static void F() ...@@ -31,22 +31,26 @@ static void F()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'Action x = () => F();') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'Action x = () => F();')
ISingleVariableDeclarationOperation (Symbol: System.Action x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x = () => F()') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'Action x = () => F()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Action x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x = () => F()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= () => F()')
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action, IsImplicit) (Syntax: '() => F()')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null) (Syntax: '() => F()')
IBlockOperation (2 statements) (OperationKind.Block, Type: null, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
IReturnOperation (OperationKind.Return, Type: null, IsImplicit) (Syntax: 'F()')
ReturnedValue:
null
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= () => F()') null
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action, IsImplicit) (Syntax: '() => F()')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null) (Syntax: '() => F()')
IBlockOperation (2 statements) (OperationKind.Block, Type: null, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
IReturnOperation (OperationKind.Return, Type: null, IsImplicit) (Syntax: 'F()')
ReturnedValue:
null
"; ";
var expectedDiagnostics = DiagnosticDescription.None; var expectedDiagnostics = DiagnosticDescription.None;
...@@ -111,22 +115,26 @@ static void F() ...@@ -111,22 +115,26 @@ static void F()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'Action x = ... () => F());') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'Action x = ... () => F());')
ISingleVariableDeclarationOperation (Symbol: System.Action x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x = (Action)(() => F())') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'Action x = ... (() => F())')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Action x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x = (Action)(() => F())')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= (Action)(() => F())')
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action) (Syntax: '(Action)(() => F())')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null) (Syntax: '() => F()')
IBlockOperation (2 statements) (OperationKind.Block, Type: null, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
IReturnOperation (OperationKind.Return, Type: null, IsImplicit) (Syntax: 'F()')
ReturnedValue:
null
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= (Action)(() => F())') null
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action) (Syntax: '(Action)(() => F())')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null) (Syntax: '() => F()')
IBlockOperation (2 statements) (OperationKind.Block, Type: null, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
IReturnOperation (OperationKind.Return, Type: null, IsImplicit) (Syntax: 'F()')
ReturnedValue:
null
"; ";
var expectedDiagnostics = DiagnosticDescription.None; var expectedDiagnostics = DiagnosticDescription.None;
...@@ -191,17 +199,21 @@ static void F() ...@@ -191,17 +199,21 @@ static void F()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'var x = () => F();') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'var x = () => F();')
ISingleVariableDeclarationOperation (Symbol: var x) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'x = () => F()') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'var x = () => F()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: var x) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'x = () => F()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= () => F()')
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void, IsInvalid) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= () => F()') null
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void, IsInvalid) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS0815: Cannot assign lambda expression to an implicitly-typed variable // CS0815: Cannot assign lambda expression to an implicitly-typed variable
...@@ -233,19 +245,23 @@ static void F() ...@@ -233,19 +245,23 @@ static void F()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Action<int> ... () => F();') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Action<int> ... () => F();')
ISingleVariableDeclarationOperation (Symbol: System.Action<System.Int32> x) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'x = () => F()') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'Action<int> ... = () => F()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Action<System.Int32> x) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'x = () => F()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= () => F()')
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action<System.Int32>, IsInvalid, IsImplicit) (Syntax: '() => F()')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void, IsInvalid) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= () => F()') null
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action<System.Int32>, IsInvalid, IsImplicit) (Syntax: '() => F()')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void, IsInvalid) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS1593: Delegate 'Action<int>' does not take 0 arguments // CS1593: Delegate 'Action<int>' does not take 0 arguments
...@@ -277,25 +293,29 @@ static void F() ...@@ -277,25 +293,29 @@ static void F()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Action<int> ... () => F());') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Action<int> ... () => F());')
ISingleVariableDeclarationOperation (Symbol: System.Action<System.Int32> x) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'x = (Action)(() => F())') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'Action<int> ... (() => F())')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Action<System.Int32> x) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'x = (Action)(() => F())')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= (Action)(() => F())')
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Action<System.Int32>, IsInvalid, IsImplicit) (Syntax: '(Action)(() => F())')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action, IsInvalid) (Syntax: '(Action)(() => F())')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockOperation (2 statements) (OperationKind.Block, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void, IsInvalid) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
IReturnOperation (OperationKind.Return, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
ReturnedValue:
null
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= (Action)(() => F())') null
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Action<System.Int32>, IsInvalid, IsImplicit) (Syntax: '(Action)(() => F())')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action, IsInvalid) (Syntax: '(Action)(() => F())')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockOperation (2 statements) (OperationKind.Block, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void, IsInvalid) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
IReturnOperation (OperationKind.Return, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
ReturnedValue:
null
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS0029: Cannot implicitly convert type 'System.Action' to 'System.Action<int>' // CS0029: Cannot implicitly convert type 'System.Action' to 'System.Action<int>'
...@@ -327,19 +347,23 @@ static void F() ...@@ -327,19 +347,23 @@ static void F()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Action<int> ... () => F());') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Action<int> ... () => F());')
ISingleVariableDeclarationOperation (Symbol: System.Action<System.Int32> x) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'x = (Action ... (() => F())') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'Action<int> ... (() => F())')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Action<System.Int32> x) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'x = (Action ... (() => F())')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= (Action<i ... (() => F())')
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action<System.Int32>, IsInvalid) (Syntax: '(Action<int>)(() => F())')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void, IsInvalid) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= (Action<i ... (() => F())') null
IDelegateCreationOperation (OperationKind.DelegateCreation, Type: System.Action<System.Int32>, IsInvalid) (Syntax: '(Action<int>)(() => F())')
Target:
IAnonymousFunctionOperation (Symbol: lambda expression) (OperationKind.AnonymousFunction, Type: null, IsInvalid) (Syntax: '() => F()')
IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid, IsImplicit) (Syntax: 'F()')
Expression:
IInvocationOperation (void Program.F()) (OperationKind.Invocation, Type: System.Void, IsInvalid) (Syntax: 'F()')
Instance Receiver:
null
Arguments(0)
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS1593: Delegate 'Action<int>' does not take 0 arguments // CS1593: Delegate 'Action<int>' does not take 0 arguments
...@@ -378,7 +402,7 @@ static void F() ...@@ -378,7 +402,7 @@ static void F()
var lambdaSyntax = (LambdaExpressionSyntax)variableDeclaration.Declaration.Variables.Single().Initializer.Value; var lambdaSyntax = (LambdaExpressionSyntax)variableDeclaration.Declaration.Variables.Single().Initializer.Value;
var variableDeclarationOperation = (IVariableDeclarationGroupOperation)semanticModel.GetOperationInternal(variableDeclaration); var variableDeclarationOperation = (IVariableDeclarationGroupOperation)semanticModel.GetOperationInternal(variableDeclaration);
var variableTreeLambdaOperation = (IAnonymousFunctionOperation)variableDeclarationOperation.Declarations.Single().Initializer.Value; var variableTreeLambdaOperation = (IAnonymousFunctionOperation)variableDeclarationOperation.Declarations.Single().Declarations.Single().Initializer.Value;
var lambdaOperation = (IAnonymousFunctionOperation)semanticModel.GetOperationInternal(lambdaSyntax); var lambdaOperation = (IAnonymousFunctionOperation)semanticModel.GetOperationInternal(lambdaSyntax);
// Assert that both ways of getting to the lambda (requesting the lambda directly, and requesting via the lambda syntax) // Assert that both ways of getting to the lambda (requesting the lambda directly, and requesting via the lambda syntax)
...@@ -386,7 +410,7 @@ static void F() ...@@ -386,7 +410,7 @@ static void F()
Assert.Same(variableTreeLambdaOperation, lambdaOperation); Assert.Same(variableTreeLambdaOperation, lambdaOperation);
var variableDeclarationOperationSecondRequest = (IVariableDeclarationGroupOperation)semanticModel.GetOperationInternal(variableDeclaration); var variableDeclarationOperationSecondRequest = (IVariableDeclarationGroupOperation)semanticModel.GetOperationInternal(variableDeclaration);
var variableTreeLambdaOperationSecondRequest = (IAnonymousFunctionOperation)variableDeclarationOperation.Declarations.Single().Initializer.Value; var variableTreeLambdaOperationSecondRequest = (IAnonymousFunctionOperation)variableDeclarationOperation.Declarations.Single().Declarations.Single(). Initializer.Value;
var lambdaOperationSecondRequest = (IAnonymousFunctionOperation)semanticModel.GetOperationInternal(lambdaSyntax); var lambdaOperationSecondRequest = (IAnonymousFunctionOperation)semanticModel.GetOperationInternal(lambdaSyntax);
// Assert that, when request the variable declaration or the lambda for a second time, there is no rebinding of the // Assert that, when request the variable declaration or the lambda for a second time, there is no rebinding of the
......
...@@ -201,7 +201,11 @@ static void M(Task<int> t) ...@@ -201,7 +201,11 @@ static void M(Task<int> t)
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'await t;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'await t;')
ISingleVariableDeclarationOperation (Symbol: await t) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 't') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'await t')
Declarations:
ISingleVariableDeclarationOperation (Symbol: await t) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 't')
Initializer:
null
Initializer: Initializer:
null null
"; ";
......
...@@ -355,7 +355,7 @@ static void Main(string[] args) ...@@ -355,7 +355,7 @@ static void Main(string[] args)
}, },
OperationSelector = (operation) => OperationSelector = (operation) =>
{ {
var initializer = ((IVariableDeclarationOperation)operation).Initializer.Value; var initializer = ((ISingleVariableDeclarationOperation)operation).Initializer.Value;
return (IConversionOperation)((ICoalesceOperation)initializer).WhenNull; return (IConversionOperation)((ICoalesceOperation)initializer).WhenNull;
} }
}.Verify); }.Verify);
...@@ -3208,13 +3208,17 @@ static void M1() ...@@ -3208,13 +3208,17 @@ static void M1()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'object o = null;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'object o = null;')
ISingleVariableDeclarationOperation (Symbol: System.Object o) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'o = null') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'object o = null')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Object o) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'o = null')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= null')
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Object, Constant: null, IsImplicit) (Syntax: 'null')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null)
Operand:
ILiteralOperation (OperationKind.Literal, Type: null, Constant: null) (Syntax: 'null')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= null') null
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Object, Constant: null, IsImplicit) (Syntax: 'null')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null)
Operand:
ILiteralOperation (OperationKind.Literal, Type: null, Constant: null) (Syntax: 'null')
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS0219: The variable 'o' is assigned but its value is never used // CS0219: The variable 'o' is assigned but its value is never used
...@@ -3242,13 +3246,17 @@ void Main() ...@@ -3242,13 +3246,17 @@ void Main()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'Action<stri ... jectAction;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'Action<stri ... jectAction;')
ISingleVariableDeclarationOperation (Symbol: System.Action<System.String> stringAction) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'stringActio ... bjectAction') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'Action<stri ... bjectAction')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Action<System.String> stringAction) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'stringActio ... bjectAction')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= objectAction')
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Action<System.String>, IsImplicit) (Syntax: 'objectAction')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null)
Operand:
ILocalReferenceOperation: objectAction (OperationKind.LocalReference, Type: System.Action<System.Object>) (Syntax: 'objectAction')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= objectAction') null
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Action<System.String>, IsImplicit) (Syntax: 'objectAction')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null)
Operand:
ILocalReferenceOperation: objectAction (OperationKind.LocalReference, Type: System.Action<System.Object>) (Syntax: 'objectAction')
"; ";
var expectedDiagnostics = DiagnosticDescription.None; var expectedDiagnostics = DiagnosticDescription.None;
...@@ -3272,13 +3280,17 @@ void Main() ...@@ -3272,13 +3280,17 @@ void Main()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Action<int> ... jectAction;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Action<int> ... jectAction;')
ISingleVariableDeclarationOperation (Symbol: System.Action<System.Int32> intAction) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'intAction = objectAction') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'Action<int> ... bjectAction')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Action<System.Int32> intAction) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'intAction = objectAction')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= objectAction')
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Action<System.Int32>, IsInvalid, IsImplicit) (Syntax: 'objectAction')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
ILocalReferenceOperation: objectAction (OperationKind.LocalReference, Type: System.Action<System.Object>, IsInvalid) (Syntax: 'objectAction')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= objectAction') null
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Action<System.Int32>, IsInvalid, IsImplicit) (Syntax: 'objectAction')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
ILocalReferenceOperation: objectAction (OperationKind.LocalReference, Type: System.Action<System.Object>, IsInvalid) (Syntax: 'objectAction')
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS0029: Cannot implicitly convert type 'System.Action<object>' to 'System.Action<int>' // CS0029: Cannot implicitly convert type 'System.Action<object>' to 'System.Action<int>'
...@@ -4938,13 +4950,17 @@ static void M1() ...@@ -4938,13 +4950,17 @@ static void M1()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'object o = (object)null;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'object o = (object)null;')
ISingleVariableDeclarationOperation (Symbol: System.Object o) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'o = (object)null') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'object o = (object)null')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Object o) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'o = (object)null')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= (object)null')
IConversionOperation (Explicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Object, Constant: null) (Syntax: '(object)null')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null)
Operand:
ILiteralOperation (OperationKind.Literal, Type: null, Constant: null) (Syntax: 'null')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= (object)null') null
IConversionOperation (Explicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Object, Constant: null) (Syntax: '(object)null')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: True, IsUserDefined: False) (MethodSymbol: null)
Operand:
ILiteralOperation (OperationKind.Literal, Type: null, Constant: null) (Syntax: 'null')
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS0219: The variable 'o' is assigned but its value is never used // CS0219: The variable 'o' is assigned but its value is never used
...@@ -5025,8 +5041,11 @@ private class ExpectedSymbolVerifier ...@@ -5025,8 +5041,11 @@ private class ExpectedSymbolVerifier
public static IOperation IVariableDeclarationStatementSelector(IOperation operation) => public static IOperation IVariableDeclarationStatementSelector(IOperation operation) =>
((IVariableDeclarationGroupOperation)operation).Declarations.Single().Initializer; ((IVariableDeclarationGroupOperation)operation).Declarations.Single().Initializer;
public static IOperation IVariableDeclarationSelector(IOperation operation) => public static IOperation IMultiVariableDeclarationSelector(IOperation operation) =>
((IVariableDeclarationOperation)operation).Initializer.Value; ((IMultiVariableDeclarationOperation)operation).Initializer.Value;
public static IOperation ISingleVariableDeclarationSelector(IOperation operation) =>
((ISingleVariableDeclarationOperation)operation).Initializer.Value;
public static IOperation IReturnDeclarationStatementSelector(IOperation operation) => public static IOperation IReturnDeclarationStatementSelector(IOperation operation) =>
((IReturnOperation)operation).ReturnedValue; ((IReturnOperation)operation).ReturnedValue;
...@@ -5108,8 +5127,10 @@ private IOperation GetAndInvokeOperationSelector(IOperation operation) ...@@ -5108,8 +5127,10 @@ private IOperation GetAndInvokeOperationSelector(IOperation operation)
{ {
case IVariableDeclarationGroupOperation _: case IVariableDeclarationGroupOperation _:
return IVariableDeclarationStatementSelector(operation); return IVariableDeclarationStatementSelector(operation);
case IVariableDeclarationOperation _: case IMultiVariableDeclarationOperation _:
return IVariableDeclarationSelector(operation); return IMultiVariableDeclarationSelector(operation);
case ISingleVariableDeclarationOperation _:
return ISingleVariableDeclarationSelector(operation);
case IReturnOperation _: case IReturnOperation _:
return IReturnDeclarationStatementSelector(operation); return IReturnDeclarationStatementSelector(operation);
case IConversionOperation conv: case IConversionOperation conv:
......
...@@ -36,16 +36,20 @@ void M1() ...@@ -36,16 +36,20 @@ void M1()
IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed(int * ... }') IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed(int * ... }')
Children(2): Children(2):
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int *p = &i') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int *p = &i')
ISingleVariableDeclarationOperation (Symbol: System.Int32* p) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p = &i') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'int *p = &i')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32* p) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p = &i')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i')
IOperation: (OperationKind.None, Type: null) (Syntax: '&i')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i')
Reference:
IFieldReferenceOperation: System.Int32 C.i (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i') null
IOperation: (OperationKind.None, Type: null) (Syntax: '&i')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i')
Reference:
IFieldReferenceOperation: System.Int32 C.i (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i')
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... is {*p}"");') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... is {*p}"");')
Expression: Expression:
...@@ -105,27 +109,31 @@ void M1() ...@@ -105,27 +109,31 @@ void M1()
string expectedOperationTree = @" string expectedOperationTree = @"
IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed (int* ... }') IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed (int* ... }')
Children(2): Children(2):
IVariableDeclarationGroupOperation (2 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p1 = &i1, p2 = &i2') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p1 = &i1, p2 = &i2')
ISingleVariableDeclarationOperation (Symbol: System.Int32* p1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p1 = &i1') IMultiVariableDeclarationOperation (2 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'int* p1 = &i1, p2 = &i2')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i1') ISingleVariableDeclarationOperation (Symbol: System.Int32* p1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p1 = &i1')
IOperation: (OperationKind.None, Type: null) (Syntax: '&i1') Initializer:
Children(1): IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i1')
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i1') IOperation: (OperationKind.None, Type: null) (Syntax: '&i1')
Reference: Children(1):
IFieldReferenceOperation: System.Int32 C.i1 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i1') IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i1')
Instance Receiver: Reference:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i1') IFieldReferenceOperation: System.Int32 C.i1 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i1')
ISingleVariableDeclarationOperation (Symbol: System.Int32* p2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p2 = &i2') Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i1')
ISingleVariableDeclarationOperation (Symbol: System.Int32* p2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p2 = &i2')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i2')
IOperation: (OperationKind.None, Type: null) (Syntax: '&i2')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i2')
Reference:
IFieldReferenceOperation: System.Int32 C.i2 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i2')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i2')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i2') null
IOperation: (OperationKind.None, Type: null) (Syntax: '&i2')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i2')
Reference:
IFieldReferenceOperation: System.Int32 C.i2 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i2')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i2')
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'i3 = *p1 + *p2;') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'i3 = *p1 + *p2;')
Expression: Expression:
...@@ -181,29 +189,37 @@ void M1() ...@@ -181,29 +189,37 @@ void M1()
IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed (int* ... }') IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed (int* ... }')
Children(2): Children(2):
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p1 = &i1') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p1 = &i1')
ISingleVariableDeclarationOperation (Symbol: System.Int32* p1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p1 = &i1') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'int* p1 = &i1')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32* p1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p1 = &i1')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i1')
IOperation: (OperationKind.None, Type: null) (Syntax: '&i1')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i1')
Reference:
IFieldReferenceOperation: System.Int32 C.i1 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i1')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i1')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i1') null
IOperation: (OperationKind.None, Type: null) (Syntax: '&i1')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i1')
Reference:
IFieldReferenceOperation: System.Int32 C.i1 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i1')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i1')
IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed (int* ... }') IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed (int* ... }')
Children(2): Children(2):
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p2 = &i2') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p2 = &i2')
ISingleVariableDeclarationOperation (Symbol: System.Int32* p2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p2 = &i2') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'int* p2 = &i2')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32* p2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p2 = &i2')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i2')
IOperation: (OperationKind.None, Type: null) (Syntax: '&i2')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i2')
Reference:
IFieldReferenceOperation: System.Int32 C.i2 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i2')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i2')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i2') null
IOperation: (OperationKind.None, Type: null) (Syntax: '&i2')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i2')
Reference:
IFieldReferenceOperation: System.Int32 C.i2 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i2')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i2')
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'i3 = *p1 + *p2;') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'i3 = *p1 + *p2;')
Expression: Expression:
...@@ -254,11 +270,15 @@ void M1() ...@@ -254,11 +270,15 @@ void M1()
IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'fixed (int* ... }') IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'fixed (int* ... }')
Children(2): Children(2):
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'int* p1 =') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'int* p1 =')
ISingleVariableDeclarationOperation (Symbol: System.Int32* p1) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'p1 =') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid, IsImplicit) (Syntax: 'int* p1 =')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32* p1) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'p1 =')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '=')
IInvalidOperation (OperationKind.Invalid, Type: null, IsInvalid) (Syntax: '')
Children(0)
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '=') null
IInvalidOperation (OperationKind.Invalid, Type: null, IsInvalid) (Syntax: '')
Children(0)
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'i3 = *p1;') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'i3 = *p1;')
Expression: Expression:
...@@ -308,16 +328,20 @@ void M1() ...@@ -308,16 +328,20 @@ void M1()
IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'fixed (int* ... }') IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'fixed (int* ... }')
Children(2): Children(2):
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p1 = &i1') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p1 = &i1')
ISingleVariableDeclarationOperation (Symbol: System.Int32* p1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p1 = &i1') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'int* p1 = &i1')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32* p1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p1 = &i1')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i1')
IOperation: (OperationKind.None, Type: null) (Syntax: '&i1')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i1')
Reference:
IFieldReferenceOperation: System.Int32 C.i1 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i1')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i1')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= &i1') null
IOperation: (OperationKind.None, Type: null) (Syntax: '&i1')
Children(1):
IAddressOfOperation (OperationKind.AddressOf, Type: System.Int32*) (Syntax: '&i1')
Reference:
IFieldReferenceOperation: System.Int32 C.i1 (OperationKind.FieldReference, Type: System.Int32) (Syntax: 'i1')
Instance Receiver:
IInstanceReferenceOperation (OperationKind.InstanceReference, Type: C, IsImplicit) (Syntax: 'i1')
IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsInvalid) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsInvalid) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid) (Syntax: 'i3 = &p1;') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid) (Syntax: 'i3 = &p1;')
Expression: Expression:
......
...@@ -584,20 +584,24 @@ static void Main() ...@@ -584,20 +584,24 @@ static void Main()
IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Boolean b Locals: Local_1: System.Boolean b
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'bool b = !x ... uals(null);') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'bool b = !x ... uals(null);')
ISingleVariableDeclarationOperation (Symbol: System.Boolean b) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'b = !x.Equals(null)') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'bool b = !x.Equals(null)')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Boolean b) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'b = !x.Equals(null)')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= !x.Equals(null)')
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Boolean, IsImplicit) (Syntax: '!x.Equals(null)')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
IUnaryOperation (UnaryOperatorKind.Not) (OperationKind.UnaryOperator, Type: System.Object) (Syntax: '!x.Equals(null)')
Operand:
IInvalidOperation (OperationKind.Invalid, Type: ?) (Syntax: 'x.Equals(null)')
Children(2):
IOperation: (OperationKind.None, Type: null) (Syntax: 'x.Equals')
Children(1):
ILocalReferenceOperation: x (OperationKind.LocalReference, Type: MissingType) (Syntax: 'x')
ILiteralOperation (OperationKind.Literal, Type: null, Constant: null) (Syntax: 'null')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= !x.Equals(null)') null
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.Boolean, IsImplicit) (Syntax: '!x.Equals(null)')
Conversion: CommonConversion (Exists: True, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
IUnaryOperation (UnaryOperatorKind.Not) (OperationKind.UnaryOperator, Type: System.Object) (Syntax: '!x.Equals(null)')
Operand:
IInvalidOperation (OperationKind.Invalid, Type: ?) (Syntax: 'x.Equals(null)')
Children(2):
IOperation: (OperationKind.None, Type: null) (Syntax: 'x.Equals')
Children(1):
ILocalReferenceOperation: x (OperationKind.LocalReference, Type: MissingType) (Syntax: 'x')
ILiteralOperation (OperationKind.Literal, Type: null, Constant: null) (Syntax: 'null')
NextVariables(0) NextVariables(0)
"; ";
VerifyOperationTreeForTest<ForEachStatementSyntax>(source, expectedOperationTree); VerifyOperationTreeForTest<ForEachStatementSyntax>(source, expectedOperationTree);
......
...@@ -34,13 +34,17 @@ public static void M1() ...@@ -34,13 +34,17 @@ public static void M1()
IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (var ... }') IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (var ... }')
Resources: Resources:
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c = new C()') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c = new C()')
ISingleVariableDeclarationOperation (Symbol: C c) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c = new C()') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'var c = new C()')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()') ISingleVariableDeclarationOperation (Symbol: C c) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c = new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
Initializer:
null
Body: Body:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
...@@ -88,21 +92,25 @@ public static void M1() ...@@ -88,21 +92,25 @@ public static void M1()
string expectedOperationTree = @" string expectedOperationTree = @"
IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (C c1 ... }') IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (C c1 ... }')
Resources: Resources:
IVariableDeclarationGroupOperation (2 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'C c1 = new ... 2 = new C()') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'C c1 = new ... 2 = new C()')
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()') IMultiVariableDeclarationOperation (2 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'C c1 = new ... 2 = new C()')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()') ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()') IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Initializer: Arguments(0)
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()') Initializer:
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()') null
Arguments(0) ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()')
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
Initializer:
null
Body: Body:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
...@@ -199,24 +207,32 @@ public static void M1() ...@@ -199,24 +207,32 @@ public static void M1()
IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (var ... }') IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (var ... }')
Resources: Resources:
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c1 = new C()') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c1 = new C()')
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'var c1 = new C()')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()') ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
Initializer:
null
Body: Body:
IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (var ... }') IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (var ... }')
Resources: Resources:
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c2 = new C()') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c2 = new C()')
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'var c2 = new C()')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()') ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
Initializer:
null
Body: Body:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
...@@ -331,21 +347,25 @@ public static void M1() ...@@ -331,21 +347,25 @@ public static void M1()
string expectedOperationTree = @" string expectedOperationTree = @"
IUsingOperation (OperationKind.Using, Type: null, IsInvalid) (Syntax: 'using (var ... }') IUsingOperation (OperationKind.Using, Type: null, IsInvalid) (Syntax: 'using (var ... }')
Resources: Resources:
IVariableDeclarationGroupOperation (2 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'var c1 = ne ... 2 = new C()') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'var c1 = ne ... 2 = new C()')
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c1 = new C()') IMultiVariableDeclarationOperation (2 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid, IsImplicit) (Syntax: 'var c1 = ne ... 2 = new C()')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= new C()') ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c1 = new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C, IsInvalid) (Syntax: 'new C()')
Arguments(0)
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= new C()')
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c2 = new C()') IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C, IsInvalid) (Syntax: 'new C()')
Initializer: Arguments(0)
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= new C()') Initializer:
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C, IsInvalid) (Syntax: 'new C()') null
Arguments(0) ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c2 = new C()')
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C, IsInvalid) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
Initializer:
null
Body: Body:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
...@@ -409,21 +429,29 @@ public static void M1() ...@@ -409,21 +429,29 @@ public static void M1()
Locals: Local_1: C c1 Locals: Local_1: C c1
Local_2: C c2 Local_2: C c2
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c1 = new C();') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c1 = new C();')
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'var c1 = new C()')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()') ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c2 = new C();') IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()') Arguments(0)
Initializer:
null
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()') null
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c2 = new C();')
Arguments(0) IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'var c2 = new C()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()')
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
Initializer:
null
IUsingOperation (OperationKind.Using, Type: null, IsInvalid) (Syntax: 'using (c1') IUsingOperation (OperationKind.Using, Type: null, IsInvalid) (Syntax: 'using (c1')
Resources: Resources:
ILocalReferenceOperation: c1 (OperationKind.LocalReference, Type: C, IsInvalid) (Syntax: 'c1') ILocalReferenceOperation: c1 (OperationKind.LocalReference, Type: C, IsInvalid) (Syntax: 'c1')
...@@ -504,13 +532,17 @@ public static void M1() ...@@ -504,13 +532,17 @@ public static void M1()
IUsingOperation (OperationKind.Using, Type: null, IsInvalid) (Syntax: 'using (var ... }') IUsingOperation (OperationKind.Using, Type: null, IsInvalid) (Syntax: 'using (var ... }')
Resources: Resources:
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'var c1 = new C()') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'var c1 = new C()')
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c1 = new C()') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid, IsImplicit) (Syntax: 'var c1 = new C()')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= new C()') ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c1 = new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C, IsInvalid) (Syntax: 'new C()')
Arguments(0)
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C, IsInvalid) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
Initializer:
null
Body: Body:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());') IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
...@@ -758,13 +790,17 @@ public static void M1() ...@@ -758,13 +790,17 @@ public static void M1()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c = new C()') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c = new C()')
ISingleVariableDeclarationOperation (Symbol: C c) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c = new C()') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'var c = new C()')
Initializer: Declarations:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()') ISingleVariableDeclarationOperation (Symbol: C c) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c = new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer: Initializer:
null IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
Initializer:
null
"; ";
var expectedDiagnostics = DiagnosticDescription.None; var expectedDiagnostics = DiagnosticDescription.None;
......
...@@ -145,12 +145,16 @@ static void Main() ...@@ -145,12 +145,16 @@ static void Main()
IBlockOperation (2 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (2 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 value Locals: Local_1: System.Int32 value
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int value = ++index;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int value = ++index;')
ISingleVariableDeclarationOperation (Symbol: System.Int32 value) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'value = ++index') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int value = ++index')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 value) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'value = ++index')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= ++index')
IIncrementOrDecrementOperation (Prefix) (OperationKind.Increment, Type: System.Int32) (Syntax: '++index')
Target:
ILocalReferenceOperation: index (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'index')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= ++index') null
IIncrementOrDecrementOperation (Prefix) (OperationKind.Increment, Type: System.Int32) (Syntax: '++index')
Target:
ILocalReferenceOperation: index (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'index')
IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }') IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }')
Condition: Condition:
IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 10') IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 10')
...@@ -206,12 +210,16 @@ static void Main() ...@@ -206,12 +210,16 @@ static void Main()
IBlockOperation (3 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (3 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 value Locals: Local_1: System.Int32 value
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int value = ++index;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int value = ++index;')
ISingleVariableDeclarationOperation (Symbol: System.Int32 value) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'value = ++index') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int value = ++index')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 value) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'value = ++index')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= ++index')
IIncrementOrDecrementOperation (Prefix) (OperationKind.Increment, Type: System.Int32) (Syntax: '++index')
Target:
ILocalReferenceOperation: index (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'index')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= ++index') null
IIncrementOrDecrementOperation (Prefix) (OperationKind.Increment, Type: System.Int32) (Syntax: '++index')
Target:
ILocalReferenceOperation: index (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'index')
IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }') IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }')
Condition: Condition:
IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 5') IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 5')
...@@ -280,12 +288,16 @@ static void Main() ...@@ -280,12 +288,16 @@ static void Main()
IBlockOperation (3 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (3 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 value Locals: Local_1: System.Int32 value
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int value = ++index;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int value = ++index;')
ISingleVariableDeclarationOperation (Symbol: System.Int32 value) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'value = ++index') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int value = ++index')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 value) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'value = ++index')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= ++index')
IIncrementOrDecrementOperation (Prefix) (OperationKind.Increment, Type: System.Int32) (Syntax: '++index')
Target:
ILocalReferenceOperation: index (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'index')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= ++index') null
IIncrementOrDecrementOperation (Prefix) (OperationKind.Increment, Type: System.Int32) (Syntax: '++index')
Target:
ILocalReferenceOperation: index (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'index')
IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }') IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }')
Condition: Condition:
IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 100') IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 100')
...@@ -571,12 +583,16 @@ static void Main() ...@@ -571,12 +583,16 @@ static void Main()
IBlockOperation (2 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (2 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 value Locals: Local_1: System.Int32 value
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int value = ++index;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int value = ++index;')
ISingleVariableDeclarationOperation (Symbol: System.Int32 value) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'value = ++index') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int value = ++index')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 value) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'value = ++index')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= ++index')
IIncrementOrDecrementOperation (Prefix) (OperationKind.Increment, Type: System.Int32) (Syntax: '++index')
Target:
ILocalReferenceOperation: index (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'index')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= ++index') null
IIncrementOrDecrementOperation (Prefix) (OperationKind.Increment, Type: System.Int32) (Syntax: '++index')
Target:
ILocalReferenceOperation: index (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'index')
IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }') IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }')
Condition: Condition:
IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 100') IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 100')
...@@ -734,10 +750,14 @@ static void Main() ...@@ -734,10 +750,14 @@ static void Main()
Target: Target:
ILocalReferenceOperation: i (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'i') ILocalReferenceOperation: i (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'i')
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int j = 0;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int j = 0;')
ISingleVariableDeclarationOperation (Symbol: System.Int32 j) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'j = 0') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int j = 0')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 j) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'j = 0')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0') null
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
IWhileLoopOperation (LoopKind.While) (OperationKind.Loop, Type: null) (Syntax: 'while (j < ... }') IWhileLoopOperation (LoopKind.While) (OperationKind.Loop, Type: null) (Syntax: 'while (j < ... }')
Condition: Condition:
IBinaryOperation (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'j < 10') IBinaryOperation (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'j < 10')
...@@ -818,10 +838,14 @@ static void Main() ...@@ -818,10 +838,14 @@ static void Main()
Target: Target:
ILocalReferenceOperation: i (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'i') ILocalReferenceOperation: i (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'i')
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int j = 0;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int j = 0;')
ISingleVariableDeclarationOperation (Symbol: System.Int32 j) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'j = 0') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int j = 0')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 j) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'j = 0')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0') null
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
IWhileLoopOperation (LoopKind.While) (OperationKind.Loop, Type: null) (Syntax: 'while (j < ... }') IWhileLoopOperation (LoopKind.While) (OperationKind.Loop, Type: null) (Syntax: 'while (j < ... }')
Condition: Condition:
IBinaryOperation (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'j < 10') IBinaryOperation (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'j < 10')
......
...@@ -172,15 +172,19 @@ void F() ...@@ -172,15 +172,19 @@ void F()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'string y = x.i1;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'string y = x.i1;')
ISingleVariableDeclarationOperation (Symbol: System.String y) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'y = x.i1') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'string y = x.i1')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.String y) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'y = x.i1')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= x.i1')
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.String, IsInvalid, IsImplicit) (Syntax: 'x.i1')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
IFieldReferenceOperation: System.Int32 Program.i1 (OperationKind.FieldReference, Type: System.Int32, IsInvalid) (Syntax: 'x.i1')
Instance Receiver:
ILocalReferenceOperation: x (OperationKind.LocalReference, Type: Program, IsInvalid) (Syntax: 'x')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= x.i1') null
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: System.String, IsInvalid, IsImplicit) (Syntax: 'x.i1')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
IFieldReferenceOperation: System.Int32 Program.i1 (OperationKind.FieldReference, Type: System.Int32, IsInvalid) (Syntax: 'x.i1')
Instance Receiver:
ILocalReferenceOperation: x (OperationKind.LocalReference, Type: Program, IsInvalid) (Syntax: 'x')
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS0029: Cannot implicitly convert type 'int' to 'string' // CS0029: Cannot implicitly convert type 'int' to 'string'
...@@ -217,15 +221,19 @@ void F() ...@@ -217,15 +221,19 @@ void F()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Program y = ... ogram)x.i1;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'Program y = ... ogram)x.i1;')
ISingleVariableDeclarationOperation (Symbol: Program y) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'y = (Program)x.i1') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'Program y = ... rogram)x.i1')
Declarations:
ISingleVariableDeclarationOperation (Symbol: Program y) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'y = (Program)x.i1')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= (Program)x.i1')
IConversionOperation (Explicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: Program, IsInvalid) (Syntax: '(Program)x.i1')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
IFieldReferenceOperation: System.Int32 Program.i1 (OperationKind.FieldReference, Type: System.Int32, IsInvalid) (Syntax: 'x.i1')
Instance Receiver:
ILocalReferenceOperation: x (OperationKind.LocalReference, Type: Program, IsInvalid) (Syntax: 'x')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= (Program)x.i1') null
IConversionOperation (Explicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: Program, IsInvalid) (Syntax: '(Program)x.i1')
Conversion: CommonConversion (Exists: False, IsIdentity: False, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
IFieldReferenceOperation: System.Int32 Program.i1 (OperationKind.FieldReference, Type: System.Int32, IsInvalid) (Syntax: 'x.i1')
Instance Receiver:
ILocalReferenceOperation: x (OperationKind.LocalReference, Type: Program, IsInvalid) (Syntax: 'x')
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS0030: Cannot convert type 'int' to 'Program' // CS0030: Cannot convert type 'int' to 'Program'
......
...@@ -27,11 +27,15 @@ static void Main(string[] args) ...@@ -27,11 +27,15 @@ static void Main(string[] args)
} }
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (2 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'int x, ( 1 );') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'int x, ( 1 );')
ISingleVariableDeclarationOperation (Symbol: System.Int32 x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x') IMultiVariableDeclarationOperation (2 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'int x, ( 1 ')
Initializer: Declarations:
null ISingleVariableDeclarationOperation (Symbol: System.Int32 x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x')
ISingleVariableDeclarationOperation (Symbol: System.Int32 ) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: '( 1 ') Initializer:
null
ISingleVariableDeclarationOperation (Symbol: System.Int32 ) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: '( 1 ')
Initializer:
null
Initializer: Initializer:
null null
"; ";
......
...@@ -532,10 +532,14 @@ static void M(string s) ...@@ -532,10 +532,14 @@ static void M(string s)
IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 i Locals: Local_1: System.Int32 i
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int i = 0;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int i = 0;')
ISingleVariableDeclarationOperation (Symbol: System.Int32 i) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'i = 0') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int i = 0')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 i) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'i = 0')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0') null
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
Catch clauses(1): Catch clauses(1):
ICatchClauseOperation (Exception type: System.Exception) (OperationKind.CatchClause, Type: null) (Syntax: 'catch (Exce ... }') ICatchClauseOperation (Exception type: System.Exception) (OperationKind.CatchClause, Type: null) (Syntax: 'catch (Exce ... }')
ExceptionDeclarationOrExpression: ExceptionDeclarationOrExpression:
...@@ -591,10 +595,14 @@ static void M(string s) ...@@ -591,10 +595,14 @@ static void M(string s)
IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 i Locals: Local_1: System.Int32 i
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int i = 0;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int i = 0;')
ISingleVariableDeclarationOperation (Symbol: System.Int32 i) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'i = 0') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int i = 0')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 i) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'i = 0')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0') null
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
Finally: Finally:
null null
"; ";
...@@ -732,10 +740,14 @@ Catch clauses(0) ...@@ -732,10 +740,14 @@ Catch clauses(0)
IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }') IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 i Locals: Local_1: System.Int32 i
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int i = 0;') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int i = 0;')
ISingleVariableDeclarationOperation (Symbol: System.Int32 i) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'i = 0') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int i = 0')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 i) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'i = 0')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0') null
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS0219: The variable 'i' is assigned but its value is never used // CS0219: The variable 'i' is assigned but its value is never used
......
...@@ -3903,16 +3903,20 @@ static void Main() ...@@ -3903,16 +3903,20 @@ static void Main()
"; ";
string expectedOperationTree = @" string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'const (int ... ) = (1, 2);') IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'const (int ... ) = (1, 2);')
ISingleVariableDeclarationOperation (Symbol: (System.Int32 x, System.Int32 y) ) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: '= (1, 2)') IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: '(int x, int y) = (1, 2)')
Declarations:
ISingleVariableDeclarationOperation (Symbol: (System.Int32 x, System.Int32 y) ) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: '= (1, 2)')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= (1, 2)')
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: (System.Int32 x, System.Int32 y), IsImplicit) (Syntax: '(1, 2)')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
ITupleOperation (OperationKind.Tuple, Type: (System.Int32, System.Int32)) (Syntax: '(1, 2)')
Elements(2):
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 1) (Syntax: '1')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 2) (Syntax: '2')
Initializer: Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= (1, 2)') null
IConversionOperation (Implicit, TryCast: False, Unchecked) (OperationKind.Conversion, Type: (System.Int32 x, System.Int32 y), IsImplicit) (Syntax: '(1, 2)')
Conversion: CommonConversion (Exists: True, IsIdentity: True, IsNumeric: False, IsReference: False, IsUserDefined: False) (MethodSymbol: null)
Operand:
ITupleOperation (OperationKind.Tuple, Type: (System.Int32, System.Int32)) (Syntax: '(1, 2)')
Elements(2):
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 1) (Syntax: '1')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 2) (Syntax: '2')
"; ";
var expectedDiagnostics = new DiagnosticDescription[] { var expectedDiagnostics = new DiagnosticDescription[] {
// CS1001: Identifier expected // CS1001: Identifier expected
......
...@@ -5418,7 +5418,7 @@ public LazyUsingStatement(Lazy<IOperation> resources, Lazy<IOperation> body, Sem ...@@ -5418,7 +5418,7 @@ public LazyUsingStatement(Lazy<IOperation> resources, Lazy<IOperation> body, Sem
/// <summary> /// <summary>
/// Represents a local variable declaration. /// Represents a local variable declaration.
/// </summary> /// </summary>
internal abstract partial class BaseVariableDeclaration : Operation, IVariableDeclarationOperation internal abstract partial class BaseVariableDeclaration : Operation
{ {
protected BaseVariableDeclaration(OperationKind kind, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) : protected BaseVariableDeclaration(OperationKind kind, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(kind, semanticModel, syntax, type, constantValue, isImplicit) base(kind, semanticModel, syntax, type, constantValue, isImplicit)
...@@ -5571,7 +5571,7 @@ internal abstract partial class BaseVariableDeclarationGroupOperation : Operatio ...@@ -5571,7 +5571,7 @@ internal abstract partial class BaseVariableDeclarationGroupOperation : Operatio
{ {
} }
protected abstract ImmutableArray<IVariableDeclarationOperation> DeclarationsImpl { get; } protected abstract ImmutableArray<IMultiVariableDeclarationOperation> DeclarationsImpl { get; }
public override IEnumerable<IOperation> Children public override IEnumerable<IOperation> Children
{ {
get get
...@@ -5588,7 +5588,7 @@ public override IEnumerable<IOperation> Children ...@@ -5588,7 +5588,7 @@ public override IEnumerable<IOperation> Children
/// <summary> /// <summary>
/// Variables declared by the statement. /// Variables declared by the statement.
/// </summary> /// </summary>
public ImmutableArray<IVariableDeclarationOperation> Declarations => Operation.SetParentOperation(DeclarationsImpl, this); public ImmutableArray<IMultiVariableDeclarationOperation> Declarations => Operation.SetParentOperation(DeclarationsImpl, this);
public override void Accept(OperationVisitor visitor) public override void Accept(OperationVisitor visitor)
{ {
visitor.VisitVariableDeclarationGroup(this); visitor.VisitVariableDeclarationGroup(this);
...@@ -5604,13 +5604,13 @@ public override void Accept(OperationVisitor visitor) ...@@ -5604,13 +5604,13 @@ public override void Accept(OperationVisitor visitor)
/// </summary> /// </summary>
internal sealed partial class VariableDeclarationGroupOperation : BaseVariableDeclarationGroupOperation, IVariableDeclarationGroupOperation internal sealed partial class VariableDeclarationGroupOperation : BaseVariableDeclarationGroupOperation, IVariableDeclarationGroupOperation
{ {
public VariableDeclarationGroupOperation(ImmutableArray<IVariableDeclarationOperation> declarations, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) : public VariableDeclarationGroupOperation(ImmutableArray<IMultiVariableDeclarationOperation> declarations, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(semanticModel, syntax, type, constantValue, isImplicit) base(semanticModel, syntax, type, constantValue, isImplicit)
{ {
DeclarationsImpl = declarations; DeclarationsImpl = declarations;
} }
protected override ImmutableArray<IVariableDeclarationOperation> DeclarationsImpl { get; } protected override ImmutableArray<IMultiVariableDeclarationOperation> DeclarationsImpl { get; }
} }
/// <summary> /// <summary>
...@@ -5618,14 +5618,14 @@ internal sealed partial class VariableDeclarationGroupOperation : BaseVariableDe ...@@ -5618,14 +5618,14 @@ internal sealed partial class VariableDeclarationGroupOperation : BaseVariableDe
/// </summary> /// </summary>
internal sealed partial class LazyVariableDeclarationGroupOperation : BaseVariableDeclarationGroupOperation, IVariableDeclarationGroupOperation internal sealed partial class LazyVariableDeclarationGroupOperation : BaseVariableDeclarationGroupOperation, IVariableDeclarationGroupOperation
{ {
private readonly Lazy<ImmutableArray<IVariableDeclarationOperation>> _lazyDeclarations; private readonly Lazy<ImmutableArray<IMultiVariableDeclarationOperation>> _lazyDeclarations;
public LazyVariableDeclarationGroupOperation(Lazy<ImmutableArray<IVariableDeclarationOperation>> declarations, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) : base(semanticModel, syntax, type, constantValue, isImplicit) public LazyVariableDeclarationGroupOperation(Lazy<ImmutableArray<IMultiVariableDeclarationOperation>> declarations, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) : base(semanticModel, syntax, type, constantValue, isImplicit)
{ {
_lazyDeclarations = declarations; _lazyDeclarations = declarations;
} }
protected override ImmutableArray<IVariableDeclarationOperation> DeclarationsImpl => _lazyDeclarations.Value; protected override ImmutableArray<IMultiVariableDeclarationOperation> DeclarationsImpl => _lazyDeclarations.Value;
} }
/// <summary> /// <summary>
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
namespace Microsoft.CodeAnalysis.Operations namespace Microsoft.CodeAnalysis.Operations
{ {
/// <summary> /// <summary>
/// Represents a declaration expression operation. Unlike a regular variable declaration <see cref="IVariableDeclarationOperation"/>, this operation represents an "expression" declaring a variable. /// Represents a declaration expression operation. Unlike a regular variable declaration <see cref="ISingleVariableDeclarationOperation"/> and <see cref="IMultiVariableDeclarationOperation"/>, this operation represents an "expression" declaring a variable.
/// <para> /// <para>
/// Current usage: /// Current usage:
/// (1) C# declaration expression. For example, /// (1) C# declaration expression. For example,
......
...@@ -5,25 +5,41 @@ ...@@ -5,25 +5,41 @@
namespace Microsoft.CodeAnalysis.Operations namespace Microsoft.CodeAnalysis.Operations
{ {
/// <summary> /// <summary>
/// Represents multiple declared variables in a single declarator. /// Represents a declarator that declares multiple individual variables.
/// </summary> /// </summary>
/// <para> /// <para>
/// Current Usage: /// Current Usage:
/// (1) VB Dim statement declaration groups /// (1) C# VariableDeclaration
/// (2) VB Using statement variable declarations /// (2) C# fixed declarations
/// (3) C# using declarations
/// (4) VB Dim statement declaration groups
/// (5) VB Using statement variable declarations
/// </para> /// </para>
/// <remarks> /// <remarks>
/// The initializer of this node is applied to all individual declarations in <see cref="Declarations"/>. There cannot /// The initializer of this node is applied to all individual declarations in <see cref="Declarations"/>. There cannot
/// be initializers in both locations except in invalid code scenarios. /// be initializers in both locations except in invalid code scenarios.
/// In C#, this node will never have an initializer.
/// ///
/// This interface is reserved for implementation by its associated APIs. We reserve the right to /// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future. /// change it in the future.
/// </remarks> /// </remarks>
public interface IMultiVariableDeclarationOperation : IVariableDeclarationOperation public interface IMultiVariableDeclarationOperation : IOperation
{ {
/// <summary> /// <summary>
/// Individual variable declarations declared by this multiple declaration. /// Individual variable declarations declared by this multiple declaration.
/// </summary> /// </summary>
/// <remarks>
/// All <see cref="IVariableDeclarationGroupOperation"/> will have at least 1 <code>IMultiVariableDeclarationOpertion</code>,
/// even if the declaration group only declares 1 variable.
/// </remarks>
ImmutableArray<ISingleVariableDeclarationOperation> Declarations { get; } ImmutableArray<ISingleVariableDeclarationOperation> Declarations { get; }
/// <summary>
/// Optional initializer of the variable.
/// </summary>
/// <remarks>
/// In C#, this will always be null.
/// </remarks>
IVariableInitializerOperation Initializer { get; }
} }
} }
...@@ -18,11 +18,21 @@ namespace Microsoft.CodeAnalysis.Operations ...@@ -18,11 +18,21 @@ namespace Microsoft.CodeAnalysis.Operations
/// This interface is reserved for implementation by its associated APIs. We reserve the right to /// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future. /// change it in the future.
/// </remarks> /// </remarks>
public interface ISingleVariableDeclarationOperation : IVariableDeclarationOperation public interface ISingleVariableDeclarationOperation : IOperation
{ {
/// <summary> /// <summary>
/// Symbol declared by this variable declaration /// Symbol declared by this variable declaration
/// </summary> /// </summary>
ILocalSymbol Symbol { get; } ILocalSymbol Symbol { get; }
/// <summary>
/// Optional initializer of the variable.
/// </summary>
/// <remarks>
/// If this variable is in an <see cref="IMultiVariableDeclarationOperation"/>, the initializer may be located
/// in the parent operation. Call <see cref="OperationExtensions.GetVariableInitializer(ISingleVariableDeclarationOperation)"/>
/// to check in all locations. It is only possible to have initializers in both locations in VB invalid code scenarios.
/// </remarks>
IVariableInitializerOperation Initializer { get; }
} }
} }
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
namespace Microsoft.CodeAnalysis.Operations namespace Microsoft.CodeAnalysis.Operations
{ {
/// <summary> /// <summary>
/// Represents a local variable declaration statement. /// Represents a variable declaration statement.
/// </summary> /// </summary>
/// <para> /// <para>
/// Current Usage: /// Current Usage:
...@@ -22,8 +22,11 @@ namespace Microsoft.CodeAnalysis.Operations ...@@ -22,8 +22,11 @@ namespace Microsoft.CodeAnalysis.Operations
public interface IVariableDeclarationGroupOperation : IOperation public interface IVariableDeclarationGroupOperation : IOperation
{ {
/// <summary> /// <summary>
/// Variables declared by the statement. /// Variable declaration in the statement.
/// </summary> /// </summary>
ImmutableArray<IVariableDeclarationOperation> Declarations { get; } /// <remarks>
/// In C#, this will always be a single declaration, with all variables in <see cref="IMultiVariableDeclarationOperation.Declarations"/>.
/// </remarks>
ImmutableArray<IMultiVariableDeclarationOperation> Declarations { get; }
} }
} }
...@@ -1251,8 +1251,8 @@ Namespace Microsoft.CodeAnalysis.Operations ...@@ -1251,8 +1251,8 @@ Namespace Microsoft.CodeAnalysis.Operations
End Function End Function
Private Function CreateBoundDimStatementOperation(boundDimStatement As BoundDimStatement) As IVariableDeclarationGroupOperation Private Function CreateBoundDimStatementOperation(boundDimStatement As BoundDimStatement) As IVariableDeclarationGroupOperation
Dim declarations As Lazy(Of ImmutableArray(Of IVariableDeclarationOperation)) = Dim declarations As Lazy(Of ImmutableArray(Of IMultiVariableDeclarationOperation)) =
New Lazy(Of ImmutableArray(Of IVariableDeclarationOperation))(Function() GetVariableDeclarationStatementVariables(boundDimStatement.LocalDeclarations)) New Lazy(Of ImmutableArray(Of IMultiVariableDeclarationOperation))(Function() GetVariableDeclarationStatementVariables(boundDimStatement.LocalDeclarations))
Dim syntax As SyntaxNode = boundDimStatement.Syntax Dim syntax As SyntaxNode = boundDimStatement.Syntax
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)()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册