/// <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); }
/// <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)); }