/// <summary>
        /// Gets the autocomplete data for the specified attribute value.
        /// </summary>
        public async Task <CompletionContext> GetAttributeValueCompletionDataAsync(IAsyncCompletionSource source, XmlElementPath path, string name, CancellationToken token)
        {
            await EnsureLoadedAsync();

            var builder = new XmlSchemaCompletionBuilder(source, path.Namespaces);
            var element = FindElement(path);

            if (element != null)
            {
                GetAttributeValueCompletionData(builder, element, name);
            }
            return(new CompletionContext(builder.GetItems()));
        }
        public async Task <CompletionContext> GetAttributeValueCompletionDataAsync(IAsyncCompletionSource source, string tagName, string name, CancellationToken token)
        {
            await EnsureLoadedAsync();

            var list    = new XmlSchemaCompletionBuilder(source);
            var element = FindElement(tagName);

            if (element != null)
            {
                GetAttributeValueCompletionData(list, element, name);
            }
            return(new CompletionContext(list.GetItems()));
        }
        /// <summary>
        /// Gets the child element completion data for the xml element that exists
        /// at the end of the specified path.
        /// </summary>
        public async Task <CompletionContext> GetChildElementCompletionDataAsync(IAsyncCompletionSource source, XmlElementPath path, CancellationToken token)
        {
            await EnsureLoadedAsync();

            var builder = new XmlSchemaCompletionBuilder(source, path.Namespaces);
            var element = FindElement(path);

            if (element != null)
            {
                var last = path.Elements.LastOrDefault();
                GetChildElementCompletionData(builder, element, last != null ? last.Prefix : "");
            }
            return(new CompletionContext(builder.GetItems()));
        }
        /// <summary>
        /// Gets the possible root elements for an xml document using this schema.
        /// </summary>
        public async Task <CompletionContext> GetElementCompletionDataAsync(IAsyncCompletionSource source, string namespacePrefix, CancellationToken token)
        {
            await EnsureLoadedAsync();

            var builder = new XmlSchemaCompletionBuilder(source);

            foreach (XmlSchemaElement element in schema.Elements.Values)
            {
                if (element.Name != null)
                {
                    builder.AddElement(element.Name, namespacePrefix, element.Annotation);
                }
                else
                {
                    // Do not add reference element.
                }
            }
            return(new CompletionContext(builder.GetItems()));
        }