提交 46eb1122 编写于 作者: J John Hamby

Overhaul IInstanceReferenceExpression.

上级 28791bf5
......@@ -884,11 +884,9 @@ public override void Accept(OperationVisitor visitor)
internal partial class BoundBaseReference : IInstanceReferenceExpression
{
bool IInstanceReferenceExpression.IsExplicit => this.Syntax.Kind() == SyntaxKind.BaseExpression;
InstanceReferenceKind IInstanceReferenceExpression.InstanceReferenceKind => InstanceReferenceKind.BaseClass;
IParameterSymbol IParameterReferenceExpression.Parameter => (IParameterSymbol)this.ExpressionSymbol;
protected override OperationKind ExpressionKind => OperationKind.BaseClassInstanceReferenceExpression;
protected override OperationKind ExpressionKind => OperationKind.InstanceReferenceExpression;
public override void Accept(OperationVisitor visitor)
{
......@@ -903,9 +901,7 @@ public override void Accept(OperationVisitor visitor)
internal partial class BoundThisReference : IInstanceReferenceExpression
{
bool IInstanceReferenceExpression.IsExplicit => this.Syntax.Kind() == SyntaxKind.ThisExpression;
IParameterSymbol IParameterReferenceExpression.Parameter => (IParameterSymbol)this.ExpressionSymbol;
InstanceReferenceKind IInstanceReferenceExpression.InstanceReferenceKind => this.Syntax.Kind() == SyntaxKind.ThisExpression ? InstanceReferenceKind.Explicit : InstanceReferenceKind.Implicit;
protected override OperationKind ExpressionKind => OperationKind.InstanceReferenceExpression;
......@@ -941,7 +937,7 @@ public override void Accept(OperationVisitor visitor)
internal partial class BoundCompoundAssignmentOperator : ICompoundAssignmentExpression
{
BinaryOperationKind ICompoundAssignmentExpression.BinaryKind => Expression.DeriveBinaryOperationKind(this.Operator.Kind);
BinaryOperationKind ICompoundAssignmentExpression.BinaryOperationKind => Expression.DeriveBinaryOperationKind(this.Operator.Kind);
IReferenceExpression IAssignmentExpression.Target => this.Left as IReferenceExpression;
......@@ -966,9 +962,9 @@ public override void Accept(OperationVisitor visitor)
internal partial class BoundIncrementOperator : IIncrementExpression
{
UnaryOperationKind IIncrementExpression.IncrementKind => Expression.DeriveUnaryOperationKind(this.OperatorKind);
UnaryOperationKind IIncrementExpression.IncrementOperationKind => Expression.DeriveUnaryOperationKind(this.OperatorKind);
BinaryOperationKind ICompoundAssignmentExpression.BinaryKind => Expression.DeriveBinaryOperationKind(((IIncrementExpression)this).IncrementKind);
BinaryOperationKind ICompoundAssignmentExpression.BinaryOperationKind => Expression.DeriveBinaryOperationKind(((IIncrementExpression)this).IncrementOperationKind);
IReferenceExpression IAssignmentExpression.Target => this.Operand as IReferenceExpression;
......@@ -1211,10 +1207,8 @@ public override void Accept(OperationVisitor visitor)
internal partial class BoundImplicitReceiver : IInstanceReferenceExpression
{
bool IInstanceReferenceExpression.IsExplicit => false;
IParameterSymbol IParameterReferenceExpression.Parameter => (IParameterSymbol)this.ExpressionSymbol;
InstanceReferenceKind IInstanceReferenceExpression.InstanceReferenceKind => InstanceReferenceKind.Implicit;
protected override OperationKind ExpressionKind => OperationKind.InstanceReferenceExpression;
public override void Accept(OperationVisitor visitor)
......
......@@ -104,8 +104,6 @@ private static void AssignTo(IExpression target, bool inConstructor, ITypeSymbol
switch (fieldReference.Instance.Kind)
{
case OperationKind.InstanceReferenceExpression:
case OperationKind.BaseClassInstanceReferenceExpression:
case OperationKind.ClassInstanceReferenceExpression:
return;
}
}
......
......@@ -216,7 +216,7 @@ public sealed override void Initialize(AnalysisContext context)
{
// Advance binary operation is known to involve a reference to the local used in the test and a constant.
advanceIncrement = advanceAssignment.Value;
advanceOperationCode = advanceAssignment.BinaryKind;
advanceOperationCode = advanceAssignment.BinaryOperationKind;
}
}
......@@ -918,10 +918,9 @@ public sealed override void Initialize(AnalysisContext context)
(operationContext) =>
{
IInstanceReferenceExpression instanceReference = (IInstanceReferenceExpression)operationContext.Operation;
operationContext.ReportDiagnostic(Diagnostic.Create(instanceReference.IsExplicit ? ExplicitInstanceDescriptor : ImplicitInstanceDescriptor, instanceReference.Syntax.GetLocation()));
operationContext.ReportDiagnostic(Diagnostic.Create(instanceReference.InstanceReferenceKind == InstanceReferenceKind.Implicit ? ImplicitInstanceDescriptor : ExplicitInstanceDescriptor, instanceReference.Syntax.GetLocation()));
},
OperationKind.InstanceReferenceExpression,
OperationKind.BaseClassInstanceReferenceExpression);
OperationKind.InstanceReferenceExpression);
}
}
......
......@@ -216,7 +216,7 @@ public CompoundAssignmentExpression(IReferenceExpression target, IExpression val
{
this.Target = target;
this.Value = value;
this.BinaryKind = binaryKind;
this.BinaryOperationKind = binaryKind;
this.OperatorMethod = operatorMethod;
this.Syntax = syntax;
}
......@@ -225,7 +225,7 @@ public CompoundAssignmentExpression(IReferenceExpression target, IExpression val
public IExpression Value { get; }
public BinaryOperationKind BinaryKind { get; }
public BinaryOperationKind BinaryOperationKind { get; }
public IMethodSymbol OperatorMethod { get; }
......
......@@ -198,16 +198,29 @@ public enum SyntheticLocalKind
}
/// <summary>
/// Represents a reference to a C# this or VB Me parameter.
/// Represents a C# this or base expression, or a VB Me, MyClass, or MyBase expression.
/// </summary>
public interface IInstanceReferenceExpression : IParameterReferenceExpression
public interface IInstanceReferenceExpression : IExpression
{
///
/// <summary>
/// Indicates whether the reference is explicit or implicit in source.
/// Kind of instance reference.
/// </summary>
bool IsExplicit { get; }
InstanceReferenceKind InstanceReferenceKind { get; }
}
public enum InstanceReferenceKind
{
/// <summary>Indicates an implicit this or Me expression.</summary>
Implicit = 0x0,
/// <summary>Indicates an explicit this or Me expression.</summary>
Explicit = 0x1,
/// <summary>Indicates an explicit base or MyBase expression.</summary>
BaseClass = 0x2,
/// <summary>Indicates an explicit MyClass expression.</summary>
ThisClass = 0x3
}
/// <summary>
/// Represents a reference to a member of a class, struct, or interface.
/// </summary>
......@@ -713,6 +726,14 @@ public static SimpleUnaryOperationKind GetSimpleUnaryOperationKind(this IUnaryOp
return GetSimpleUnaryOperationKind(unary.UnaryOperationKind);
}
/// <summary>
/// Get unary operation kind independent of data type.
/// </summary>
public static SimpleUnaryOperationKind GetSimpleUnaryOperationKind(this IIncrementExpression increment)
{
return GetSimpleUnaryOperationKind(increment.IncrementOperationKind);
}
/// <summary>
/// Get unary operand kind.
/// </summary>
......@@ -721,6 +742,14 @@ public static UnaryOperandKind GetUnaryOperandKind(this IUnaryOperatorExpression
return GetUnaryOperandKind(unary.UnaryOperationKind);
}
/// <summary>
/// Get unary operand kind.
/// </summary>
public static UnaryOperandKind GetUnaryOperandKind(this IIncrementExpression increment)
{
return GetUnaryOperandKind(increment.IncrementOperationKind);
}
/// <summary>
/// Get binary operation kind independent of data type.
/// </summary>
......@@ -729,6 +758,14 @@ public static SimpleBinaryOperationKind GetSimpleBinaryOperationKind(this IBinar
return GetSimpleBinaryOperationKind(binary.BinaryOperationKind);
}
/// <summary>
/// Get binary operation kind independent of data type.
/// </summary>
public static SimpleBinaryOperationKind GetSimpleBinaryOperationKind(this ICompoundAssignmentExpression compoundAssignment)
{
return GetSimpleBinaryOperationKind(compoundAssignment.BinaryOperationKind);
}
/// <summary>
/// Get binary operand kinds.
/// </summary>
......@@ -737,6 +774,14 @@ public static BinaryOperandsKind GetBinaryOperandsKind(this IBinaryOperatorExpre
return GetBinaryOperandsKind(binary.BinaryOperationKind);
}
/// <summary>
/// Get binary operand kinds.
/// </summary>
public static BinaryOperandsKind GetBinaryOperandsKind(this ICompoundAssignmentExpression compoundAssignment)
{
return GetBinaryOperandsKind(compoundAssignment.BinaryOperationKind);
}
public static SimpleUnaryOperationKind GetSimpleUnaryOperationKind(UnaryOperationKind kind)
{
return (SimpleUnaryOperationKind)((int)kind & UnaryAndBinaryOperationExtensions.SimpleUnaryOperationKindMask);
......@@ -1036,7 +1081,7 @@ public interface ICompoundAssignmentExpression : IAssignmentExpression, IHasOper
/// <summary>
/// Kind of binary operation.
/// </summary>
BinaryOperationKind BinaryKind { get; }
BinaryOperationKind BinaryOperationKind { get; }
}
/// <summary>
......@@ -1047,7 +1092,7 @@ public interface IIncrementExpression : ICompoundAssignmentExpression
/// <summary>
/// Kind of increment.
/// </summary>
UnaryOperationKind IncrementKind { get; }
UnaryOperationKind IncrementOperationKind { get; }
}
/// <summary>
......
......@@ -122,9 +122,8 @@ public enum OperationKind
/// <summary>Indicates an <see cref="IArrayCreationExpression"/>.</summary>
ArrayCreationExpression = 0x2e,
DefaultValueExpression = 0x2f,
/// <summary>Indicates an <see cref="IInstanceReferenceExpression"/>.</summary>
InstanceReferenceExpression = 0x30,
BaseClassInstanceReferenceExpression = 0x31,
ClassInstanceReferenceExpression = 0x32,
/// <summary>Indicates an <see cref="IIsExpression"/>.</summary>
IsExpression = 0x33,
// TypeOperationExpression = 0x34,
......
......@@ -73,12 +73,10 @@ Microsoft.CodeAnalysis.OperationKind.ArrayElementReferenceExpression = 29 -> Mic
Microsoft.CodeAnalysis.OperationKind.ArrayInitializer = 69 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.AssignmentExpression = 55 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.AwaitExpression = 53 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.BaseClassInstanceReferenceExpression = 49 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.BinaryOperatorExpression = 40 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.BlockStatement = 2 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.BranchStatement = 12 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.CatchClause = 18 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.ClassInstanceReferenceExpression = 50 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.CompoundAssignmentExpression = 56 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.ConditionalAccessExpression = 64 -> Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.ConditionalChoiceExpression = 41 -> Microsoft.CodeAnalysis.OperationKind
......@@ -367,7 +365,7 @@ Microsoft.CodeAnalysis.Semantics.ICatchClause.ExceptionLocal.get -> Microsoft.Co
Microsoft.CodeAnalysis.Semantics.ICatchClause.Filter.get -> Microsoft.CodeAnalysis.Semantics.IExpression
Microsoft.CodeAnalysis.Semantics.ICatchClause.Handler.get -> Microsoft.CodeAnalysis.Semantics.IBlockStatement
Microsoft.CodeAnalysis.Semantics.ICompoundAssignmentExpression
Microsoft.CodeAnalysis.Semantics.ICompoundAssignmentExpression.BinaryKind.get -> Microsoft.CodeAnalysis.Semantics.BinaryOperationKind
Microsoft.CodeAnalysis.Semantics.ICompoundAssignmentExpression.BinaryOperationKind.get -> Microsoft.CodeAnalysis.Semantics.BinaryOperationKind
Microsoft.CodeAnalysis.Semantics.IConditionalAccessExpression
Microsoft.CodeAnalysis.Semantics.IConditionalAccessExpression.Access.get -> Microsoft.CodeAnalysis.Semantics.IExpression
Microsoft.CodeAnalysis.Semantics.IConditionalChoiceExpression
......@@ -419,9 +417,9 @@ Microsoft.CodeAnalysis.Semantics.IIfStatement.Condition.get -> Microsoft.CodeAna
Microsoft.CodeAnalysis.Semantics.IIfStatement.IfFalse.get -> Microsoft.CodeAnalysis.IOperation
Microsoft.CodeAnalysis.Semantics.IIfStatement.IfTrue.get -> Microsoft.CodeAnalysis.IOperation
Microsoft.CodeAnalysis.Semantics.IIncrementExpression
Microsoft.CodeAnalysis.Semantics.IIncrementExpression.IncrementKind.get -> Microsoft.CodeAnalysis.Semantics.UnaryOperationKind
Microsoft.CodeAnalysis.Semantics.IIncrementExpression.IncrementOperationKind.get -> Microsoft.CodeAnalysis.Semantics.UnaryOperationKind
Microsoft.CodeAnalysis.Semantics.IInstanceReferenceExpression
Microsoft.CodeAnalysis.Semantics.IInstanceReferenceExpression.IsExplicit.get -> bool
Microsoft.CodeAnalysis.Semantics.IInstanceReferenceExpression.InstanceReferenceKind.get -> Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind
Microsoft.CodeAnalysis.Semantics.IInvalidStatement
Microsoft.CodeAnalysis.Semantics.IInvocationExpression
Microsoft.CodeAnalysis.Semantics.IInvocationExpression.ArgumentsInSourceOrder.get -> System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Semantics.IArgument>
......@@ -528,6 +526,11 @@ Microsoft.CodeAnalysis.Semantics.IWhileUntilLoopStatement.IsWhile.get -> bool
Microsoft.CodeAnalysis.Semantics.IWithStatement
Microsoft.CodeAnalysis.Semantics.IWithStatement.Body.get -> Microsoft.CodeAnalysis.IOperation
Microsoft.CodeAnalysis.Semantics.IWithStatement.Value.get -> Microsoft.CodeAnalysis.Semantics.IExpression
Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind
Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind.BaseClass = 2 -> Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind
Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind.Explicit = 1 -> Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind
Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind.Implicit = 0 -> Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind
Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind.ThisClass = 3 -> Microsoft.CodeAnalysis.Semantics.InstanceReferenceKind
Microsoft.CodeAnalysis.Semantics.LoopKind
Microsoft.CodeAnalysis.Semantics.LoopKind.For = 1 -> Microsoft.CodeAnalysis.Semantics.LoopKind
Microsoft.CodeAnalysis.Semantics.LoopKind.ForEach = 2 -> Microsoft.CodeAnalysis.Semantics.LoopKind
......@@ -732,11 +735,15 @@ static Microsoft.CodeAnalysis.Semantics.OperationExtensions.DescendantsAndSelf(t
static Microsoft.CodeAnalysis.Semantics.OperationExtensions.GetRootOperation(this Microsoft.CodeAnalysis.ISymbol symbol, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> Microsoft.CodeAnalysis.IOperation
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetBinaryOperandsKind(Microsoft.CodeAnalysis.Semantics.BinaryOperationKind kind) -> Microsoft.CodeAnalysis.Semantics.BinaryOperandsKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetBinaryOperandsKind(this Microsoft.CodeAnalysis.Semantics.IBinaryOperatorExpression binary) -> Microsoft.CodeAnalysis.Semantics.BinaryOperandsKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetBinaryOperandsKind(this Microsoft.CodeAnalysis.Semantics.ICompoundAssignmentExpression compoundAssignment) -> Microsoft.CodeAnalysis.Semantics.BinaryOperandsKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetSimpleBinaryOperationKind(Microsoft.CodeAnalysis.Semantics.BinaryOperationKind kind) -> Microsoft.CodeAnalysis.Semantics.SimpleBinaryOperationKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetSimpleBinaryOperationKind(this Microsoft.CodeAnalysis.Semantics.IBinaryOperatorExpression binary) -> Microsoft.CodeAnalysis.Semantics.SimpleBinaryOperationKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetSimpleBinaryOperationKind(this Microsoft.CodeAnalysis.Semantics.ICompoundAssignmentExpression compoundAssignment) -> Microsoft.CodeAnalysis.Semantics.SimpleBinaryOperationKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetSimpleUnaryOperationKind(Microsoft.CodeAnalysis.Semantics.UnaryOperationKind kind) -> Microsoft.CodeAnalysis.Semantics.SimpleUnaryOperationKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetSimpleUnaryOperationKind(this Microsoft.CodeAnalysis.Semantics.IIncrementExpression increment) -> Microsoft.CodeAnalysis.Semantics.SimpleUnaryOperationKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetSimpleUnaryOperationKind(this Microsoft.CodeAnalysis.Semantics.IUnaryOperatorExpression unary) -> Microsoft.CodeAnalysis.Semantics.SimpleUnaryOperationKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetUnaryOperandKind(Microsoft.CodeAnalysis.Semantics.UnaryOperationKind kind) -> Microsoft.CodeAnalysis.Semantics.UnaryOperandKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetUnaryOperandKind(this Microsoft.CodeAnalysis.Semantics.IIncrementExpression increment) -> Microsoft.CodeAnalysis.Semantics.UnaryOperandKind
static Microsoft.CodeAnalysis.Semantics.UnaryAndBinaryOperationExtensions.GetUnaryOperandKind(this Microsoft.CodeAnalysis.Semantics.IUnaryOperatorExpression unary) -> Microsoft.CodeAnalysis.Semantics.UnaryOperandKind
virtual Microsoft.CodeAnalysis.Diagnostics.AnalysisContext.ConfigureGeneratedCodeAnalysis(Microsoft.CodeAnalysis.Diagnostics.GeneratedCodeAnalysisFlags analysisMode) -> void
virtual Microsoft.CodeAnalysis.Diagnostics.AnalysisContext.EnableConcurrentExecution() -> void
......
......@@ -78,7 +78,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Get
End Property
Private ReadOnly Property IBinaryKind As BinaryOperationKind Implements ICompoundAssignmentExpression.BinaryKind
Private ReadOnly Property IBinaryKind As BinaryOperationKind Implements ICompoundAssignmentExpression.BinaryOperationKind
Get
If ExpressionKind() = OperationKind.CompoundAssignmentExpression Then
Dim rightBinary As BoundBinaryOperator = TryCast(Me.Right, BoundBinaryOperator)
......@@ -154,15 +154,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Friend Partial Class BoundMeReference
Implements IInstanceReferenceExpression
Private ReadOnly Property IIsExplicit As Boolean Implements IInstanceReferenceExpression.IsExplicit
Private ReadOnly Property IInstanceReferenceKind As InstanceReferenceKind Implements IInstanceReferenceExpression.InstanceReferenceKind
Get
Return Not Me.WasCompilerGenerated
End Get
End Property
Private ReadOnly Property IParameter As IParameterSymbol Implements IParameterReferenceExpression.Parameter
Get
Return DirectCast(Me.ExpressionSymbol, IParameterSymbol)
Return If(Me.WasCompilerGenerated, InstanceReferenceKind.Implicit, InstanceReferenceKind.Explicit)
End Get
End Property
......@@ -182,20 +176,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Friend Partial Class BoundMyBaseReference
Implements IInstanceReferenceExpression
Private ReadOnly Property IIsExplicit As Boolean Implements IInstanceReferenceExpression.IsExplicit
Get
Return True
End Get
End Property
Private ReadOnly Property IParameter As IParameterSymbol Implements IParameterReferenceExpression.Parameter
Private ReadOnly Property IInstanceReferenceKind As InstanceReferenceKind Implements IInstanceReferenceExpression.InstanceReferenceKind
Get
Return DirectCast(Me.ExpressionSymbol, IParameterSymbol)
Return InstanceReferenceKind.BaseClass
End Get
End Property
Protected Overrides Function ExpressionKind() As OperationKind
Return OperationKind.BaseClassInstanceReferenceExpression
Return OperationKind.InstanceReferenceExpression
End Function
Public Overrides Sub Accept(visitor As OperationVisitor)
......@@ -210,20 +198,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Friend Partial Class BoundMyClassReference
Implements IInstanceReferenceExpression
Private ReadOnly Property IIsExplicit As Boolean Implements IInstanceReferenceExpression.IsExplicit
Get
Return True
End Get
End Property
Private ReadOnly Property IParameter As IParameterSymbol Implements IParameterReferenceExpression.Parameter
Private ReadOnly Property IInstanceReferenceKind As InstanceReferenceKind Implements IInstanceReferenceExpression.InstanceReferenceKind
Get
Return DirectCast(Me.ExpressionSymbol, IParameterSymbol)
Return InstanceReferenceKind.ThisClass
End Get
End Property
Protected Overrides Function ExpressionKind() As OperationKind
Return OperationKind.ClassInstanceReferenceExpression
Return OperationKind.InstanceReferenceExpression
End Function
Public Overrides Sub Accept(visitor As OperationVisitor)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册