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