Added deconstruction support, tests for IFieldReferenceExpression in out var...

Added deconstruction support, tests for IFieldReferenceExpression in out var and deconstruction script scenarios.
上级 4c74c18e
......@@ -830,6 +830,7 @@ private static string ExtractDeconstructResultElementName(BoundExpression expres
field,
constantValueOpt: null,
resultKind: LookupResultKind.Viable,
isDeclaration: true,
type: fieldType);
}
......
......@@ -2361,7 +2361,7 @@ private BoundExpression BindOutDeclarationArgument(DeclarationExpressionSyntax d
CheckRestrictedTypeInAsync(this.ContainingMemberOrLambda, declType, diagnostics, typeSyntax);
return new BoundLocal(declarationExpression, localSymbol, isDeclaration:true, constantValueOpt: null, type: declType);
return new BoundLocal(declarationExpression, localSymbol, isDeclaration: true, constantValueOpt: null, type: declType);
}
// Is this a field?
......@@ -2390,7 +2390,11 @@ private BoundExpression BindOutDeclarationArgument(DeclarationExpressionSyntax d
TypeSymbol fieldType = expressionVariableField.GetFieldType(this.FieldsBeingBound);
return new BoundFieldAccess(declarationExpression,
receiver,
expressionVariableField, null, LookupResultKind.Viable, fieldType, isDeclaration: true);
expressionVariableField,
null,
LookupResultKind.Viable,
isDeclaration: true,
type: fieldType);
}
/// <summary>
......
......@@ -25,9 +25,21 @@ internal sealed partial class BoundFieldAccess
ConstantValue constantValueOpt,
LookupResultKind resultKind,
TypeSymbol type,
bool hasErrors = false,
bool isDeclaration = false)
: this(syntax, receiver, fieldSymbol, constantValueOpt, resultKind, NeedsByValueFieldAccess(receiver, fieldSymbol), isDeclaration, type, hasErrors)
bool hasErrors = false)
: this(syntax, receiver, fieldSymbol, constantValueOpt, resultKind, NeedsByValueFieldAccess(receiver, fieldSymbol), isDeclaration: false, type: type, hasErrors: hasErrors)
{
}
public BoundFieldAccess(
SyntaxNode syntax,
BoundExpression receiver,
FieldSymbol fieldSymbol,
ConstantValue constantValueOpt,
LookupResultKind resultKind,
bool isDeclaration,
TypeSymbol type,
bool hasErrors = false)
: this(syntax, receiver, fieldSymbol, constantValueOpt, resultKind, NeedsByValueFieldAccess(receiver, fieldSymbol), isDeclaration: isDeclaration, type: type, hasErrors: hasErrors)
{
}
......
......@@ -79,9 +79,12 @@ internal BoundExpression SetInferredType(TypeSymbol type, Binder binderOpt, Diag
return new BoundFieldAccess(this.Syntax,
this.ReceiverOpt,
fieldSymbol, null, LookupResultKind.Viable, type,
this.HasErrors || inferenceFailed,
isDeclaration: true);
fieldSymbol,
null,
LookupResultKind.Viable,
isDeclaration: true,
type: type,
hasErrors: this.HasErrors || inferenceFailed);
default:
throw ExceptionUtilities.UnexpectedValue(this.VariableSymbol.Kind);
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
......@@ -36,5 +37,112 @@ void M()
VerifyOperationTreeAndDiagnosticsForTest<AttributeSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
public void IFieldReferenceExpression_OutVar_Script()
{
string source = @"
public void M2(out int i )
{
i = 0;
}
M2(out /*<bind>*/int i/*</bind>*/);
";
string expectedOperationTree = @"
IFieldReferenceExpression: System.Int32 Script.i (IsDeclaration: True) (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'int i')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: Script) (Syntax: 'i')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<DeclarationExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics,
parseOptions: TestOptions.Script);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
public void IFieldReferenceExpression_DeconstructionDeclaration_Script()
{
string source = @"
/*<bind>*/(int i1, int i2)/*</bind>*/ = (1, 2);
";
string expectedOperationTree = @"
ITupleExpression (OperationKind.TupleExpression, Type: (System.Int32 i1, System.Int32 i2)) (Syntax: '(int i1, int i2)')
Elements(2):
IFieldReferenceExpression: System.Int32 Script.i1 (IsDeclaration: True) (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'int i1')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: Script) (Syntax: 'i1')
IFieldReferenceExpression: System.Int32 Script.i2 (IsDeclaration: True) (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'int i2')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: Script) (Syntax: 'i2')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<TupleExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics,
parseOptions: TestOptions.Script);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
public void IFieldReferenceExpression_InferenceOutVar_Script()
{
string source = @"
public void M2(out int i )
{
i = 0;
}
M2(out /*<bind>*/var i/*</bind>*/);
";
string expectedOperationTree = @"
IFieldReferenceExpression: System.Int32 Script.i (IsDeclaration: True) (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'var i')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: Script) (Syntax: 'i')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<DeclarationExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics,
parseOptions: TestOptions.Script);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
public void IFieldReferenceExpression_InferenceDeconstructionDeclaration_Script()
{
string source = @"
/*<bind>*/(var i1, var i2)/*</bind>*/ = (1, 2);
";
string expectedOperationTree = @"
ITupleExpression (OperationKind.TupleExpression, Type: (System.Int32 i1, System.Int32 i2)) (Syntax: '(var i1, var i2)')
Elements(2):
IFieldReferenceExpression: System.Int32 Script.i1 (IsDeclaration: True) (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'var i1')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: Script) (Syntax: 'i1')
IFieldReferenceExpression: System.Int32 Script.i2 (IsDeclaration: True) (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'var i2')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: Script) (Syntax: 'i2')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<TupleExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics,
parseOptions: TestOptions.Script);
}
[CompilerTrait(CompilerFeature.IOperation)]
[Fact]
public void IFieldReferenceExpression_InferenceDeconstructionDeclaration_AlternateSyntax_Script()
{
string source = @"
/*<bind>*/var (i1, i2)/*</bind>*/ = (1, 2);
";
string expectedOperationTree = @"
ITupleExpression (OperationKind.TupleExpression, Type: (System.Int32 i1, System.Int32 i2)) (Syntax: 'var (i1, i2)')
Elements(2):
IFieldReferenceExpression: System.Int32 Script.i1 (IsDeclaration: True) (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'i1')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: Script) (Syntax: 'i1')
IFieldReferenceExpression: System.Int32 Script.i2 (IsDeclaration: True) (OperationKind.FieldReferenceExpression, Type: System.Int32) (Syntax: 'i2')
Instance Receiver: IInstanceReferenceExpression (InstanceReferenceKind.Implicit) (OperationKind.InstanceReferenceExpression, Type: Script) (Syntax: 'i2')
";
var expectedDiagnostics = DiagnosticDescription.None;
VerifyOperationTreeAndDiagnosticsForTest<DeclarationExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics,
parseOptions: TestOptions.Script);
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册