/// <summary>
        /// The name from property.
        /// </summary>
        /// <param name="root">
        /// The root.
        /// </param>
        /// <param name="rootObjectName">
        /// The root object name.
        /// </param>
        public static void NameFromProperty(TypeDescription root, string rootObjectName)
        {
            if (!string.IsNullOrWhiteSpace(rootObjectName))
            {
                root.AssignedName = SafeIdentifier(rootObjectName);
            }

            var allTreeNodes = root.AllTypeDescriptions().ToList();

            var allChids =
                allTreeNodes.Where(p => p.Parent != null)
                .Select(
                    p =>
                    new
            {
                SafeParentName = SafeIdentifier(p.ParentName, true),
                ParentIsArray  = p.Parent != null && p.Parent.IsArray,
                Type           = p,
            })
                .GroupBy(d => d.SafeParentName)
                .ToList();

            foreach (var namedCollection in allChids)
            {
                var items = namedCollection.ToList();
                if (items.Count == 1)
                {
                    namedCollection.Single().Type.AssignedName = namedCollection.Key;
                }
                else
                {
                    var index = 0;
                    foreach (var item in items)
                    {
                        item.Type.AssignedName = $"{namedCollection.Key}{index++ :000}";
                    }
                }
            }
        }