public IGMacCompositeBinding PickConstantComponentsAsVariables() { var macroPattern = new GMacMacroTreeBinding(BaseMacro); foreach (var pair in _patternDictionary.Where(pair => pair.Value.HasConstantComponent)) { var scalarPattern = pair.Value as GMacScalarBinding; if (scalarPattern != null) { macroPattern._patternDictionary.Add( pair.Key, scalarPattern.ToConstantsFreePattern() as IGMacTypedBinding ); continue; } var compositePattern = pair.Value as IGMacCompositeBinding; if (compositePattern != null) { macroPattern._patternDictionary.Add( pair.Key, compositePattern.PickConstantComponentsAsVariables() as IGMacTypedBinding ); } } return(macroPattern); }
///// <summary> ///// Bind a macro parameter of any type using the corresponding expressions inside the ///// given value of the same type ///// </summary> ///// <param name="valueAccessName"></param> ///// <param name="value"></param> ///// <returns></returns> //public GMacMacroBinding BindUsing(string valueAccessName, AstValue value) //{ // var valueAccess = ToValueAccess(valueAccessName, value.AssociatedValue.ExpressionType); // return BindUsing(valueAccess, value); //} ///// <summary> ///// Bind a macro parameter of any type using the corresponding expressions inside the ///// given value of the same type ///// </summary> ///// <param name="valueAccess"></param> ///// <param name="value"></param> ///// <returns></returns> //public GMacMacroBinding BindUsing(AstDatastoreValueAccess valueAccess, AstValue value) //{ // if (valueAccess.IsNullOrInvalid()) // throw new ArgumentNullException("valueAccess"); // if (valueAccess.AssociatedValueAccess.ExpressionType.IsSameType(value.AssociatedValue.ExpressionType) == false) // throw new InvalidOperationException( // String.Format( // "Specified macro parameter {0} of type {1} is not of same type {2} as given value", // valueAccess.ValueAccessName, // valueAccess.GMacTypeSignature, // value.GMacTypeSignature // ) // ); // var assignmentsList = valueAccess.AssociatedValueAccess.ExpandAndAssignAll(value.AssociatedValue); // foreach (var assignment in assignmentsList) // BindScalarToConstant( // assignment.Item1.ToAstDatastoreValueAccess(), // assignment.Item2.ToExpr() // ); // return this; //} /// <summary> /// Add bindings to this list using the bindings in a tree macro binding pattern /// </summary> /// <param name="treePattern"></param> /// <returns></returns> public GMacMacroBinding BindUsing(GMacMacroTreeBinding treePattern) { if (treePattern.BaseGMacMacro.ObjectId != AssociatedMacro.ObjectId) { throw new InvalidOperationException("Base macro of tree macro pattern not the same as base macro for list pattern"); } var assignmentsList = treePattern .Select( pair => treePattern .BaseGMacMacro .GetParameter(pair.Key) .ExpandAndAssignAll(pair.Value) .ToArray() ) .SelectMany(assignList => assignList); foreach (var assignment in assignmentsList) { BindScalarToPattern( assignment.Item1.ToAstDatastoreValueAccess(), assignment.Item2 ); } return(this); }
/// <summary> /// Create a macro parameters list binding pattern from a tree pattern /// </summary> /// <param name="macroTreeBinding"></param> /// <returns></returns> public static GMacMacroBinding Create(GMacMacroTreeBinding macroTreeBinding) { var listPattern = new GMacMacroBinding(macroTreeBinding.BaseMacro) { BindOutputToConstantBehavior = macroTreeBinding.BindOutputToConstantAction }; return(listPattern.BindUsing(macroTreeBinding)); }
public IGMacBinding ToConstantsFreePattern() { var macroPattern = new GMacMacroTreeBinding(BaseMacro); foreach (var pair in _patternDictionary) { macroPattern ._patternDictionary .Add( pair.Key, pair.Value.ToConstantsFreePattern() as IGMacTypedBinding ); } return(macroPattern); }