Exemple #1
0
        /// <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);
        }
Exemple #2
0
        public BindingRule[] GetRules()
        {
            var providers = this._root;

            IBindingRuleProvider root = (IBindingRuleProvider)providers;
            return root.GetRules().ToArray();
        }
Exemple #3
0
 private void AddTypesFromGraph(IBindingRuleProvider root)
 {
     foreach (var rule in root.GetRules())
     {
         var type = rule.UserType as OpenType.ExactMatch;
         if (type != null)
         {
             AddAssembly(type.ExactType);
         }
     }
 }
Exemple #4
0
        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);
                }
            }
        }
Exemple #5
0
        // 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);
        }
Exemple #7
0
        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();
            }
        }