Example #1
0
        /// <summary>
        /// All binding methods eventually call this one so all checks are performed here
        /// If the given scalar binding is null the scalar macro parameter is un-bound
        /// </summary>
        /// <param name="valueAccess"></param>
        /// <param name="scalarBinding"></param>
        /// <returns></returns>
        public GMacMacroBinding BindScalarToPattern(AstDatastoreValueAccess valueAccess, GMacScalarBinding scalarBinding)
        {
            if (valueAccess.IsNullOrInvalid())
            {
                throw new ArgumentNullException(nameof(valueAccess));
            }

            var valueAccessName = valueAccess.ValueAccessName;

            if (valueAccess.IsMacroParameter == false || valueAccess.IsScalar == false)
            {
                throw new InvalidOperationException(
                          $"Unable to bind the value access {valueAccessName} as it's either non-scalar or not a macro parameter"
                          );
            }

            if (scalarBinding == null)
            {
                return(UnBind(valueAccess));
            }

            if (valueAccess.AssociatedValueAccess.RootSymbol.ParentLanguageSymbol.ObjectId != AssociatedMacro.ObjectId)
            {
                throw new InvalidOperationException(
                          $"Unable to bind the value access {valueAccessName} as it's not a peremeter of the macro {AssociatedMacro.SymbolAccessName}"
                          );
            }

            GMacMacroParameterBinding paramBinding = null;

            if (valueAccess.IsOutputParameter && scalarBinding.IsConstant)
            {
                switch (BindOutputToConstantBehavior)
                {
                case GMacBindOutputToConstantBehavior.Prevent:
                    throw new InvalidOperationException(
                              $"Unable to bind the output macro parameter {valueAccessName} to a constant"
                              );

                case GMacBindOutputToConstantBehavior.Ignore:
                    return(this);

                case GMacBindOutputToConstantBehavior.BindToVariable:
                    paramBinding = GMacMacroParameterBinding.CreateVariable(valueAccess);
                    break;
                }
            }
            else
            {
                paramBinding = GMacMacroParameterBinding.Create(valueAccess, scalarBinding);
            }

            //If the value access already exists remove it from the dictionary to preserve
            //order of parameters bindings
            if (_patternDictionary.ContainsKey(valueAccessName))
            {
                _patternDictionary.Remove(valueAccessName);
            }

            _patternDictionary.Add(valueAccessName, paramBinding);

            return(this);
        }
Example #2
0
 /// <summary>
 /// Try to find the scalar macro parameter binding pattern associated with the given primitive parameter
 /// value access component
 /// </summary>
 /// <param name="paramValueAccess"></param>
 /// <param name="pattern"></param>
 /// <returns></returns>
 public bool TryGetBinding(AstDatastoreValueAccess paramValueAccess, out GMacMacroParameterBinding pattern)
 {
     return(_patternDictionary.TryGetValue(paramValueAccess.ValueAccessName, out pattern));
 }