Пример #1
0
        private void FillSessionForRibbonDiffXmlCompletionSet(
            IList <CompletionSet> completionSets
            , XElement doc
            , ConnectionData connectionData
            , ConnectionIntellisenseDataRepository repositoryEntities
            , WebResourceIntellisenseDataRepository repositoryWebResource
            , RibbonIntellisenseDataRepository repositoryRibbon
            , XElement currentXmlNode
            , string currentNodeName
            , string currentAttributeName
            , ITrackingSpan applicableTo
            )
        {
            try
            {
                RibbonIntellisenseData ribbonIntellisenseData = null;

                var attrEntityName = doc.Attribute(IntellisenseContext.IntellisenseContextAttributeEntityName);

                if (attrEntityName != null)
                {
                    if (!string.IsNullOrEmpty(attrEntityName.Value))
                    {
                        var connectionIntellisense = repositoryEntities.GetEntitiesIntellisenseData();

                        if (connectionIntellisense != null &&
                            connectionIntellisense.Entities != null &&
                            connectionIntellisense.Entities.ContainsKey(attrEntityName.Value)
                            )
                        {
                            ribbonIntellisenseData = repositoryRibbon.GetRibbonIntellisenseData(attrEntityName.Value);
                        }
                    }
                    else
                    {
                        ribbonIntellisenseData = repositoryRibbon.GetRibbonIntellisenseData(string.Empty);
                    }
                }

                if (ControlsWithImagesXmlElements.Contains(currentNodeName) &&
                    ImagesXmlAttributes.Contains(currentAttributeName)
                    )
                {
                    FillWebResourcesIcons(completionSets, applicableTo, repositoryWebResource.GetWebResourcesIcon()?.Values?.ToList(), "WebResources");

                    if (ribbonIntellisenseData != null)
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Images, "Images");
                    }
                }

                if (string.Equals(currentAttributeName, "ModernImage", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (ribbonIntellisenseData != null)
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.ModernImages, "ModernImages");
                    }
                }

                if (string.Equals(currentNodeName, "CustomAction", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Location", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    if (ribbonIntellisenseData != null)
                    {
                        var sorted = new SortedSet <string>(ribbonIntellisenseData.Locations.Keys);

                        FillRibbonLocations(completionSets, applicableTo, sorted, "Locations");
                    }
                }

                if (string.Equals(currentAttributeName, "Sequence", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (ribbonIntellisenseData != null)
                    {
                        FillRibbonSequences(completionSets, applicableTo, currentXmlNode, ribbonIntellisenseData.Locations, "Locations");
                    }
                }

                if (string.Equals(currentAttributeName, "TemplateAlias", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (ribbonIntellisenseData != null)
                    {
                        FillRibbonTemplateAliases(completionSets, applicableTo, currentXmlNode, ribbonIntellisenseData.Locations, "TemplateAliases");
                    }
                }

                if (LabelXmlAttributes.Contains(currentAttributeName))
                {
                    bool isTitleElement = string.Equals(currentNodeName, "Title", StringComparison.InvariantCultureIgnoreCase) &&
                                          currentXmlNode.Parent != null &&
                                          string.Equals(currentXmlNode.Parent.Name.LocalName, "Titles", StringComparison.InvariantCultureIgnoreCase) &&
                                          currentXmlNode.Parent.Parent != null &&
                                          string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "LocLabel", StringComparison.InvariantCultureIgnoreCase);

                    if (!isTitleElement)
                    {
                        var localValues = FillLocLables(completionSets, applicableTo, doc, "LocLabels");

                        if (ribbonIntellisenseData != null)
                        {
                            var sorted = new SortedSet <string>(ribbonIntellisenseData.LabelTexts.Where(s => !localValues.Contains(s)));

                            FillIntellisenseBySet(completionSets, applicableTo, sorted, "Labels in Ribbon");
                        }
                    }
                }

                if (CommandXmlAttributes.Contains(currentAttributeName))
                {
                    var localValues = FillCommandsLocal(completionSets, applicableTo, doc, "Commands");

                    if (ribbonIntellisenseData != null)
                    {
                        var sorted = new SortedSet <string>(ribbonIntellisenseData.CommandDefinitions.Keys.Where(s => !localValues.Contains(s)));

                        FillIntellisenseBySet(completionSets, applicableTo, sorted, "Commands in Ribbon");
                    }
                }

                if (string.Equals(currentNodeName, "EnableRule", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Id", StringComparison.InvariantCultureIgnoreCase) &&
                    currentXmlNode.Parent != null &&
                    string.Equals(currentXmlNode.Parent.Name.LocalName, "EnableRules", StringComparison.InvariantCultureIgnoreCase) &&
                    currentXmlNode.Parent.Parent != null &&
                    string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "CommandDefinition", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    var localValues = FillEnableRulesLocal(completionSets, applicableTo, doc, "EnableRules");

                    if (ribbonIntellisenseData != null)
                    {
                        var sorted = new SortedSet <string>(ribbonIntellisenseData.EnableRules.Keys.Where(s => !localValues.Contains(s)));

                        FillIntellisenseBySet(completionSets, applicableTo, sorted, "EnableRules in Ribbon");
                    }
                }

                if (string.Equals(currentNodeName, "DisplayRule", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Id", StringComparison.InvariantCultureIgnoreCase) &&
                    currentXmlNode.Parent != null &&
                    string.Equals(currentXmlNode.Parent.Name.LocalName, "DisplayRules", StringComparison.InvariantCultureIgnoreCase) &&
                    currentXmlNode.Parent.Parent != null &&
                    string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "CommandDefinition", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    var localValues = FillDisplayRulesLocal(completionSets, applicableTo, doc, "DisplayRules");

                    if (ribbonIntellisenseData != null)
                    {
                        var sorted = new SortedSet <string>(ribbonIntellisenseData.DisplayRules.Keys.Where(s => !localValues.Contains(s)).Select(s => s));

                        FillIntellisenseBySet(completionSets, applicableTo, sorted, "DisplayRules in Ribbon");
                    }
                }

                if (string.Equals(currentAttributeName, "EntityName", StringComparison.InvariantCultureIgnoreCase)
                    &&
                    (
                        string.Equals(currentNodeName, "EntityRule", StringComparison.InvariantCultureIgnoreCase) ||
                        string.Equals(currentNodeName, "EntityPropertyRule", StringComparison.InvariantCultureIgnoreCase) ||
                        string.Equals(currentNodeName, "FormEntityContextRule", StringComparison.InvariantCultureIgnoreCase) ||
                        string.Equals(currentNodeName, "EntityPrivilegeRule", StringComparison.InvariantCultureIgnoreCase)
                    )
                    )
                {
                    FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false, false);
                }

                if (string.Equals(currentAttributeName, IntellisenseContext.IntellisenseContextNamespacePrefix + ":" + IntellisenseContext.NameIntellisenseContextAttributeEntityName, StringComparison.InvariantCultureIgnoreCase)
                    &&
                    (
                        string.Equals(currentNodeName, Commands.AbstractDynamicCommandXsdSchemas.RibbonDiffXmlRoot, StringComparison.InvariantCultureIgnoreCase) ||
                        string.Equals(currentNodeName, Commands.AbstractDynamicCommandXsdSchemas.RibbonXmlRoot, StringComparison.InvariantCultureIgnoreCase)
                    )
                    )
                {
                    FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false, false);
                }

                if (string.Equals(currentNodeName, "ValueRule", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Field", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    if (attrEntityName != null &&
                        !string.IsNullOrEmpty(attrEntityName.Value)
                        )
                    {
                        var entityIntellisenseData = repositoryEntities.GetEntitiesIntellisenseData();

                        if (entityIntellisenseData != null &&
                            entityIntellisenseData.Entities.ContainsKey(attrEntityName.Value)
                            )
                        {
                            FillEntityIntellisenseDataAttributes(completionSets, applicableTo, entityIntellisenseData.Entities[attrEntityName.Value]);
                        }
                    }
                }

                if (string.Equals(currentNodeName, "ValueRule", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Value", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    if (attrEntityName != null &&
                        !string.IsNullOrEmpty(attrEntityName.Value) &&
                        currentXmlNode.Attribute("Field") != null &&
                        !string.IsNullOrEmpty(currentXmlNode.Attribute("Field").Value)
                        )
                    {
                        FillEntityAttributeValues(completionSets, applicableTo, repositoryEntities, attrEntityName.Value, currentXmlNode.Attribute("Field").Value);
                    }
                }

                if (string.Equals(currentNodeName, "CustomRule", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (string.Equals(currentAttributeName, "Library", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillWebResourcesTextWithWebResourcePrefix(completionSets, applicableTo, repositoryWebResource.GetConnectionWebResourceIntellisenseData()?.GetJavaScriptWebResources()?.ToList(), "WebResources");

                        if (ribbonIntellisenseData != null)
                        {
                            FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Libraries, "Library from Ribbon");
                        }
                    }
                    else if (string.Equals(currentAttributeName, "FunctionName", StringComparison.InvariantCultureIgnoreCase))
                    {
                        if (ribbonIntellisenseData != null)
                        {
                            FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.FunctionsNames, "FunctionName from Ribbon");
                        }
                    }
                }
                else if (string.Equals(currentNodeName, "JavaScriptFunction", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (string.Equals(currentAttributeName, "Library", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillWebResourcesTextWithWebResourcePrefix(completionSets, applicableTo, repositoryWebResource.GetConnectionWebResourceIntellisenseData()?.GetJavaScriptWebResources()?.ToList(), "WebResources");

                        if (ribbonIntellisenseData != null)
                        {
                            FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Libraries, "Library from Ribbon");
                        }
                    }
                    else if (string.Equals(currentAttributeName, "FunctionName", StringComparison.InvariantCultureIgnoreCase))
                    {
                        if (ribbonIntellisenseData != null)
                        {
                            FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.FunctionsNames, "FunctionName from Ribbon");
                        }
                    }
                }
                else if (string.Equals(currentNodeName, "Title", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (string.Equals(currentAttributeName, "languagecode", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillLCID(completionSets, applicableTo);
                    }
                }
            }
            catch (Exception ex)
            {
                DTEHelper.WriteExceptionToOutput(connectionData, ex);
            }
        }
        public void AugmentCompletionSession(ICompletionSession session, IList <CompletionSet> completionSets)
        {
            if (_isDisposed)
            {
                return;
            }

            var connectionConfig = ConnectionConfiguration.Get();

            if (connectionConfig?.CurrentConnectionData == null)
            {
                return;
            }

            ITextSnapshot snapshot     = _buffer.CurrentSnapshot;
            var           triggerPoint = session.GetTriggerPoint(snapshot);

            if (triggerPoint == null)
            {
                return;
            }

            XElement doc = ReadXmlDocument(snapshot.GetText());

            if (doc == null)
            {
                return;
            }

            if (string.Equals(doc.Name.ToString(), Commands.AbstractDynamicCommandXsdSchemas.RootFetch, StringComparison.InvariantCultureIgnoreCase))
            {
                var repository = ConnectionIntellisenseDataRepository.GetRepository(connectionConfig.CurrentConnectionData);

                FillSessionForFetchXml(session, completionSets, snapshot, doc, connectionConfig.CurrentConnectionData, repository);
            }
            else if (string.Equals(doc.Name.ToString(), Commands.AbstractDynamicCommandXsdSchemas.RootGrid, StringComparison.InvariantCultureIgnoreCase))
            {
                var repository = ConnectionIntellisenseDataRepository.GetRepository(connectionConfig.CurrentConnectionData);

                FillSessionForGridXml(session, completionSets, snapshot, doc, connectionConfig.CurrentConnectionData, repository);
            }
            else if (string.Equals(doc.Name.ToString(), Commands.AbstractDynamicCommandXsdSchemas.RootSavedQuery, StringComparison.InvariantCultureIgnoreCase))
            {
                var repository = ConnectionIntellisenseDataRepository.GetRepository(connectionConfig.CurrentConnectionData);

                FillSessionForFetchXml(session, completionSets, snapshot, doc, connectionConfig.CurrentConnectionData, repository);

                FillSessionForGridXml(session, completionSets, snapshot, doc, connectionConfig.CurrentConnectionData, repository);
            }
            else if (string.Equals(doc.Name.ToString(), Commands.AbstractDynamicCommandXsdSchemas.RootSiteMap, StringComparison.InvariantCultureIgnoreCase))
            {
                var repositoryEntities    = ConnectionIntellisenseDataRepository.GetRepository(connectionConfig.CurrentConnectionData);
                var repositorySiteMap     = SiteMapIntellisenseDataRepository.GetRepository(connectionConfig.CurrentConnectionData);
                var repositoryWebResource = WebResourceIntellisenseDataRepository.GetRepository(connectionConfig.CurrentConnectionData);

                FillSessionForSiteMap(triggerPoint.Value, session, completionSets, snapshot, doc, connectionConfig.CurrentConnectionData, repositoryEntities, repositorySiteMap, repositoryWebResource);
            }
            else if (string.Equals(doc.Name.ToString(), Commands.AbstractDynamicCommandXsdSchemas.RootRibbonDiffXml, StringComparison.InvariantCultureIgnoreCase) ||
                     string.Equals(doc.Name.ToString(), Commands.AbstractDynamicCommandXsdSchemas.RootRibbonDefinitions, StringComparison.InvariantCultureIgnoreCase)
                     )
            {
                var repositoryEntities    = ConnectionIntellisenseDataRepository.GetRepository(connectionConfig.CurrentConnectionData);
                var repositoryWebResource = WebResourceIntellisenseDataRepository.GetRepository(connectionConfig.CurrentConnectionData);

                var repositoryRibbon = RibbonIntellisenseDataRepository.GetRepository(connectionConfig.CurrentConnectionData);

                FillSessionForRibbonDiffXml(triggerPoint.Value, session, completionSets, snapshot, doc, connectionConfig.CurrentConnectionData, repositoryEntities, repositoryWebResource, repositoryRibbon);
            }
        }
        private void FillSessionForRibbonDiffXml(
            SnapshotPoint triggerPoint
            , ICompletionSession session
            , IList <CompletionSet> completionSets
            , ITextSnapshot snapshot
            , XElement doc
            , ConnectionData connectionData
            , ConnectionIntellisenseDataRepository repositoryEntities
            , WebResourceIntellisenseDataRepository repositoryWebResource
            , RibbonIntellisenseDataRepository repositoryRibbon
            )
        {
            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
            {
                RibbonIntellisenseData ribbonIntellisenseData = null;

                var attrEntityName = doc.Attribute(IntellisenseContext.IntellisenseContextAttributeEntityName);

                if (attrEntityName != null)
                {
                    if (!string.IsNullOrEmpty(attrEntityName.Value))
                    {
                        var connectionIntellisense = repositoryEntities.GetEntitiesIntellisenseData();

                        if (connectionIntellisense != null &&
                            connectionIntellisense.Entities != null &&
                            connectionIntellisense.Entities.ContainsKey(attrEntityName.Value)
                            )
                        {
                            ribbonIntellisenseData = repositoryRibbon.GetRibbonIntellisenseData(attrEntityName.Value);
                        }
                    }
                    else
                    {
                        ribbonIntellisenseData = repositoryRibbon.GetRibbonIntellisenseData(string.Empty);
                    }
                }

                if (_controlsWithImagesXmlElements.Contains(currentNodeName) &&
                    ImagesXmlAttributes.Contains(currentAttributeName)
                    )
                {
                    FillWebResourcesIcons(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesIcon?.Values?.ToList(), "WebResources");

                    if (ribbonIntellisenseData != null)
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Images, "Images");
                    }
                }

                if (string.Equals(currentAttributeName, "ModernImage", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (ribbonIntellisenseData != null)
                    {
                        FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.ModernImages, "ModernImages");
                    }
                }

                if (string.Equals(currentNodeName, "CustomAction", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Location", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    if (ribbonIntellisenseData != null)
                    {
                        var sorted = new SortedSet <string>(ribbonIntellisenseData.Locations.Keys);

                        FillRibbonLocations(completionSets, applicableTo, sorted, "Locations");
                    }
                }

                if (string.Equals(currentAttributeName, "Sequence", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (ribbonIntellisenseData != null)
                    {
                        FillRibbonSequences(completionSets, applicableTo, currentXmlNode, ribbonIntellisenseData.Locations, "Locations");
                    }
                }

                if (LabelXmlAttributes.Contains(currentAttributeName))
                {
                    bool isTitleElement = string.Equals(currentNodeName, "Title", StringComparison.InvariantCultureIgnoreCase) &&
                                          currentXmlNode.Parent != null &&
                                          string.Equals(currentXmlNode.Parent.Name.LocalName, "Titles", StringComparison.InvariantCultureIgnoreCase) &&
                                          currentXmlNode.Parent.Parent != null &&
                                          string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "LocLabel", StringComparison.InvariantCultureIgnoreCase);

                    if (!isTitleElement)
                    {
                        var localValues = FillLocLables(completionSets, applicableTo, doc, "LocLabels");

                        if (ribbonIntellisenseData != null)
                        {
                            var sorted = new SortedSet <string>(ribbonIntellisenseData.LabelTexts.Where(s => !localValues.Contains(s)));

                            FillIntellisenseBySet(completionSets, applicableTo, sorted, "Labels in Ribbon");
                        }
                    }
                }

                if (CommandXmlAttributes.Contains(currentAttributeName))
                {
                    var localValues = FillCommandsLocal(completionSets, applicableTo, doc, "Commands");

                    if (ribbonIntellisenseData != null)
                    {
                        var sorted = new SortedSet <string>(ribbonIntellisenseData.CommandDefinitions.Keys.Where(s => !localValues.Contains(s)));

                        FillIntellisenseBySet(completionSets, applicableTo, sorted, "Commands in Ribbon");
                    }
                }

                if (string.Equals(currentNodeName, "EnableRule", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Id", StringComparison.InvariantCultureIgnoreCase) &&
                    currentXmlNode.Parent != null &&
                    string.Equals(currentXmlNode.Parent.Name.LocalName, "EnableRules", StringComparison.InvariantCultureIgnoreCase) &&
                    currentXmlNode.Parent.Parent != null &&
                    string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "CommandDefinition", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    var localValues = FillEnableRulesLocal(completionSets, applicableTo, doc, "EnableRules");

                    if (ribbonIntellisenseData != null)
                    {
                        var sorted = new SortedSet <string>(ribbonIntellisenseData.EnableRules.Keys.Where(s => !localValues.Contains(s)));

                        FillIntellisenseBySet(completionSets, applicableTo, sorted, "EnableRules in Ribbon");
                    }
                }

                if (string.Equals(currentNodeName, "DisplayRule", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Id", StringComparison.InvariantCultureIgnoreCase) &&
                    currentXmlNode.Parent != null &&
                    string.Equals(currentXmlNode.Parent.Name.LocalName, "DisplayRules", StringComparison.InvariantCultureIgnoreCase) &&
                    currentXmlNode.Parent.Parent != null &&
                    string.Equals(currentXmlNode.Parent.Parent.Name.LocalName, "CommandDefinition", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    var localValues = FillDisplayRulesLocal(completionSets, applicableTo, doc, "DisplayRules");

                    if (ribbonIntellisenseData != null)
                    {
                        var sorted = new SortedSet <string>(ribbonIntellisenseData.DisplayRules.Keys.Where(s => !localValues.Contains(s)).Select(s => s));

                        FillIntellisenseBySet(completionSets, applicableTo, sorted, "DisplayRules in Ribbon");
                    }
                }

                if (string.Equals(currentAttributeName, "EntityName", StringComparison.InvariantCultureIgnoreCase)
                    &&
                    (
                        string.Equals(currentNodeName, "EntityRule", StringComparison.InvariantCultureIgnoreCase) ||
                        string.Equals(currentNodeName, "EntityPropertyRule", StringComparison.InvariantCultureIgnoreCase) ||
                        string.Equals(currentNodeName, "FormEntityContextRule", StringComparison.InvariantCultureIgnoreCase) ||
                        string.Equals(currentNodeName, "EntityPrivilegeRule", StringComparison.InvariantCultureIgnoreCase)
                    )
                    )
                {
                    FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false, false);
                }

                if (string.Equals(currentAttributeName, IntellisenseContext.NameIntellisenseContextName + ":" + IntellisenseContext.NameIntellisenseContextAttributeEntityName, StringComparison.InvariantCultureIgnoreCase)
                    &&
                    (
                        string.Equals(currentNodeName, Commands.AbstractDynamicCommandXsdSchemas.RootRibbonDiffXml, StringComparison.InvariantCultureIgnoreCase) ||
                        string.Equals(currentNodeName, Commands.AbstractDynamicCommandXsdSchemas.RootRibbonDefinitions, StringComparison.InvariantCultureIgnoreCase)
                    )
                    )
                {
                    FillEntityNamesInList(completionSets, applicableTo, repositoryEntities, false, false);
                }

                if (string.Equals(currentNodeName, "ValueRule", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Field", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    if (attrEntityName != null &&
                        !string.IsNullOrEmpty(attrEntityName.Value)
                        )
                    {
                        var entityIntellisenseData = repositoryEntities.GetEntitiesIntellisenseData();

                        if (entityIntellisenseData != null &&
                            entityIntellisenseData.Entities.ContainsKey(attrEntityName.Value)
                            )
                        {
                            FillEntityIntellisenseDataAttributes(completionSets, applicableTo, entityIntellisenseData.Entities[attrEntityName.Value]);
                        }
                    }
                }

                if (string.Equals(currentNodeName, "ValueRule", StringComparison.InvariantCultureIgnoreCase) &&
                    string.Equals(currentAttributeName, "Value", StringComparison.InvariantCultureIgnoreCase)
                    )
                {
                    if (attrEntityName != null &&
                        !string.IsNullOrEmpty(attrEntityName.Value) &&
                        currentXmlNode.Attribute("Field") != null &&
                        !string.IsNullOrEmpty(currentXmlNode.Attribute("Field").Value)
                        )
                    {
                        FillEntityAttributeValues(completionSets, applicableTo, repositoryEntities, attrEntityName.Value, currentXmlNode.Attribute("Field").Value);
                    }
                }

                if (string.Equals(currentNodeName, "CustomRule", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (string.Equals(currentAttributeName, "Library", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillWebResourcesText(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesJavaScript?.Values?.ToList(), "WebResources");

                        if (ribbonIntellisenseData != null)
                        {
                            FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Libraries, "Library from Ribbon");
                        }
                    }
                    else if (string.Equals(currentAttributeName, "FunctionName", StringComparison.InvariantCultureIgnoreCase))
                    {
                        if (ribbonIntellisenseData != null)
                        {
                            FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.FunctionsNames, "FunctionName from Ribbon");
                        }
                    }
                }
                else if (string.Equals(currentNodeName, "JavaScriptFunction", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (string.Equals(currentAttributeName, "Library", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillWebResourcesText(completionSets, applicableTo, repositoryWebResource.GetWebResourceIntellisenseData()?.WebResourcesJavaScript?.Values?.ToList(), "WebResources");

                        if (ribbonIntellisenseData != null)
                        {
                            FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.Libraries, "Library from Ribbon");
                        }
                    }
                    else if (string.Equals(currentAttributeName, "FunctionName", StringComparison.InvariantCultureIgnoreCase))
                    {
                        if (ribbonIntellisenseData != null)
                        {
                            FillIntellisenseBySet(completionSets, applicableTo, ribbonIntellisenseData.FunctionsNames, "FunctionName from Ribbon");
                        }
                    }
                }
                else if (string.Equals(currentNodeName, "Title", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (string.Equals(currentAttributeName, "languagecode", StringComparison.InvariantCultureIgnoreCase))
                    {
                        FillLCID(completionSets, applicableTo);
                    }
                }
            }
            catch (Exception ex)
            {
                DTEHelper.WriteExceptionToOutput(connectionData, ex);
            }
        }
        private void FillSessionsXmlAttribute(IList <CompletionSet> completionSets, ITrackingSpan applicableTo, ConnectionData connectionData, ITextSnapshot snapshot, SnapshotSpan extent, XElement doc, XElement currentXmlNode, string currentNodeName, string currentAttributeName)
        {
            if (string.Equals(doc.Name.LocalName, Commands.AbstractDynamicCommandXsdSchemas.FetchRoot, StringComparison.InvariantCultureIgnoreCase))
            {
                var repository = ConnectionIntellisenseDataRepository.GetRepository(connectionData);

                HashSet <string> usedEntities = GetUsedEntities(doc);

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

                FillSessionForFetchXmlCompletionSet(completionSets, doc, connectionData, repository, currentXmlNode, currentNodeName, currentAttributeName, applicableTo);
            }
            else if (string.Equals(doc.Name.LocalName, Commands.AbstractDynamicCommandXsdSchemas.GridRoot, StringComparison.InvariantCultureIgnoreCase))
            {
                var repositoryEntities    = ConnectionIntellisenseDataRepository.GetRepository(connectionData);
                var repositoryWebResource = WebResourceIntellisenseDataRepository.GetRepository(connectionData);

                HashSet <int> usedEntityCodes = GetUsedEntityObjectTypeCodes(doc);

                if (usedEntityCodes.Any())
                {
                    repositoryEntities.GetEntityDataForObjectTypeCodesAsync(usedEntityCodes);
                }

                FillSessionForGridXmlCompletionSet(completionSets, connectionData, repositoryEntities, repositoryWebResource, currentXmlNode, currentNodeName, currentAttributeName, applicableTo);
            }
            else if (string.Equals(doc.Name.LocalName, Commands.AbstractDynamicCommandXsdSchemas.SavedQueryRoot, StringComparison.InvariantCultureIgnoreCase))
            {
                var repositoryEntities    = ConnectionIntellisenseDataRepository.GetRepository(connectionData);
                var repositoryWebResource = WebResourceIntellisenseDataRepository.GetRepository(connectionData);

                HashSet <string> usedEntities = GetUsedEntities(doc);

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

                HashSet <int> usedEntityCodes = GetUsedEntityObjectTypeCodes(doc);

                if (usedEntityCodes.Any())
                {
                    repositoryEntities.GetEntityDataForObjectTypeCodesAsync(usedEntityCodes);
                }

                FillSessionForFetchXmlCompletionSet(completionSets, doc, connectionData, repositoryEntities, currentXmlNode, currentNodeName, currentAttributeName, applicableTo);

                FillSessionForGridXmlCompletionSet(completionSets, connectionData, repositoryEntities, repositoryWebResource, currentXmlNode, currentNodeName, currentAttributeName, applicableTo);
            }
            else if (string.Equals(doc.Name.LocalName, Commands.AbstractDynamicCommandXsdSchemas.SiteMapXmlRoot, StringComparison.InvariantCultureIgnoreCase))
            {
                var repositoryEntities    = ConnectionIntellisenseDataRepository.GetRepository(connectionData);
                var repositorySiteMap     = SiteMapIntellisenseDataRepository.GetRepository(connectionData);
                var repositoryWebResource = WebResourceIntellisenseDataRepository.GetRepository(connectionData);

                HashSet <string> usedEntities = GetUsedEntities(doc);

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

                FillSessionForSiteMapCompletionSet(completionSets, snapshot, connectionData, repositoryEntities, repositorySiteMap, repositoryWebResource, extent, currentNodeName, currentAttributeName, applicableTo);
            }
            else if (string.Equals(doc.Name.LocalName, Commands.AbstractDynamicCommandXsdSchemas.RibbonDiffXmlRoot, StringComparison.InvariantCultureIgnoreCase) ||
                     string.Equals(doc.Name.LocalName, Commands.AbstractDynamicCommandXsdSchemas.RibbonXmlRoot, StringComparison.InvariantCultureIgnoreCase)
                     )
            {
                var repositoryEntities    = ConnectionIntellisenseDataRepository.GetRepository(connectionData);
                var repositoryWebResource = WebResourceIntellisenseDataRepository.GetRepository(connectionData);

                var repositoryRibbon = RibbonIntellisenseDataRepository.GetRepository(connectionData);

                FillSessionForRibbonDiffXmlCompletionSet(completionSets, doc, connectionData, repositoryEntities, repositoryWebResource, repositoryRibbon, currentXmlNode, currentNodeName, currentAttributeName, applicableTo);
            }
            else if (string.Equals(doc.Name.LocalName, Commands.AbstractDynamicCommandXsdSchemas.WebResourceDependencyXmlRoot, StringComparison.InvariantCultureIgnoreCase))
            {
                var repositoryEntities    = ConnectionIntellisenseDataRepository.GetRepository(connectionData);
                var repositoryWebResource = WebResourceIntellisenseDataRepository.GetRepository(connectionData);

                FillSessionForWebResourceDependencyXmlCompletionSet(completionSets, doc, connectionData, repositoryEntities, repositoryWebResource, currentXmlNode, currentNodeName, currentAttributeName, applicableTo);
            }
            else if (string.Equals(doc.Name.LocalName, Commands.AbstractDynamicCommandXsdSchemas.FormXmlRoot, StringComparison.InvariantCultureIgnoreCase))
            {
                var repositoryWebResource = WebResourceIntellisenseDataRepository.GetRepository(connectionData);

                FillSessionForFormXmlCompletionSet(completionSets, doc, connectionData, repositoryWebResource, currentXmlNode, currentNodeName, currentAttributeName, applicableTo);
            }
        }