Address PR Feedback.

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