private BoundExpression MakeIsDeclarationPattern(BoundDeclarationPattern loweredPattern, BoundExpression loweredInput) { Debug.Assert(((object)loweredPattern.Variable == null && loweredPattern.VariableAccess.Kind == BoundKind.DiscardedExpression) || loweredPattern.Variable.GetTypeOrReturnType() == loweredPattern.DeclaredType.Type); if (loweredPattern.IsVar) { var result = _factory.Literal(true); if (loweredPattern.VariableAccess.Kind == BoundKind.DiscardedExpression) { 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.DiscardedExpression) { LocalSymbol temp; BoundLocal discard = _factory.MakeTempForDiscard((BoundDiscardedExpression)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.Sequence(assignment, result); } return MakeDeclarationPattern(pattern.Syntax, input, pattern.LocalSymbol); }
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.IsVar || pattern.LocalSymbol.Type == pattern.DeclaredType.Type); var variableAccess = VisitExpression(pattern.VariableAccess); if (pattern.IsVar) { Debug.Assert(input.Type == pattern.LocalSymbol.Type); var assignment = _factory.AssignmentExpression(variableAccess, input); var result = _factory.Literal(true); return _factory.MakeSequence(assignment, result); } return MakeDeclarationPattern(pattern.Syntax, input, variableAccess, requiresNullTest: true); }