예제 #1
0
        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);
        }
예제 #2
0
        ///// <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);
        }
예제 #3
0
        /// <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));
        }
예제 #4
0
        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);
        }