Address PR Feedback.

上级 d2523e59
......@@ -2009,36 +2009,34 @@ private IOperation CreateUsingLocalDeclarationsOperation(BoundUsingLocalDeclarat
isImplicit: false);
}
internal IPropertySubpatternOperation CreatePropertySubpattern(BoundSubpattern subpattern)
internal IPropertySubpatternOperation CreatePropertySubpattern(BoundSubpattern subpattern, ITypeSymbol matchedType)
{
SyntaxNode syntax = subpattern.Syntax;
return new CSharpLazyPropertySubpatternOperation(this, subpattern, syntax, _semanticModel);
return new CSharpLazyPropertySubpatternOperation(this, subpattern, matchedType, syntax, _semanticModel);
}
internal IOperation CreatePropertySubpatternMember(Symbol symbol, SyntaxNode syntax)
internal IOperation CreatePropertySubpatternMember(Symbol symbol, ITypeSymbol matchedType, SyntaxNode syntax)
{
var nameSyntax = (syntax is SubpatternSyntax subpatSyntax ? subpatSyntax.NameColon?.Name : null) ?? syntax;
bool isImplicit = nameSyntax != syntax;
bool isImplicit = nameSyntax == syntax;
switch (symbol)
{
case FieldSymbol field:
{
var constantValue = field.ConstantValue is null ? default(Optional<object>) : new Optional<object>(field.ConstantValue);
var receiver = new InstanceReferenceOperation(
InstanceReferenceKind.PatternInput, _semanticModel, nameSyntax, field.ContainingType, constantValue, isImplicit: true);
InstanceReferenceKind.PatternInput, _semanticModel, nameSyntax, matchedType, constantValue, isImplicit: true);
return new FieldReferenceOperation(
field, isDeclaration: false, receiver, _semanticModel, nameSyntax, field.Type.TypeSymbol, constantValue, isImplicit: isImplicit);
}
case PropertySymbol property:
{
var receiver = new InstanceReferenceOperation(
InstanceReferenceKind.PatternInput, _semanticModel, nameSyntax, property.ContainingType, constantValue: default, isImplicit: true);
InstanceReferenceKind.PatternInput, _semanticModel, nameSyntax, matchedType, constantValue: default, isImplicit: true);
return new PropertyReferenceOperation(
property, receiver, ImmutableArray<IArgumentOperation>.Empty, _semanticModel, nameSyntax, property.Type.TypeSymbol,
constantValue: default, isImplicit: isImplicit);
}
case null:
return null;
default:
// We should expose the symbol in this case somehow:
// https://github.com/dotnet/roslyn/issues/33175
......
......@@ -1516,7 +1516,7 @@ public override ImmutableArray<IPatternOperation> CreateDeconstructionSubpattern
public override ImmutableArray<IPropertySubpatternOperation> CreatePropertySubpatterns()
{
return _boundRecursivePattern.Properties.IsDefault ? ImmutableArray<IPropertySubpatternOperation>.Empty :
_boundRecursivePattern.Properties.SelectAsArray((p, fac) => fac.CreatePropertySubpattern(p), _operationFactory);
_boundRecursivePattern.Properties.SelectAsArray((p, fac) => fac.CreatePropertySubpattern(p, MatchedType), _operationFactory);
}
}
......@@ -1524,20 +1524,23 @@ internal sealed partial class CSharpLazyPropertySubpatternOperation : LazyProper
{
private readonly BoundSubpattern _subpattern;
private readonly CSharpOperationFactory _operationFactory;
private readonly ITypeSymbol _matchedType;
public CSharpLazyPropertySubpatternOperation(
CSharpOperationFactory operationFactory,
BoundSubpattern subpattern,
ITypeSymbol matchedType,
SyntaxNode syntax,
SemanticModel semanticModel)
: base(semanticModel, syntax, false)
: base(semanticModel, syntax, isImplicit: false)
{
_subpattern = subpattern;
_operationFactory = operationFactory;
_matchedType = matchedType;
}
public override IOperation CreateMember()
{
return _operationFactory.CreatePropertySubpatternMember(_subpattern.Symbol, Syntax);
return _operationFactory.CreatePropertySubpatternMember(_subpattern.Symbol, _matchedType, Syntax);
}
public override IPatternOperation CreatePattern()
......
......@@ -5818,7 +5818,7 @@ IArrayInitializerOperation popAndAssembleArrayInitializerValues(IArrayInitialize
public override IOperation VisitInstanceReference(IInstanceReferenceOperation operation, int? captureIdForResult)
{
if (operation.ReferenceKind == InstanceReferenceKind.ImplicitReceiver || operation.ReferenceKind == InstanceReferenceKind.PatternInput)
if (operation.ReferenceKind == InstanceReferenceKind.ImplicitReceiver)
{
// When we're in an object or collection initializer, we need to replace the instance reference with a reference to the object being initialized
Debug.Assert(operation.IsImplicit);
......@@ -6419,14 +6419,12 @@ public override IOperation VisitDefaultValue(IDefaultValueOperation operation, i
public override IOperation VisitIsPattern(IIsPatternOperation operation, int? captureIdForResult)
{
EvalStackFrame frame = PushStackFrame();
var capturedValue = VisitAndCapture(operation.Value);
var previousImplicitInstance = _currentImplicitInstance;
_currentImplicitInstance = new ImplicitInstanceInfo(capturedValue);
PushOperand(Visit(operation.Value));
var visitedPattern = (IPatternOperation)Visit(operation.Pattern);
_currentImplicitInstance = previousImplicitInstance;
IOperation visitedValue = PopOperand();
PopStackFrame(frame);
return new IsPatternOperation(capturedValue, visitedPattern, semanticModel: null,
operation.Syntax, operation.Type, operation.ConstantValue, IsImplicit(operation));
return new IsPatternOperation(visitedValue, visitedPattern, semanticModel: null,
operation.Syntax, operation.Type, operation.ConstantValue, IsImplicit(operation));
}
public override IOperation VisitInvalid(IInvalidOperation operation, int? captureIdForResult)
......@@ -6630,14 +6628,11 @@ public override IOperation VisitSwitchExpression(ISwitchExpressionOperation oper
RegionBuilder resultCaptureRegion = _currentRegion;
int captureOutput = captureIdForResult ?? GetNextCaptureId(resultCaptureRegion);
var capturedInput = VisitAndCapture(operation.Value);
var previousImplicitInstance = _currentImplicitInstance;
var switchImplicitInstance = new ImplicitInstanceInfo(capturedInput);
var afterSwitch = new BasicBlockBuilder(BasicBlockKind.Block);
foreach (var arm in operation.Arms)
{
// START scope (arm locals)
_currentImplicitInstance = switchImplicitInstance;
var armScopeRegion = new RegionBuilder(ControlFlowRegionKind.LocalLifetime, locals: arm.Locals);
EnterRegion(armScopeRegion);
var afterArm = new BasicBlockBuilder(BasicBlockKind.Block);
......@@ -6663,8 +6658,6 @@ public override IOperation VisitSwitchExpression(ISwitchExpressionOperation oper
PopStackFrameAndLeaveRegion(frame);
}
_currentImplicitInstance = previousImplicitInstance;
// captureOutput = e
VisitAndCapture(arm.Value, captureOutput);
......
......@@ -552,7 +552,7 @@ internal override IOperation VisitRecursivePattern(IRecursivePatternOperation op
internal override IOperation VisitPropertySubpattern(IPropertySubpatternOperation operation, object argument)
{
return new PropertySubpatternOperation(
semanticModel: null,
semanticModel: ((Operation)operation).OwningSemanticModel,
operation.Syntax,
operation.IsImplicit,
Visit(operation.Member),
......
......@@ -1728,14 +1728,16 @@ private static bool CanBeInControlFlowGraph(IOperation n)
case OperationKind.InstanceReference:
// Implicit instance receivers, except for anonymous type creations, are expected to have been removed when dealing with creations.
return ((IInstanceReferenceOperation)n).ReferenceKind == InstanceReferenceKind.ContainingTypeInstance ||
((IInstanceReferenceOperation)n).ReferenceKind == InstanceReferenceKind.ImplicitReceiver &&
n.Type.IsAnonymousType &&
n.Parent is IPropertyReferenceOperation propertyReference &&
propertyReference.Instance == n &&
propertyReference.Parent is ISimpleAssignmentOperation simpleAssignment &&
simpleAssignment.Target == propertyReference &&
simpleAssignment.Parent.Kind == OperationKind.AnonymousObjectCreation;
var instanceReference = (IInstanceReferenceOperation)n;
return instanceReference.ReferenceKind == InstanceReferenceKind.ContainingTypeInstance ||
instanceReference.ReferenceKind == InstanceReferenceKind.PatternInput ||
(instanceReference.ReferenceKind == InstanceReferenceKind.ImplicitReceiver &&
n.Type.IsAnonymousType &&
n.Parent is IPropertyReferenceOperation propertyReference &&
propertyReference.Instance == n &&
propertyReference.Parent is ISimpleAssignmentOperation simpleAssignment &&
simpleAssignment.Target == propertyReference &&
simpleAssignment.Parent.Kind == OperationKind.AnonymousObjectCreation);
case OperationKind.None:
return !(n is IPlaceholderOperation);
......
......@@ -1197,12 +1197,10 @@ internal override void VisitRecursivePattern(IRecursivePatternOperation operatio
internal override void VisitPropertySubpattern(IPropertySubpatternOperation operation)
{
Assert.True(operation.Member is IMemberReferenceOperation);
Assert.True(operation.Member is IMemberReferenceOperation || operation.Member is IInvalidOperation);
var member = (IMemberReferenceOperation)operation.Member;
switch (member.Member)
{
case null: // error case
break;
case IFieldSymbol field:
case IPropertySymbol prop:
case IErrorTypeSymbol error:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册