Ejemplo n.º 1
0
        private static void AddTypeToNamespaceNode(PropertyBag node, Type type)
        {
            object value;
            var    name = type.GetRootName();

            if (!node.TryGetValue(name, out value))
            {
                node.SetPropertyNoCheck(name, HostType.Wrap(type));
                return;
            }

            var hostType = value as HostType;

            if (hostType != null)
            {
                var types = type.ToEnumerable().Concat(hostType.Types).ToArray();

                var groups = types.GroupBy(testType => testType.GetGenericParamCount()).ToIList();
                if (groups.Any(group => group.Count() > 1))
                {
                    types = groups.Select(ResolveTypeConflict).ToArray();
                }

                node.SetPropertyNoCheck(name, HostType.Wrap(types));
                return;
            }

            if (value is PropertyBag)
            {
                throw new OperationCanceledException(MiscHelpers.FormatInvariant("Type conflicts with namespace at '{0}'", type.GetLocator()));
            }

            throw new OperationCanceledException(MiscHelpers.FormatInvariant("Type conflicts with '{0}' at '{1}'", value.GetFriendlyName(), type.GetLocator()));
        }
Ejemplo n.º 2
0
        private PropertyBag GetOrCreateNamespaceNode(string locator)
        {
            var segments = locator.Split('.');

            if (segments.Length < 1)
            {
                return(null);
            }

            PropertyBag namespaceNode = this;

            foreach (var segment in segments.Take(segments.Length - 1))
            {
                PropertyBag innerNode;

                if (!namespaceNode.TryGetValue(segment, out var node))
                {
                    innerNode = new PropertyBag(true);
                    namespaceNode.SetPropertyNoCheck(segment, innerNode);
                }
                else
                {
                    innerNode = node as PropertyBag;
                    if (innerNode == null)
                    {
                        throw new OperationCanceledException(MiscHelpers.FormatInvariant("Namespace conflicts with '{0}' at '{1}'", node.GetFriendlyName(), locator));
                    }
                }

                namespaceNode = innerNode;
            }

            return(namespaceNode);
        }
Ejemplo n.º 3
0
        private PropertyBag GetOrCreateEnumTypeInfoNode(ITypeInfo typeInfo)
        {
            var locator = typeInfo.GetManagedName();

            var segments = locator.Split('.');

            if (segments.Length < 1)
            {
                return(null);
            }

            PropertyBag enumTypeInfoNode = this;

            foreach (var segment in segments)
            {
                PropertyBag innerNode;

                object node;
                if (!enumTypeInfoNode.TryGetValue(segment, out node))
                {
                    innerNode = new PropertyBag(true);
                    enumTypeInfoNode.SetPropertyNoCheck(segment, innerNode);
                }
                else
                {
                    innerNode = node as PropertyBag;
                    if (innerNode == null)
                    {
                        throw new OperationCanceledException(MiscHelpers.FormatInvariant("Enumeration conflicts with '{0}' at '{1}'", node.GetFriendlyName(), locator));
                    }
                }

                enumTypeInfoNode = innerNode;
            }

            return(enumTypeInfoNode);
        }