public IEnumerable <ITagSpan <IconFileNameMarkerTag> > GetTags(NormalizedSnapshotSpanCollection spans) { var jsonDocument = JsonEditorDocument.FromTextBuffer(buffer); var treeRoot = jsonDocument.DocumentNode; var result = new List <ITagSpan <IconFileNameMarkerTag> >(); var visitor = new NodeVisitor( (item) => { if (item is MemberNode property) { string propertyName = property.Name.GetCanonicalizedText(); if ((propertyName == "color" || propertyName == "outline") && (property.Value != null)) { var markerSpan = new SnapshotSpan(buffer.CurrentSnapshot, property.Value.Start, property.Value.Span.Length); var tagSpan = new TagSpan <IconFileNameMarkerTag>(markerSpan, new IconFileNameMarkerTag()); result.Add(tagSpan); return(VisitNodeResult.SkipChildren); } } return(VisitNodeResult.Continue); }); treeRoot.Accept(visitor); return(result); }
private async void RetriggerAsync(bool force) { _lastTyped = DateTime.Now; int delay = force ? 50 : _delay; // Don't leave "stale" completion session up while the user is typing, or else we could // get completion from a stale session. ICompletionSession completionSession = _broker.GetSessions(_textView).FirstOrDefault(); if (completionSession != null && completionSession.Properties.TryGetProperty <bool>(RetriggerCompletion, out bool retrigger) && retrigger) { completionSession.Dismiss(); } await System.Threading.Tasks.Task.Delay(delay); // Prevents retriggering from happening while typing fast if (_lastTyped.AddMilliseconds(delay) > DateTime.Now) { return; } // Completion may have gotten invoked via by Web Editor OnPostTypeChar(). Don't invoke again, or else we get flikering completion list // TODO:Review the design here post-preview 4 and make sure this completion controller doesn't clash with Web Editors Json completion controller completionSession = _broker.GetSessions(_textView).FirstOrDefault(); if (completionSession != null && completionSession.Properties.TryGetProperty <bool>(RetriggerCompletion, out retrigger)) { return; } var doc = JsonEditorDocument.FromTextBuffer(_textView.TextDataModel.DocumentBuffer); if (doc == null) { return; } Node node = JsonHelpers.GetNodeBeforePosition(_textView.Caret.Position.BufferPosition, doc.DocumentNode); if (node == null) { return; } MemberNode memberNode = node.FindType <MemberNode>(); if (memberNode == null || (!memberNode.UnquotedNameText.Equals(ManifestConstants.Library) && !memberNode.UnquotedNameText.Equals(ManifestConstants.Destination) && memberNode.UnquotedValueText?.Length <= 1)) { return; } ObjectNode parent = node.FindType <ObjectNode>(); if (JsonHelpers.TryGetInstallationState(parent, out ILibraryInstallationState state)) { VsHelpers.DTE.ExecuteCommand("Edit.ListMembers"); } }
private MemberNode GetLibraries(ITextBuffer textBuffer) { JsonEditorDocument document = JsonEditorDocument.FromTextBuffer(textBuffer); if (document != null) { Node topLevelNode = document.DocumentNode.TopLevelValue.FindType <ObjectNode>(); SortedNodeList <Node> topLevelNodeChildren = JsonHelpers.GetChildren(topLevelNode); IEnumerable <MemberNode> jsonMembers = topLevelNodeChildren.OfType <MemberNode>(); return(jsonMembers.FirstOrDefault(m => m.UnquotedNameText == ManifestConstants.Libraries)); } return(null); }
public IEnumerable <ITagSpan <ColorMarkerTag> > GetTags(NormalizedSnapshotSpanCollection spans) { var jsonDocument = JsonEditorDocument.FromTextBuffer(buffer); var treeRoot = jsonDocument.DocumentNode; var result = new List <ITagSpan <ColorMarkerTag> >(); var visitor = new NodeVisitor( (item) => { var property = item as MemberNode; if (property != null) { string propertyName = property.Name.GetCanonicalizedText(); if ((propertyName == "accentColor") && (property.Value != null)) { var markerSpan = new SnapshotSpan(buffer.CurrentSnapshot, property.Value.Start, property.Value.Span.Length); Color?color = TextToColor(property.Value.GetText().Substring(1, property.Value.GetText().Length - 2)); if (color.HasValue) { var tagSpan = new TagSpan <ColorMarkerTag>(markerSpan, new ColorMarkerTag(color.Value)); result.Add(tagSpan); } return(VisitNodeResult.SkipChildren); } } return(VisitNodeResult.Continue); }); treeRoot.Accept(visitor); return(result); }