private BoundExpression MakeIsDeclarationPattern(BoundDeclarationPattern loweredPattern, BoundExpression loweredInput) { Debug.Assert(((object)loweredPattern.Variable == null && loweredPattern.VariableAccess.Kind == BoundKind.DiscardExpression) || loweredPattern.Variable.GetTypeOrReturnType() == loweredPattern.DeclaredType.Type); if (loweredPattern.IsVar) { var result = _factory.Literal(true); if (loweredPattern.VariableAccess.Kind == BoundKind.DiscardExpression) { return(result); } Debug.Assert((object)loweredPattern.Variable != null && loweredInput.Type == loweredPattern.Variable.GetTypeOrReturnType()); var assignment = _factory.AssignmentExpression(loweredPattern.VariableAccess, loweredInput); return(_factory.MakeSequence(assignment, result)); } if (loweredPattern.VariableAccess.Kind == BoundKind.DiscardExpression) { LocalSymbol temp; BoundLocal discard = _factory.MakeTempForDiscard((BoundDiscardExpression)loweredPattern.VariableAccess, out temp); return(_factory.Sequence(ImmutableArray.Create(temp), sideEffects: ImmutableArray <BoundExpression> .Empty, result: MakeIsDeclarationPattern(loweredPattern.Syntax, loweredInput, discard, requiresNullTest: true))); } return(MakeIsDeclarationPattern(loweredPattern.Syntax, loweredInput, loweredPattern.VariableAccess, requiresNullTest: true)); }
public override BoundNode VisitDeclarationPattern(BoundDeclarationPattern node) { if (IsInside) { _variablesDeclared.Add(node.LocalSymbol); } return(base.VisitDeclarationPattern(node)); }
private BoundExpression LowerDeclarationPattern(BoundDeclarationPattern pattern, BoundExpression input) { Debug.Assert(pattern.IsVar || pattern.LocalSymbol.Type == pattern.DeclaredType.Type); if (pattern.IsVar) { Debug.Assert(input.Type == pattern.LocalSymbol.Type); var assignment = _factory.AssignmentExpression(_factory.Local(pattern.LocalSymbol), input); var result = _factory.Literal(true); return(_factory.MakeSequence(assignment, result)); } return(MakeDeclarationPattern(pattern.Syntax, input, pattern.LocalSymbol, requiresNullTest: true)); }
private BoundExpression MakeIsDeclarationPattern(BoundDeclarationPattern loweredPattern, BoundExpression loweredInput) { Debug.Assert(loweredPattern.Variable.GetTypeOrReturnType() == loweredPattern.DeclaredType.Type); if (loweredPattern.IsVar) { Debug.Assert(loweredInput.Type == loweredPattern.Variable.GetTypeOrReturnType()); var assignment = _factory.AssignmentExpression(loweredPattern.VariableAccess, loweredInput); var result = _factory.Literal(true); return(_factory.MakeSequence(assignment, result)); } return(MakeIsDeclarationPattern(loweredPattern.Syntax, loweredInput, loweredPattern.VariableAccess, requiresNullTest: true)); }
private BoundExpression LowerDeclarationPattern(BoundDeclarationPattern pattern, BoundExpression input) { Debug.Assert(pattern.Variable.GetTypeOrReturnType() == pattern.DeclaredType.Type); var variableAccess = VisitExpression(pattern.VariableAccess); if (pattern.IsVar) { Debug.Assert(input.Type == pattern.Variable.GetTypeOrReturnType()); var assignment = _factory.AssignmentExpression(variableAccess, input); var result = _factory.Literal(true); return(_factory.MakeSequence(assignment, result)); } return(MakeDeclarationPattern(pattern.Syntax, input, variableAccess, requiresNullTest: true)); }
public override BoundNode VisitDeclarationPattern(BoundDeclarationPattern node) { Visit(node.VariableAccess); Visit(node.DeclaredType); return(null); }