private TupleDesugaringResult DesugarTuplePattern(tuple_pattern pattern, expression matchingExpression) { Debug.Assert(!pattern.IsRecursive, "All recursive patterns should be desugared into simple patterns at this point"); var desugaringResult = new TupleDesugaringResult(); var tupleItems = pattern.parameters; for (int i = 0; i < tupleItems.Count; ++i) { var tupleItemCall = new dot_node( matchingExpression as addressed_value, new ident("Item" + (i + 1).ToString()), matchingExpression.source_context); if (tupleItems[i] is tuple_pattern_var_parameter varParam) { desugaringResult.VarParametersDeclarations.Add( new var_statement( varParam.identifier, tupleItemCall, matchingExpression.source_context ) ); } if (tupleItems[i] is const_pattern_parameter constParam) { var eqParams = new expression_list( new List <expression>() { tupleItemCall, constParam.const_param } ); var equalCall = new method_call( new dot_node(new ident("object"), new ident("Equals")), eqParams, pattern.source_context ); desugaringResult.SuccessMatchingCheck = desugaringResult.SuccessMatchingCheck == null ? (expression)equalCall : bin_expr.LogicalAnd(desugaringResult.SuccessMatchingCheck, equalCall); desugaringResult.ElemTypeChecks.Add(GetTypeCompatibilityCheck(tupleItemCall, constParam.const_param)); } } desugaringResult.TupleLengthCheck = GetTypeCompatibilityCheck(matchingExpression, new int32_const(tupleItems.Count)); if (desugaringResult.SuccessMatchingCheck == null) { desugaringResult.SuccessMatchingCheck = new bool_const(true); } return(desugaringResult); }
public virtual void visit(tuple_pattern _tuple_pattern) { DefaultVisit(_tuple_pattern); }