Added IsDeclaration to IFieldReferenceExpression.

上级 a298f642
......@@ -334,13 +334,14 @@ private ILocalReferenceExpression CreateBoundLocalOperation(BoundLocal boundLoca
private IFieldReferenceExpression CreateBoundFieldAccessOperation(BoundFieldAccess boundFieldAccess)
{
IFieldSymbol field = boundFieldAccess.FieldSymbol;
bool isDeclaration = boundFieldAccess.IsDeclaration;
Lazy<IOperation> instance = new Lazy<IOperation>(() => Create(boundFieldAccess.FieldSymbol.IsStatic ? null : boundFieldAccess.ReceiverOpt));
ISymbol member = boundFieldAccess.FieldSymbol;
SyntaxNode syntax = boundFieldAccess.Syntax;
ITypeSymbol type = boundFieldAccess.Type;
Optional<object> constantValue = ConvertToOptional(boundFieldAccess.ConstantValue);
bool isImplicit = boundFieldAccess.WasCompilerGenerated;
return new LazyFieldReferenceExpression(field, instance, member, _semanticModel, syntax, type, constantValue, isImplicit);
return new LazyFieldReferenceExpression(field, isDeclaration, instance, member, _semanticModel, syntax, type, constantValue, isImplicit);
}
private IPropertyReferenceExpression CreateBoundPropertyAccessOperation(BoundPropertyAccess boundPropertyAccess)
......@@ -550,7 +551,8 @@ private IMemberReferenceExpression CreateBoundObjectInitializerMemberOperation(B
{
case SymbolKind.Field:
var field = (FieldSymbol)boundObjectInitializerMember.MemberSymbol;
return new LazyFieldReferenceExpression(field, instance, field, _semanticModel, syntax, type, constantValue, isImplicit);
bool isDeclaration = false;
return new LazyFieldReferenceExpression(field, isDeclaration, instance, field, _semanticModel, syntax, type, constantValue, isImplicit);
case SymbolKind.Event:
var eventSymbol = (EventSymbol)boundObjectInitializerMember.MemberSymbol;
return new LazyEventReferenceExpression(eventSymbol, instance, eventSymbol, _semanticModel, syntax, type, constantValue, isImplicit);
......
......@@ -88,7 +88,5 @@ public virtual void M1()
VerifyOperationTreeAndDiagnosticsForTest<DeclarationExpressionSyntax>(source, expectedOperationTree, expectedDiagnostics);
}
}
}
......@@ -1598,15 +1598,17 @@ internal sealed partial class LazyFieldInitializer : BaseFieldInitializer, IFiel
/// </summary>
internal abstract partial class BaseFieldReferenceExpression : MemberReferenceExpression, IFieldReferenceExpression
{
public BaseFieldReferenceExpression(IFieldSymbol field, ISymbol member, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
public BaseFieldReferenceExpression(IFieldSymbol field, bool isDeclaration, ISymbol member, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(member, OperationKind.FieldReferenceExpression, semanticModel, syntax, type, constantValue, isImplicit)
{
Field = field;
IsDeclaration = isDeclaration;
}
/// <summary>
/// Referenced field.
/// </summary>
public IFieldSymbol Field { get; }
public bool IsDeclaration { get; }
public override IEnumerable<IOperation> Children
{
get
......@@ -1630,8 +1632,8 @@ public override void Accept(OperationVisitor visitor)
/// </summary>
internal sealed partial class FieldReferenceExpression : BaseFieldReferenceExpression, IFieldReferenceExpression
{
public FieldReferenceExpression(IFieldSymbol field, IOperation instance, ISymbol member, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(field, member, semanticModel, syntax, type, constantValue, isImplicit)
public FieldReferenceExpression(IFieldSymbol field, bool isDeclaration, IOperation instance, ISymbol member, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(field, isDeclaration, member, semanticModel, syntax, type, constantValue, isImplicit)
{
InstanceImpl = instance;
}
......@@ -1645,8 +1647,8 @@ internal sealed partial class LazyFieldReferenceExpression : BaseFieldReferenceE
{
private readonly Lazy<IOperation> _lazyInstance;
public LazyFieldReferenceExpression(IFieldSymbol field, Lazy<IOperation> instance, ISymbol member, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(field, member, semanticModel, syntax, type, constantValue, isImplicit)
public LazyFieldReferenceExpression(IFieldSymbol field, bool isDeclaration, Lazy<IOperation> instance, ISymbol member, SemanticModel semanticModel, SyntaxNode syntax, ITypeSymbol type, Optional<object> constantValue, bool isImplicit) :
base(field, isDeclaration, member, semanticModel, syntax, type, constantValue, isImplicit)
{
_lazyInstance = instance ?? throw new System.ArgumentNullException(nameof(instance));
}
......
......@@ -17,6 +17,14 @@ public interface IFieldReferenceExpression : IMemberReferenceExpression
/// Referenced field.
/// </summary>
IFieldSymbol Field { get; }
/// <summary>
/// If the field reference is also where the field was declared.
/// </summary>
/// <remarks>
/// This is only ever true in CSharp scripts, where a top-level statement creates a new variable
/// in a reference, such as an out variable declaration or a tuple deconstruction declaration.
/// </remarks>
bool IsDeclaration { get; }
}
}
......@@ -216,7 +216,7 @@ public override IOperation VisitInstanceReferenceExpression(IInstanceReferenceEx
public override IOperation VisitFieldReferenceExpression(IFieldReferenceExpression operation, object argument)
{
return new FieldReferenceExpression(operation.Field, Visit(operation.Instance), operation.Member, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
return new FieldReferenceExpression(operation.Field, operation.IsDeclaration, Visit(operation.Instance), operation.Member, ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit);
}
public override IOperation VisitMethodBindingExpression(IMethodBindingExpression operation, object argument)
......
......@@ -428,6 +428,7 @@ Microsoft.CodeAnalysis.Semantics.IFieldInitializer
Microsoft.CodeAnalysis.Semantics.IFieldInitializer.InitializedFields.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.IFieldSymbol>
Microsoft.CodeAnalysis.Semantics.IFieldReferenceExpression
Microsoft.CodeAnalysis.Semantics.IFieldReferenceExpression.Field.get -> Microsoft.CodeAnalysis.IFieldSymbol
Microsoft.CodeAnalysis.Semantics.IFieldReferenceExpression.IsDeclaration.get -> bool
Microsoft.CodeAnalysis.Semantics.IFixedStatement
Microsoft.CodeAnalysis.Semantics.IFixedStatement.Body.get -> Microsoft.CodeAnalysis.IOperation
Microsoft.CodeAnalysis.Semantics.IFixedStatement.Variables.get -> Microsoft.CodeAnalysis.Semantics.IVariableDeclarationStatement
......
......@@ -695,6 +695,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
Private Function CreateBoundFieldAccessOperation(boundFieldAccess As BoundFieldAccess) As IFieldReferenceExpression
Dim field As IFieldSymbol = boundFieldAccess.FieldSymbol
Dim isDeclaration As Boolean = False
Dim instance As Lazy(Of IOperation) = New Lazy(Of IOperation)(
Function()
If boundFieldAccess.FieldSymbol.IsShared Then
......@@ -709,7 +710,7 @@ Namespace Microsoft.CodeAnalysis.Semantics
Dim type As ITypeSymbol = boundFieldAccess.Type
Dim constantValue As [Optional](Of Object) = ConvertToOptional(boundFieldAccess.ConstantValueOpt)
Dim isImplicit As Boolean = boundFieldAccess.WasCompilerGenerated
Return New LazyFieldReferenceExpression(field, instance, member, _semanticModel, syntax, type, constantValue, isImplicit)
Return New LazyFieldReferenceExpression(field, isDeclaration, instance, member, _semanticModel, syntax, type, constantValue, isImplicit)
End Function
Private Function CreateBoundConditionalAccessOperation(boundConditionalAccess As BoundConditionalAccess) As IConditionalAccessExpression
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册