private void FillSessionForSiteMap(
            SnapshotPoint triggerPoint
            , ICompletionSession session
            , IList <CompletionSet> completionSets
            , ITextSnapshot snapshot
            , XElement doc
            , ConnectionData connectionData
            , ConnectionIntellisenseDataRepository repositoryEntities
            , SiteMapIntellisenseDataRepository repositorySiteMap
            , WebResourceIntellisenseDataRepository repositoryWebResource
            )
        {
            {
                HashSet <string> usedEntities = GetUsedEntities(doc);

                if (usedEntities.Any())
                {
                    repositoryEntities.GetEntityDataForNamesAsync(usedEntities);
                }
            }

            SnapshotPoint currentPoint = (session.TextView.Caret.Position.BufferPosition) - 1;

            var spans = _classifier.GetClassificationSpans(new SnapshotSpan(snapshot, 0, snapshot.Length));

            var firstSpans = spans.Where(s =>
                                         s.Span.Start <= currentPoint.Position
                                         )
                             .OrderByDescending(s => s.Span.Start.Position)
                             .ToList();

            var firstDelimiter = firstSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Attribute Quotes"));

            var lastSpans = spans.Where(s =>
                                        s.Span.Start > currentPoint.Position
                                        )
                            .OrderBy(s => s.Span.Start.Position)
                            .ToList();

            var lastDelimiter = lastSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Attribute Quotes"));

            SnapshotSpan?extentTemp = null;

            if (firstDelimiter != null && firstDelimiter.Span.GetText() == "\"\"")
            {
                extentTemp = new SnapshotSpan(firstDelimiter.Span.Start.Add(1), firstDelimiter.Span.Start.Add(1));
            }
            else if (firstDelimiter != null && lastDelimiter != null && firstDelimiter.Span.GetText() == "\"" && lastDelimiter.Span.GetText() == "\"")
            {
                extentTemp = new SnapshotSpan(firstDelimiter.Span.End, lastDelimiter.Span.Start);
            }

            if (!extentTemp.HasValue)
            {
                return;
            }

            var extent = extentTemp.Value;

            {
                var extentText = extent.GetText();

                if (extentText == ",\"")
                {
                    extent = new SnapshotSpan(extent.Snapshot, extent.Start, extent.Length - 1);
                }
            }

            var currentXmlNode = GetCurrentXmlNode(doc, extent);

            if (currentXmlNode == null)
            {
                return;
            }

            var containingAttributeSpans = spans
                                           .Where(s => s.Span.Contains(extent.Start) &&
                                                  s.Span.Contains(extent) &&
                                                  s.ClassificationType.IsOfType("XML Attribute Value"))
                                           .OrderByDescending(s => s.Span.Start.Position)
                                           .ToList();

            var containingAttributeValue = containingAttributeSpans.FirstOrDefault();

            if (containingAttributeValue == null)
            {
                containingAttributeValue = spans
                                           .Where(s => s.Span.Contains(extent.Start) &&
                                                  s.Span.Contains(extent) &&
                                                  s.ClassificationType.IsOfType("XML Attribute Quotes") &&
                                                  s.Span.GetText() == "\"\""
                                                  )
                                           .OrderByDescending(s => s.Span.Start.Position)
                                           .FirstOrDefault();
            }

            if (containingAttributeValue == null)
            {
                return;
            }

            ClassificationSpan currentAttr = GetCurrentXmlAttributeName(snapshot, containingAttributeValue, spans);

            if (currentAttr == null)
            {
                return;
            }

            string currentNodeName = currentXmlNode.Name.LocalName;

            string currentAttributeName = currentAttr.Span.GetText();

            ITrackingSpan applicableTo = snapshot.CreateTrackingSpan(extent, SpanTrackingMode.EdgeInclusive);

            try
            {
                if (string.Equals(currentNodeName, "SiteMap", StringComparison.InvariantCultureIgnoreCase))
                {
                    #region Urls

                    if (string.Equals(currentAttributeName, "Url", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().Urls, "Urls");

                        FillWebResourcesText(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesHtml?.Values?.ToList(), "WebResources");
                    }

                    #endregion Urls
                }
                else if (string.Equals(currentNodeName, "Area", StringComparison.InvariantCultureIgnoreCase))
                {
                    #region Urls

                    if (string.Equals(currentAttributeName, "Url", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().Urls, "Urls");

                        FillWebResourcesText(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesHtml?.Values?.ToList(), "WebResources");
                    }

                    #endregion Urls

                    #region Icons

                    else if (string.Equals(currentAttributeName, "Icon", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().Icons, "Icons");

                        FillWebResourcesIcons(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesIcon?.Values?.ToList(), "WebResources");
                    }

                    #endregion Icons

                    #region Resources

                    else if (string.Equals(currentAttributeName, "ResourceId", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().ResourceIds, "Resources");
                    }
                    else if (string.Equals(currentAttributeName, "DescriptionResourceId", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().DescriptionResourceIds, "Resources");
                    }
                    else if (string.Equals(currentAttributeName, "ToolTipResourseId", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().ToolTipResourseIds, "Resources");
                    }

                    #endregion Resources
                }
                else if (string.Equals(currentNodeName, "Group", StringComparison.InvariantCultureIgnoreCase))
                {
                    #region Urls

                    if (string.Equals(currentAttributeName, "Url", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().Urls, "Urls");

                        FillWebResourcesText(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesHtml?.Values?.ToList(), "WebResources");
                    }

                    #endregion Urls

                    #region Icons

                    else if (string.Equals(currentAttributeName, "Icon", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().Icons, "Icons");

                        FillWebResourcesIcons(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesIcon?.Values?.ToList(), "WebResources");
                    }

                    #endregion Icons

                    #region Resources

                    else if (string.Equals(currentAttributeName, "ResourceId", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().ResourceIds, "Resources");
                    }
                    else if (string.Equals(currentAttributeName, "DescriptionResourceId", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().DescriptionResourceIds, "Resources");
                    }
                    else if (string.Equals(currentAttributeName, "ToolTipResourseId", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().ToolTipResourseIds, "Resources");
                    }

                    #endregion Resources
                }
                else if (string.Equals(currentNodeName, "SubArea", StringComparison.InvariantCultureIgnoreCase))
                {
                    #region Urls

                    if (string.Equals(currentAttributeName, "Url", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().Urls, "Urls");

                        FillWebResourcesText(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesHtml?.Values?.ToList(), "WebResources");
                    }

                    #endregion Urls

                    #region Icons

                    else if (string.Equals(currentAttributeName, "Icon", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().Icons, "Icons");

                        FillWebResourcesIcons(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesIcon?.Values?.ToList(), "WebResources");
                    }
                    else if (string.Equals(currentAttributeName, "OutlookShortcutIcon", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().Icons, "Icons");

                        FillWebResourcesIcons(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesIcon?.Values?.ToList(), "WebResources");
                    }

                    #endregion Icons

                    #region Resources

                    else if (string.Equals(currentAttributeName, "ResourceId", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().ResourceIds, "Resources");
                    }
                    else if (string.Equals(currentAttributeName, "DescriptionResourceId", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().DescriptionResourceIds, "Resources");
                    }
                    else if (string.Equals(currentAttributeName, "ToolTipResourseId", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().ToolTipResourseIds, "Resources");
                    }

                    #endregion Resources

                    #region Panes

                    else if (string.Equals(currentAttributeName, "GetStartedPanePath", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().GetStartedPanePaths, "Panes");
                    }
                    else if (string.Equals(currentAttributeName, "GetStartedPanePathOutlook", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().GetStartedPanePathOutlooks, "Panes");
                    }
                    else if (string.Equals(currentAttributeName, "GetStartedPanePathAdmin", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().GetStartedPanePathAdmins, "Panes");
                    }
                    else if (string.Equals(currentAttributeName, "GetStartedPanePathAdminOutlook", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().GetStartedPanePathAdminOutlooks, "Panes");
                    }

                    #endregion Panes

                    else if (string.Equals(currentAttributeName, "Entity", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false);
                    }
                    else if (string.Equals(currentAttributeName, "Sku", StringComparison.InvariantCultureIgnoreCase))
                    {
                        applicableTo = SkipComma(snapshot, extent, applicableTo);

                        FillSku(completionSets, applicableTo);
                    }
                    else if (string.Equals(currentAttributeName, "Client", StringComparison.InvariantCultureIgnoreCase))
                    {
                        applicableTo = SkipComma(snapshot, extent, applicableTo);

                        FillClient(completionSets, applicableTo);
                    }

                    else if (string.Equals(currentAttributeName, "DefaultDashboard", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillDashboards(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData()?.Dashboards?.Values?.ToList(), "Dashboards");
                    }

                    else if (string.Equals(currentAttributeName, "CheckExtensionProperty", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, repositorySiteMap.GetSiteMapIntellisenseData().CheckExtensionProperties, "Properties");
                    }
                }
                else if (string.Equals(currentNodeName, "Privilege", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (string.Equals(currentAttributeName, "Entity", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false);
                    }
                    else if (string.Equals(currentAttributeName, "Privilege", StringComparison.InvariantCultureIgnoreCase))
                    {
                        applicableTo = SkipComma(snapshot, extent, applicableTo);

                        FillPrivileges(completionSets, applicableTo);
                    }
                }
                else if (string.Equals(currentNodeName, "Title", StringComparison.InvariantCultureIgnoreCase) ||
                         string.Equals(currentNodeName, "Description", StringComparison.InvariantCultureIgnoreCase)
                         )
                {
                    if (string.Equals(currentAttributeName, "LCID", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillLCID(completionSets, applicableTo);
                    }
                }
            }
            catch (Exception ex)
            {
                DTEHelper.WriteExceptionToOutput(connectionData, ex);
            }
        }
        private void FillSessionForFetchXml(ICompletionSession session
                                            , IList <CompletionSet> completionSets
                                            , ITextSnapshot snapshot
                                            , XElement doc
                                            , ConnectionData connectionData
                                            , ConnectionIntellisenseDataRepository repository
                                            )
        {
            {
                HashSet <string> usedEntities = GetUsedEntities(doc);

                if (usedEntities.Any())
                {
                    repository.GetEntityDataForNamesAsync(usedEntities);
                }
            }

            SnapshotPoint currentPoint = (session.TextView.Caret.Position.BufferPosition) - 1;

            var spans = _classifier.GetClassificationSpans(new SnapshotSpan(snapshot, 0, snapshot.Length));

            var firstSpans = spans.Where(s =>
                                         s.Span.Start <= currentPoint.Position
                                         )
                             .OrderByDescending(s => s.Span.Start.Position)
                             .ToList();

            var lastSpans = spans.Where(s =>
                                        s.Span.Start > currentPoint.Position
                                        )
                            .OrderBy(s => s.Span.Start.Position)
                            .ToList();

            SnapshotSpan?extentTemp = null;

            if (!extentTemp.HasValue)
            {
                var firstDelimiter = firstSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Attribute Quotes"));

                if (firstDelimiter != null && firstDelimiter.Span.GetText() == "\"\"")
                {
                    extentTemp = new SnapshotSpan(firstDelimiter.Span.Start.Add(1), firstDelimiter.Span.Start.Add(1));
                }
            }

            if (!extentTemp.HasValue)
            {
                var firstDelimiter = firstSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Attribute Quotes"));
                var lastDelimiter  = lastSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Attribute Quotes"));

                if (firstDelimiter != null && lastDelimiter != null && firstDelimiter.Span.GetText() == "\"" && lastDelimiter.Span.GetText() == "\"")
                {
                    extentTemp = new SnapshotSpan(firstDelimiter.Span.End, lastDelimiter.Span.Start);
                }
            }

            if (extentTemp.HasValue)
            {
                var extent = extentTemp.Value;

                {
                    var extentText = extent.GetText();

                    if (extentText == ",\"")
                    {
                        extent = new SnapshotSpan(extent.Snapshot, extent.Start, extent.Length - 1);
                    }
                }

                var currentXmlNode = GetCurrentXmlNode(doc, extent);

                if (currentXmlNode == null)
                {
                    return;
                }

                var containingAttributeSpans = spans
                                               .Where(s => s.Span.Contains(extent.Start) &&
                                                      s.Span.Contains(extent) &&
                                                      s.ClassificationType.IsOfType("XML Attribute Value"))
                                               .OrderByDescending(s => s.Span.Start.Position)
                                               .ToList();

                var containingAttributeValue = containingAttributeSpans.FirstOrDefault();

                if (containingAttributeValue == null)
                {
                    containingAttributeValue = spans
                                               .Where(s => s.Span.Contains(extent.Start) &&
                                                      s.Span.Contains(extent) &&
                                                      s.ClassificationType.IsOfType("XML Attribute Quotes") &&
                                                      s.Span.GetText() == "\"\""
                                                      )
                                               .OrderByDescending(s => s.Span.Start.Position)
                                               .FirstOrDefault();
                }

                if (containingAttributeValue != null)
                {
                    ClassificationSpan currentAttr = GetCurrentXmlAttributeName(snapshot, containingAttributeValue, spans);

                    if (currentAttr == null)
                    {
                        return;
                    }

                    string currentNodeName = currentXmlNode.Name.LocalName;

                    string currentAttributeName = currentAttr.Span.GetText();

                    ITrackingSpan applicableTo = snapshot.CreateTrackingSpan(extent, SpanTrackingMode.EdgeInclusive);

                    try
                    {
                        if (string.Equals(currentNodeName, "entity", StringComparison.InvariantCultureIgnoreCase))
                        {
                            if (string.Equals(currentAttributeName, "name", StringComparison.InvariantCultureIgnoreCase))
                            {
                                FillEntityNamesInList(completionSets, applicableTo, repository, false);
                            }
                        }
                        else if (string.Equals(currentNodeName, "attribute", StringComparison.InvariantCultureIgnoreCase))
                        {
                            if (string.Equals(currentAttributeName, "name", StringComparison.InvariantCultureIgnoreCase))
                            {
                                Dictionary <string, string> aliases = GetEntityAliases(doc);

                                FillEntityAttributesInList(completionSets, applicableTo, repository, currentXmlNode, aliases);
                            }
                        }
                        else if (string.Equals(currentNodeName, "order", StringComparison.InvariantCultureIgnoreCase))
                        {
                            if (string.Equals(currentAttributeName, "attribute", StringComparison.InvariantCultureIgnoreCase))
                            {
                                Dictionary <string, string> aliases = GetEntityAliases(doc);

                                FillEntityAttributesInList(completionSets, applicableTo, repository, currentXmlNode, aliases);
                            }
                        }
                        else if (string.Equals(currentNodeName, "condition", StringComparison.InvariantCultureIgnoreCase))
                        {
                            Dictionary <string, string> aliases = GetEntityAliases(doc);

                            if (string.Equals(currentAttributeName, "attribute", StringComparison.InvariantCultureIgnoreCase))
                            {
                                FillEntityAttributesInList(completionSets, applicableTo, repository, currentXmlNode, aliases);
                            }
                            else if (string.Equals(currentAttributeName, "value", StringComparison.InvariantCultureIgnoreCase))
                            {
                                FillEntityAttributeValuesInList(completionSets, applicableTo, repository, currentXmlNode, aliases);
                            }
                            else if (string.Equals(currentAttributeName, "entityname", StringComparison.InvariantCultureIgnoreCase))
                            {
                                FillAliases(completionSets, applicableTo, aliases);
                            }
                        }
                        else if (string.Equals(currentNodeName, "link-entity", StringComparison.InvariantCultureIgnoreCase))
                        {
                            if (string.Equals(currentAttributeName, "name", StringComparison.InvariantCultureIgnoreCase))
                            {
                                FillLinkedEntityNames(completionSets, applicableTo, repository, currentXmlNode);

                                FillEntityNamesInList(completionSets, applicableTo, repository, false);
                            }
                            else if (string.Equals(currentAttributeName, "from", StringComparison.InvariantCultureIgnoreCase))
                            {
                                FillLinkedEntityFromField(completionSets, applicableTo, repository, currentXmlNode);
                            }
                            else if (string.Equals(currentAttributeName, "to", StringComparison.InvariantCultureIgnoreCase))
                            {
                                FillLinkedEntityToField(completionSets, applicableTo, repository, currentXmlNode);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        DTEHelper.WriteExceptionToOutput(connectionData, ex);
                    }
                }
            }
            else
            {
                extentTemp = null;

                if (!extentTemp.HasValue)
                {
                    var firstDelimiter = firstSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Delimiter") && s.Span.GetText().EndsWith("></"));

                    if (firstDelimiter != null && firstDelimiter.Span.GetText() == "></")
                    {
                        extentTemp = new SnapshotSpan(firstDelimiter.Span.Start.Add(1), firstDelimiter.Span.Start.Add(1));
                    }
                }

                if (!extentTemp.HasValue)
                {
                    var firstDelimiter = firstSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Delimiter") && s.Span.GetText().Trim().EndsWith(">"));
                    var lastDelimiter  = lastSpans.FirstOrDefault(s => s.ClassificationType.IsOfType("XML Delimiter") && s.Span.GetText().Trim().StartsWith("</"));

                    if (firstDelimiter != null && lastDelimiter != null)
                    {
                        var temp = new SnapshotSpan(firstDelimiter.Span.End, lastDelimiter.Span.Start);

                        if (string.IsNullOrWhiteSpace(temp.GetText()))
                        {
                            extentTemp = new SnapshotSpan(firstDelimiter.Span.End, 0);
                        }
                        else
                        {
                            int spacesStart = temp.GetText().TakeWhile(ch => char.IsWhiteSpace(ch)).Count();
                            int spacesEnd   = temp.GetText().Reverse().TakeWhile(ch => char.IsWhiteSpace(ch)).Count();

                            extentTemp = new SnapshotSpan(firstDelimiter.Span.End.Add(spacesStart), lastDelimiter.Span.Start.Add(-spacesEnd));
                        }
                    }
                }

                if (!extentTemp.HasValue)
                {
                    return;
                }

                var extent = extentTemp.Value;

                var currentXmlNode = GetCurrentXmlNode(doc, extent);

                if (currentXmlNode == null)
                {
                    return;
                }

                if (!string.Equals(currentXmlNode.Name.LocalName, "value", StringComparison.InvariantCultureIgnoreCase))
                {
                    return;
                }

                var nodeCondition = currentXmlNode.Parent;

                if (nodeCondition == null || !string.Equals(nodeCondition.Name.LocalName, "condition", StringComparison.InvariantCultureIgnoreCase))
                {
                    return;
                }

                ITrackingSpan applicableTo = snapshot.CreateTrackingSpan(extent.Span, SpanTrackingMode.EdgeInclusive);

                Dictionary <string, string> aliases = GetEntityAliases(doc);

                FillEntityAttributeValuesInList(completionSets, applicableTo, repository, nodeCondition, aliases);
            }
        }