/// <summary> /// Debug helper to dump the entire extension graph /// </summary> public void DebugDumpGraph(TextWriter output) { var providers = this._root; IBindingRuleProvider root = (IBindingRuleProvider)providers; DumpRule(root, output); }
public BindingRule[] GetRules() { var providers = this._root; IBindingRuleProvider root = (IBindingRuleProvider)providers; return root.GetRules().ToArray(); }
private void AddTypesFromGraph(IBindingRuleProvider root) { foreach (var rule in root.GetRules()) { var type = rule.UserType as OpenType.ExactMatch; if (type != null) { AddAssembly(type.ExactType); } } }
public IEnumerable <BindingRule> GetRules() { IBindingRuleProvider inner = _inner as IBindingRuleProvider; if (inner != null) { foreach (var rule in inner.GetRules()) { rule.Filter = FilterNode.And(_description, rule.Filter); yield return(rule); } } }
// Get a better implementation public Type GetDefaultType( Attribute attribute, FileAccess access, // direction In, Out, In/Out Type requestedType) // combination of Cardinality and DataType. { if (attribute == null) { throw new ArgumentNullException(nameof(attribute)); } if (requestedType == null) { requestedType = typeof(object); } var providers = this._root; IBindingRuleProvider root = (IBindingRuleProvider)providers; var type = root.GetDefaultType(attribute, access, requestedType); if (type == null) { if (access == FileAccess.Read) { // For input bindings, if we have a specific requested type, then return and try to bind against that. // ITriggerBindingProvider doesn't provide rules. if (requestedType != typeof(object)) { return requestedType; } else { // common default. If binder doesn't support this, it will fail later in the pipeline. return typeof(String); } } // IBindingProvider does not provide rules. Attempt to use IAsyncCollector<string>. if (access == FileAccess.Write) { return typeof(IAsyncCollector<string>); } } if (type == null) { throw new InvalidOperationException($"Can't bind {attribute.GetType().Name} to a script-compatible type for {access} access" + ((requestedType != null) ? $" to { requestedType.Name }." : ".")); } return type; }
public Type GetDefaultType(Attribute attribute, FileAccess access, Type requestedType) { TAttribute attr = attribute as TAttribute; if (attr == null) { return(null); } bool ok = _predicate(attr, requestedType); if (!ok) { return(null); } // Must apply filter IBindingRuleProvider inner = _inner as IBindingRuleProvider; if (inner != null) { return(inner.GetDefaultType(attribute, access, requestedType)); } return(null); }
internal static void DumpRule(IBindingRuleProvider root, TextWriter output) { foreach (var rule in root.GetRules()) { var attr = rule.SourceAttribute; output.Write($"[{attr.Name}] -->"); if (rule.Filter != null) { output.Write($"[filter: {rule.Filter}]-->"); } if (rule.Converters != null) { foreach (var converterType in rule.Converters) { output.Write($"{OpenType.ExactMatch.TypeToString(converterType)}-->"); } } output.Write(rule.UserType.GetDisplayName()); output.WriteLine(); } }