Implemented C# heirarchy changes discussed in design meeting.

上级 2951716a
......@@ -268,9 +268,9 @@ private ImmutableArray<IOperation> GetIOperationChildren(BoundNode boundNode)
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)
......@@ -1506,6 +1506,7 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo
SyntaxNode varStatement;
SyntaxNode varDeclaration;
SyntaxNode varDeclarator;
switch (kind)
{
case SyntaxKind.LocalDeclarationStatement:
......@@ -1516,8 +1517,9 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo
// var statement points to LocalDeclarationStatementSyntax
varStatement = statement;
// var declaration points to VariableDeclaratorSyntax
varDeclaration = statement.Declaration.Variables.First();
varDeclaration = statement.Declaration;
varDeclarator = statement.Declaration.Variables.First();
break;
}
case SyntaxKind.VariableDeclarator:
......@@ -1526,8 +1528,10 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo
// var statement points to VariableDeclarationSyntax
varStatement = node.Parent;
varDeclaration = node.Parent;
// var declaration points to VariableDeclaratorSyntax
varDeclaration = node;
varDeclarator = node;
break;
}
default:
......@@ -1535,27 +1539,44 @@ private IOperation CreateBoundLocalDeclarationOperation(BoundLocalDeclaration bo
Debug.Fail($"Unexpected syntax: {kind}");
// otherwise, they points to whatever bound nodes are pointing to.
varStatement = varDeclaration = node;
varStatement = varDeclaration = varDeclarator = node;
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;
Optional<object> constantValue = default(Optional<object>);
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)
{
Lazy<ImmutableArray<IVariableDeclarationOperation>> declarations = new Lazy<ImmutableArray<IVariableDeclarationOperation>>(() =>
boundMultipleLocalDeclarations.LocalDeclarations.SelectAsArray(declaration => (IVariableDeclarationOperation)CreateVariableDeclaration(declaration)));
SyntaxNode syntax = boundMultipleLocalDeclarations.Syntax;
Lazy<ImmutableArray<ISingleVariableDeclarationOperation>> declarations = new Lazy<ImmutableArray<ISingleVariableDeclarationOperation>>(() =>
boundMultipleLocalDeclarations.LocalDeclarations.SelectAsArray(declaration => CreateVariableDeclaration(declaration)));
// 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;
Optional<object> constantValue = default(Optional<object>);
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)
......
......@@ -304,17 +304,21 @@ public void F(int dimension)
";
string expectedOperationTree = @"
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 }')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= { 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 }')
IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'int[] x = { 1, 2 }')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32[] x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x = { 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')
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= { 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:
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;
......
......@@ -31,22 +31,26 @@ static void F()
";
string expectedOperationTree = @"
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:
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
null
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -111,22 +115,26 @@ static void F()
";
string expectedOperationTree = @"
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:
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
null
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -191,17 +199,21 @@ static void F()
";
string expectedOperationTree = @"
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:
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)
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS0815: Cannot assign lambda expression to an implicitly-typed variable
......@@ -233,19 +245,23 @@ static void F()
";
string expectedOperationTree = @"
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:
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)
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS1593: Delegate 'Action<int>' does not take 0 arguments
......@@ -277,25 +293,29 @@ static void F()
";
string expectedOperationTree = @"
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:
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
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS0029: Cannot implicitly convert type 'System.Action' to 'System.Action<int>'
......@@ -327,19 +347,23 @@ static void F()
";
string expectedOperationTree = @"
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:
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)
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS1593: Delegate 'Action<int>' does not take 0 arguments
......@@ -378,7 +402,7 @@ static void F()
var lambdaSyntax = (LambdaExpressionSyntax)variableDeclaration.Declaration.Variables.Single().Initializer.Value;
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);
// 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()
Assert.Same(variableTreeLambdaOperation, lambdaOperation);
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);
// 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)
";
string expectedOperationTree = @"
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:
null
";
......
......@@ -355,7 +355,7 @@ static void Main(string[] args)
},
OperationSelector = (operation) =>
{
var initializer = ((IVariableDeclarationOperation)operation).Initializer.Value;
var initializer = ((ISingleVariableDeclarationOperation)operation).Initializer.Value;
return (IConversionOperation)((ICoalesceOperation)initializer).WhenNull;
}
}.Verify);
......@@ -3208,13 +3208,17 @@ static void M1()
";
string expectedOperationTree = @"
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:
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')
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS0219: The variable 'o' is assigned but its value is never used
......@@ -3242,13 +3246,17 @@ void Main()
";
string expectedOperationTree = @"
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:
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')
null
";
var expectedDiagnostics = DiagnosticDescription.None;
......@@ -3272,13 +3280,17 @@ void Main()
";
string expectedOperationTree = @"
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:
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')
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS0029: Cannot implicitly convert type 'System.Action<object>' to 'System.Action<int>'
......@@ -4938,13 +4950,17 @@ static void M1()
";
string expectedOperationTree = @"
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:
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')
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS0219: The variable 'o' is assigned but its value is never used
......@@ -5025,8 +5041,11 @@ private class ExpectedSymbolVerifier
public static IOperation IVariableDeclarationStatementSelector(IOperation operation) =>
((IVariableDeclarationGroupOperation)operation).Declarations.Single().Initializer;
public static IOperation IVariableDeclarationSelector(IOperation operation) =>
((IVariableDeclarationOperation)operation).Initializer.Value;
public static IOperation IMultiVariableDeclarationSelector(IOperation operation) =>
((IMultiVariableDeclarationOperation)operation).Initializer.Value;
public static IOperation ISingleVariableDeclarationSelector(IOperation operation) =>
((ISingleVariableDeclarationOperation)operation).Initializer.Value;
public static IOperation IReturnDeclarationStatementSelector(IOperation operation) =>
((IReturnOperation)operation).ReturnedValue;
......@@ -5108,8 +5127,10 @@ private IOperation GetAndInvokeOperationSelector(IOperation operation)
{
case IVariableDeclarationGroupOperation _:
return IVariableDeclarationStatementSelector(operation);
case IVariableDeclarationOperation _:
return IVariableDeclarationSelector(operation);
case IMultiVariableDeclarationOperation _:
return IMultiVariableDeclarationSelector(operation);
case ISingleVariableDeclarationOperation _:
return ISingleVariableDeclarationSelector(operation);
case IReturnOperation _:
return IReturnDeclarationStatementSelector(operation);
case IConversionOperation conv:
......
......@@ -36,16 +36,20 @@ void M1()
IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed(int * ... }')
Children(2):
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:
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')
null
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... is {*p}"");')
Expression:
......@@ -105,27 +109,31 @@ void M1()
string expectedOperationTree = @"
IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed (int* ... }')
Children(2):
IVariableDeclarationGroupOperation (2 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p1 = &i1, p2 = &i2')
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')
ISingleVariableDeclarationOperation (Symbol: System.Int32* p2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'p2 = &i2')
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'int* p1 = &i1, p2 = &i2')
IMultiVariableDeclarationOperation (2 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'int* p1 = &i1, p2 = &i2')
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')
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:
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')
null
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'i3 = *p1 + *p2;')
Expression:
......@@ -181,29 +189,37 @@ void M1()
IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed (int* ... }')
Children(2):
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:
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')
null
IOperation: (OperationKind.None, Type: null) (Syntax: 'fixed (int* ... }')
Children(2):
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:
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')
null
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'i3 = *p1 + *p2;')
Expression:
......@@ -254,11 +270,15 @@ void M1()
IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'fixed (int* ... }')
Children(2):
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:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '=')
IInvalidOperation (OperationKind.Invalid, Type: null, IsInvalid) (Syntax: '')
Children(0)
null
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'i3 = *p1;')
Expression:
......@@ -308,16 +328,20 @@ void M1()
IOperation: (OperationKind.None, Type: null, IsInvalid) (Syntax: 'fixed (int* ... }')
Children(2):
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:
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')
null
IBlockOperation (1 statements) (OperationKind.Block, Type: null, IsInvalid) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null, IsInvalid) (Syntax: 'i3 = &p1;')
Expression:
......
......@@ -584,20 +584,24 @@ static void Main()
IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Boolean b
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:
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')
null
NextVariables(0)
";
VerifyOperationTreeForTest<ForEachStatementSyntax>(source, expectedOperationTree);
......
......@@ -34,13 +34,17 @@ public static void M1()
IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (var ... }')
Resources:
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c = new C()')
ISingleVariableDeclarationOperation (Symbol: C c) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c = new C()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'var c = new C()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: C c) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c = new C()')
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:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
......@@ -88,21 +92,25 @@ public static void M1()
string expectedOperationTree = @"
IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (C c1 ... }')
Resources:
IVariableDeclarationGroupOperation (2 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'C c1 = new ... 2 = new C()')
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'C c1 = new ... 2 = new C()')
IMultiVariableDeclarationOperation (2 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'C c1 = new ... 2 = new C()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()')
Initializer:
null
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()')
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:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
......@@ -199,24 +207,32 @@ public static void M1()
IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (var ... }')
Resources:
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c1 = new C()')
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'var c1 = new C()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()')
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:
IUsingOperation (OperationKind.Using, Type: null) (Syntax: 'using (var ... }')
Resources:
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c2 = new C()')
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'var c2 = new C()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()')
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:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
......@@ -331,21 +347,25 @@ public static void M1()
string expectedOperationTree = @"
IUsingOperation (OperationKind.Using, Type: null, IsInvalid) (Syntax: 'using (var ... }')
Resources:
IVariableDeclarationGroupOperation (2 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()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C, IsInvalid) (Syntax: 'new C()')
Arguments(0)
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'var c1 = ne ... 2 = new C()')
IMultiVariableDeclarationOperation (2 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid, IsImplicit) (Syntax: 'var c1 = ne ... 2 = new C()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c1 = new C()')
Initializer:
null
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c2 = new C()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C, IsInvalid) (Syntax: 'new C()')
Arguments(0)
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
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c2 = new C()')
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:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
......@@ -409,21 +429,29 @@ public static void M1()
Locals: Local_1: C c1
Local_2: C c2
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c1 = new C();')
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null) (Syntax: 'var c1 = new C()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c1 = new C()')
Initializer:
null
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c2 = new C();')
ISingleVariableDeclarationOperation (Symbol: C c2) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c2 = new C()')
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
Initializer:
null
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
null
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c2 = new C();')
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:
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')
Resources:
ILocalReferenceOperation: c1 (OperationKind.LocalReference, Type: C, IsInvalid) (Syntax: 'c1')
......@@ -504,13 +532,17 @@ public static void M1()
IUsingOperation (OperationKind.Using, Type: null, IsInvalid) (Syntax: 'using (var ... }')
Resources:
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()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null, IsInvalid) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C, IsInvalid) (Syntax: 'new C()')
Arguments(0)
IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid, IsImplicit) (Syntax: 'var c1 = new C()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: C c1) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: 'c1 = new C()')
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:
IBlockOperation (1 statements) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
IExpressionStatementOperation (OperationKind.ExpressionStatement, Type: null) (Syntax: 'Console.Wri ... oString());')
......@@ -758,13 +790,17 @@ public static void M1()
";
string expectedOperationTree = @"
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null) (Syntax: 'var c = new C()')
ISingleVariableDeclarationOperation (Symbol: C c) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c = new C()')
Initializer:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= new C()')
IObjectCreationOperation (Constructor: C..ctor()) (OperationKind.ObjectCreation, Type: C) (Syntax: 'new C()')
Arguments(0)
IMultiVariableDeclarationOperation (1 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsImplicit) (Syntax: 'var c = new C()')
Declarations:
ISingleVariableDeclarationOperation (Symbol: C c) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'c = new C()')
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;
......
......@@ -145,12 +145,16 @@ static void Main()
IBlockOperation (2 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 value
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:
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')
null
IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }')
Condition:
IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 10')
......@@ -206,12 +210,16 @@ static void Main()
IBlockOperation (3 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 value
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:
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')
null
IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }')
Condition:
IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 5')
......@@ -280,12 +288,16 @@ static void Main()
IBlockOperation (3 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 value
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:
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')
null
IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }')
Condition:
IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 100')
......@@ -571,12 +583,16 @@ static void Main()
IBlockOperation (2 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 value
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:
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')
null
IConditionalOperation (OperationKind.Conditional, Type: null) (Syntax: 'if (value > ... }')
Condition:
IBinaryOperation (BinaryOperatorKind.GreaterThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'value > 100')
......@@ -734,10 +750,14 @@ static void Main()
Target:
ILocalReferenceOperation: i (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'i')
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:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
null
IWhileLoopOperation (LoopKind.While) (OperationKind.Loop, Type: null) (Syntax: 'while (j < ... }')
Condition:
IBinaryOperation (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'j < 10')
......@@ -818,10 +838,14 @@ static void Main()
Target:
ILocalReferenceOperation: i (OperationKind.LocalReference, Type: System.Int32) (Syntax: 'i')
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:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
null
IWhileLoopOperation (LoopKind.While) (OperationKind.Loop, Type: null) (Syntax: 'while (j < ... }')
Condition:
IBinaryOperation (BinaryOperatorKind.LessThan) (OperationKind.BinaryOperator, Type: System.Boolean) (Syntax: 'j < 10')
......
......@@ -172,15 +172,19 @@ void F()
";
string expectedOperationTree = @"
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:
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')
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS0029: Cannot implicitly convert type 'int' to 'string'
......@@ -217,15 +221,19 @@ void F()
";
string expectedOperationTree = @"
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:
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')
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS0030: Cannot convert type 'int' to 'Program'
......
......@@ -27,11 +27,15 @@ static void Main(string[] args)
}
";
string expectedOperationTree = @"
IVariableDeclarationGroupOperation (2 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'int x, ( 1 );')
ISingleVariableDeclarationOperation (Symbol: System.Int32 x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x')
Initializer:
null
ISingleVariableDeclarationOperation (Symbol: System.Int32 ) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: '( 1 ')
IVariableDeclarationGroupOperation (1 declarations) (OperationKind.VariableDeclarationGroup, Type: null, IsInvalid) (Syntax: 'int x, ( 1 );')
IMultiVariableDeclarationOperation (2 declarations) (OperationKind.MultiVariableDeclaration, Type: null, IsInvalid) (Syntax: 'int x, ( 1 ')
Declarations:
ISingleVariableDeclarationOperation (Symbol: System.Int32 x) (OperationKind.SingleVariableDeclaration, Type: null) (Syntax: 'x')
Initializer:
null
ISingleVariableDeclarationOperation (Symbol: System.Int32 ) (OperationKind.SingleVariableDeclaration, Type: null, IsInvalid) (Syntax: '( 1 ')
Initializer:
null
Initializer:
null
";
......
......@@ -532,10 +532,14 @@ static void M(string s)
IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 i
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:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
null
Catch clauses(1):
ICatchClauseOperation (Exception type: System.Exception) (OperationKind.CatchClause, Type: null) (Syntax: 'catch (Exce ... }')
ExceptionDeclarationOrExpression:
......@@ -591,10 +595,14 @@ static void M(string s)
IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 i
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:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
null
Finally:
null
";
......@@ -732,10 +740,14 @@ Catch clauses(0)
IBlockOperation (1 statements, 1 locals) (OperationKind.Block, Type: null) (Syntax: '{ ... }')
Locals: Local_1: System.Int32 i
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:
IVariableInitializerOperation (OperationKind.VariableInitializer, Type: null) (Syntax: '= 0')
ILiteralOperation (OperationKind.Literal, Type: System.Int32, Constant: 0) (Syntax: '0')
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS0219: The variable 'i' is assigned but its value is never used
......
......@@ -3903,16 +3903,20 @@ static void Main()
";
string expectedOperationTree = @"
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:
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')
null
";
var expectedDiagnostics = new DiagnosticDescription[] {
// CS1001: Identifier expected
......
......@@ -5418,7 +5418,7 @@ public LazyUsingStatement(Lazy<IOperation> resources, Lazy<IOperation> body, Sem
/// <summary>
/// Represents a local variable declaration.
/// </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) :
base(kind, semanticModel, syntax, type, constantValue, isImplicit)
......@@ -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
{
get
......@@ -5588,7 +5588,7 @@ public override IEnumerable<IOperation> Children
/// <summary>
/// Variables declared by the statement.
/// </summary>
public ImmutableArray<IVariableDeclarationOperation> Declarations => Operation.SetParentOperation(DeclarationsImpl, this);
public ImmutableArray<IMultiVariableDeclarationOperation> Declarations => Operation.SetParentOperation(DeclarationsImpl, this);
public override void Accept(OperationVisitor visitor)
{
visitor.VisitVariableDeclarationGroup(this);
......@@ -5604,13 +5604,13 @@ public override void Accept(OperationVisitor visitor)
/// </summary>
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)
{
DeclarationsImpl = declarations;
}
protected override ImmutableArray<IVariableDeclarationOperation> DeclarationsImpl { get; }
protected override ImmutableArray<IMultiVariableDeclarationOperation> DeclarationsImpl { get; }
}
/// <summary>
......@@ -5618,14 +5618,14 @@ internal sealed partial class VariableDeclarationGroupOperation : BaseVariableDe
/// </summary>
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;
}
protected override ImmutableArray<IVariableDeclarationOperation> DeclarationsImpl => _lazyDeclarations.Value;
protected override ImmutableArray<IMultiVariableDeclarationOperation> DeclarationsImpl => _lazyDeclarations.Value;
}
/// <summary>
......
......@@ -3,7 +3,7 @@
namespace Microsoft.CodeAnalysis.Operations
{
/// <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>
/// Current usage:
/// (1) C# declaration expression. For example,
......
......@@ -5,25 +5,41 @@
namespace Microsoft.CodeAnalysis.Operations
{
/// <summary>
/// Represents multiple declared variables in a single declarator.
/// Represents a declarator that declares multiple individual variables.
/// </summary>
/// <para>
/// Current Usage:
/// (1) VB Dim statement declaration groups
/// (2) VB Using statement variable declarations
/// (1) C# VariableDeclaration
/// (2) C# fixed declarations
/// (3) C# using declarations
/// (4) VB Dim statement declaration groups
/// (5) VB Using statement variable declarations
/// </para>
/// <remarks>
/// 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.
/// In C#, this node will never have an initializer.
///
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface IMultiVariableDeclarationOperation : IVariableDeclarationOperation
public interface IMultiVariableDeclarationOperation : IOperation
{
/// <summary>
/// Individual variable declarations declared by this multiple declaration.
/// </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; }
/// <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
/// This interface is reserved for implementation by its associated APIs. We reserve the right to
/// change it in the future.
/// </remarks>
public interface ISingleVariableDeclarationOperation : IVariableDeclarationOperation
public interface ISingleVariableDeclarationOperation : IOperation
{
/// <summary>
/// Symbol declared by this variable declaration
/// </summary>
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 @@
namespace Microsoft.CodeAnalysis.Operations
{
/// <summary>
/// Represents a local variable declaration statement.
/// Represents a variable declaration statement.
/// </summary>
/// <para>
/// Current Usage:
......@@ -22,8 +22,11 @@ namespace Microsoft.CodeAnalysis.Operations
public interface IVariableDeclarationGroupOperation : IOperation
{
/// <summary>
/// Variables declared by the statement.
/// Variable declaration in the statement.
/// </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
End Function
Private Function CreateBoundDimStatementOperation(boundDimStatement As BoundDimStatement) As IVariableDeclarationGroupOperation
Dim declarations As Lazy(Of ImmutableArray(Of IVariableDeclarationOperation)) =
New Lazy(Of ImmutableArray(Of IVariableDeclarationOperation))(Function() GetVariableDeclarationStatementVariables(boundDimStatement.LocalDeclarations))
Dim declarations As Lazy(Of ImmutableArray(Of IMultiVariableDeclarationOperation)) =
New Lazy(Of ImmutableArray(Of IMultiVariableDeclarationOperation))(Function() GetVariableDeclarationStatementVariables(boundDimStatement.LocalDeclarations))
Dim syntax As SyntaxNode = boundDimStatement.Syntax
Dim type As ITypeSymbol = Nothing
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.
先完成此消息的编辑!
想要评论请 注册