/// <summary> /// Bind a macro parameter of any type to a pattern of the same type /// </summary> /// <param name="valueAccess"></param> /// <param name="pattern"></param> /// <returns></returns> public GMacMacroBinding BindToTreePattern(AstDatastoreValueAccess valueAccess, IGMacTypedBinding pattern) { if (valueAccess.IsNullOrInvalid()) { throw new ArgumentNullException(nameof(valueAccess)); } if (valueAccess.AssociatedValueAccess.ExpressionType.IsSameType(pattern.GMacType.AssociatedType) == false) { throw new InvalidOperationException( $"Specified macro parameter {valueAccess.ValueAccessName} of type {valueAccess.GMacTypeSignature} is not of same type {pattern.GMacType.GMacTypeSignature} as given pattern" ); } var assignmentsList = valueAccess.AssociatedValueAccess.ExpandAndAssignAll(pattern); foreach (var assignment in assignmentsList) { BindScalarToPattern( assignment.Item1.ToAstDatastoreValueAccess(), assignment.Item2 ); } return(this); }
/// <summary> /// Bind a macro parameter of any type to a pattern of the same type /// </summary> /// <param name="valueAccessName"></param> /// <param name="pattern"></param> /// <returns></returns> public GMacMacroBinding BindToTreePattern(string valueAccessName, IGMacTypedBinding pattern) { return(BindToTreePattern(ToValueAccess(valueAccessName), pattern)); }