public Task <CompletionContext> GetCompletionContextAsync(IAsyncCompletionSession session, CompletionTrigger trigger, SnapshotPoint triggerLocation, SnapshotSpan applicableToSpan, CancellationToken token) { //session.Properties["LineNumber"] = triggerLocation.GetContainingLine().LineNumber; var point = applicableToSpan.Start; var text = textView.TextBuffer.CurrentSnapshot.GetText(0, point.Position); return(Task.Run(() => { try { // read XML up to the cursor var info = XmlParser.Read(text); if (info.Mode == CompletionMode.Class) { var prevPoint = point - 1; var prevCh = prevPoint.GetChar(); if (prevCh != '<' && prevCh != '.') { return CompletionContext.Empty; } } var nodes = info.Nodes; var ns = nodes.SelectMany(r => r.Namespaces ?? Enumerable.Empty <CompletionNamespace>()); var path = nodes.Where(r => r.Mode == CompletionMode.Class).Select(r => r.Name).ToList(); var last = nodes.LastOrDefault(); // get available completion items var items = Designer.Completion.Completion.GetCompletionItems(ns, info.Mode, path, last); // translate to VS completions var completionList = new List <mvli.AsyncCompletion.Data.CompletionItem>(); foreach (var cls in items.OrderBy(r => r.Name)) { var displayText = cls.Name; var item = new mvli.AsyncCompletion.Data.CompletionItem(displayText, source: this, filters: ImmutableArray <CompletionFilter> .Empty, icon: GetGlyph(cls.Type), suffix: cls.Suffix ?? string.Empty, attributeIcons: ImmutableArray <ImageElement> .Empty, insertText: displayText, sortText: displayText, filterText: displayText ); item.Properties["eto"] = cls; completionList.Add(item); } return new CompletionContext(completionList.ToImmutableArray(), null, InitialSelectionHint.RegularSelection); } catch (Exception ex) { Debug.WriteLine($"Error doing autocomplete: {ex}"); throw; } })); }
public void AugmentCompletionSession(ICompletionSession session, IList <CompletionSet> completionSets) { try { // read XML up to the cursor var point = session.TextView.Caret.Position.BufferPosition; var info = XmlParser.Read(buffer.CurrentSnapshot.GetText(0, point.Position)); if (info.Mode == CompletionMode.Class) { var prevPoint = point - 1; var prevCh = prevPoint.GetChar(); if (prevCh != '<' && prevCh != '.') { session.Dismiss(); return; } } var nodes = info.Nodes; var ns = nodes.SelectMany(r => r.Namespaces ?? Enumerable.Empty <CompletionNamespace>()); var path = nodes.Where(r => r.Mode == CompletionMode.Class).Select(r => r.Name).ToList(); var last = nodes.LastOrDefault(); // get available completion items var items = Designer.Completion.Completion.GetCompletionItems(ns, info.Mode, path, last); // translate to VS completions var completionList = new List <mvli.Completion>(); foreach (var cls in items.OrderBy(r => r.Name)) { completionList.Add(new mvli.Completion(cls.Name, cls.Name, cls.Description, GetGlyph(cls.Type), null)); } completionSets.Insert(0, new CompletionSet( "eto", "Eto", FindTokenSpanAtPosition(session.GetTriggerPoint(buffer), session, info.Mode), completionList, null)); return; } catch (Exception ex) { Debug.WriteLine($"Error doing autocomplete: {ex}"); throw; } }