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