private CompletionTriggerInfo(CompletionTriggerReason triggerReason, char? triggerCharacter) : this() { Contract.ThrowIfTrue(triggerReason == CompletionTriggerReason.TypeCharCommand && triggerCharacter == null); this.TriggerReason = triggerReason; this.TriggerCharacter = triggerCharacter; }
public virtual async Task TriggerCompletion(CompletionTriggerReason reason) { if (Editor.SelectionMode == SelectionMode.Block) { return; } if (CompletionWindowManager.IsVisible) { CompletionWindowManager.Wnd.ToggleCategoryMode(); return; } Editor.EnsureCaretIsNotVirtual(); ICompletionDataList completionList = null; int cpos, wlen; if (!GetCompletionCommandOffset(out cpos, out wlen)) { cpos = Editor.CaretOffset; wlen = 0; } CurrentCompletionContext = CompletionWidget.CreateCodeCompletionContext(cpos); CurrentCompletionContext.TriggerWordLength = wlen; completionList = await HandleCodeCompletionAsync(CurrentCompletionContext, new CompletionTriggerInfo (reason)); if (completionList != null && completionList.TriggerWordStart >= 0) { CurrentCompletionContext.TriggerOffset = completionList.TriggerWordStart; CurrentCompletionContext.TriggerWordLength = completionList.TriggerWordLength; } if (completionList == null || !CompletionWindowManager.ShowWindow(this, (char)0, completionList, CompletionWidget, CurrentCompletionContext)) { CurrentCompletionContext = null; } }
public virtual async Task TriggerCompletion(CompletionTriggerReason reason) { if (Editor.SelectionMode == SelectionMode.Block) { return; } if (CompletionWindowManager.IsVisible) { CompletionWindowManager.ToggleCategoryMode(); return; } Editor.EnsureCaretIsNotVirtual(); ICompletionDataList completionList = null; int cpos, wlen; if (!GetCompletionCommandOffset(out cpos, out wlen)) { cpos = Editor.CaretOffset; wlen = 0; } completionTokenSrc.Cancel(); completionTokenSrc = new CancellationTokenSource(); var token = completionTokenSrc.Token; CurrentCompletionContext = CompletionWidget.CreateCodeCompletionContext(cpos); CurrentCompletionContext.TriggerWordLength = wlen; ITimeTracker timer = null; bool failure = false; try { timer = Counters.ProcessCodeCompletion.BeginTiming(); completionList = await DoHandleCodeCompletionAsync(CurrentCompletionContext, new CompletionTriggerInfo (reason), token); if (completionList != null && completionList.TriggerWordStart >= 0) { CurrentCompletionContext.TriggerOffset = completionList.TriggerWordStart; CurrentCompletionContext.TriggerWordLength = completionList.TriggerWordLength; } if (completionList == null || !CompletionWindowManager.ShowWindow(this, (char)0, completionList, CompletionWidget, CurrentCompletionContext)) { CurrentCompletionContext = null; } } catch (Exception) { failure = true; throw; } finally { Counters.ProcessCodeCompletion.EndTiming(); if (failure) { completionStats.OnFailure(timer.Duration); } else { completionStats.OnSuccess(timer.Duration); } } }
private CompletionTriggerInfo(CompletionTriggerReason triggerReason, char?triggerCharacter) : this() { Contract.ThrowIfTrue(triggerReason == CompletionTriggerReason.TypeCharCommand && triggerCharacter == null); this.TriggerReason = triggerReason; this.TriggerCharacter = triggerCharacter; }
private FilteredCompletionModel HandleAllItemsFilteredOut( CompletionTriggerReason triggerReason, ImmutableArray <CompletionFilterWithState> filters, CompletionRules completionRules) { if (triggerReason == CompletionTriggerReason.Insertion) { // If the user was just typing, and the list went to empty *and* this is a // language that wants to dismiss on empty, then just return a null model // to stop the completion session. if (completionRules.DismissIfEmpty) { return(null); } } // If the user has turned on some filtering states, and we filtered down to // nothing, then we do want the UI to show that to them. That way the user // can turn off filters they don't want and get the right set of items. // If we are going to filter everything out, then just preserve the existing // model (and all the previously filtered items), but switch over to soft // selection. var selection = UpdateSelectionHint.SoftSelected; return(new FilteredCompletionModel( ImmutableArray <CompletionItemWithHighlight> .Empty, selectedItemIndex: 0, filters, selection, centerSelection: true, uniqueItem: default)); }
public CompletionTriggerInfo (CompletionTriggerReason completionTriggerReason, char? triggerCharacter = null, bool isAugment = false, bool isDebugger = false, bool isImmediateWindow = false) : this() { this.CompletionTriggerReason = completionTriggerReason; this.TriggerCharacter = triggerCharacter; this.IsAugment = isAugment; this.IsDebugger = isDebugger; this.IsImmediateWindow = isImmediateWindow; }
public CompletionTriggerInfo(CompletionTriggerReason completionTriggerReason, char?triggerCharacter = null, bool isAugment = false, bool isDebugger = false, bool isImmediateWindow = false) : this() { this.CompletionTriggerReason = completionTriggerReason; this.TriggerCharacter = triggerCharacter; this.IsAugment = isAugment; this.IsDebugger = isDebugger; this.IsImmediateWindow = isImmediateWindow; }
private CompletionTriggerInfo(CompletionTriggerReason triggerReason, char? triggerCharacter, bool isDebugger, bool isImmediateWindow) : this() { Contract.ThrowIfTrue(triggerReason == CompletionTriggerReason.TypeCharCommand && triggerCharacter == null); this.TriggerReason = triggerReason; this.TriggerCharacter = triggerCharacter; this.IsDebugger = isDebugger; this.IsImmediateWindow = isImmediateWindow; }
private CompletionTriggerInfo(CompletionTriggerReason triggerReason, char?triggerCharacter, bool isDebugger, bool isImmediateWindow) : this() { Contract.ThrowIfTrue(triggerReason == CompletionTriggerReason.TypeCharCommand && triggerCharacter == null); this.TriggerReason = triggerReason; this.TriggerCharacter = triggerCharacter; this.IsDebugger = isDebugger; this.IsImmediateWindow = isImmediateWindow; }
public Task <CompletionContext> GetCompletionContext(string documentText, CompletionTriggerReason reason = CompletionTriggerReason.Invoke, char triggerChar = '\0', char caretMarker = '$', string filename = default) { int caretOffset; (documentText, caretOffset) = ExtractCaret(documentText, caretMarker); var textView = CreateTextView(documentText, filename); return(GetCompletionContext(textView, caretOffset, reason, triggerChar)); }
public virtual async Task TriggerCompletion(CompletionTriggerReason reason) { if (Editor.SelectionMode == SelectionMode.Block) { return; } if (CompletionWindowManager.IsVisible) { CompletionWindowManager.ToggleCategoryMode(); return; } Editor.EnsureCaretIsNotVirtual(); ICompletionDataList completionList = null; int cpos, wlen; if (!GetCompletionCommandOffset(out cpos, out wlen)) { cpos = Editor.CaretOffset; wlen = 0; } completionTokenSrc.Cancel(); completionTokenSrc = new CancellationTokenSource(); var token = completionTokenSrc.Token; CurrentCompletionContext = CompletionWidget.CreateCodeCompletionContext(cpos); CurrentCompletionContext.TriggerWordLength = wlen; var metadata = new Dictionary <string, string> (); metadata ["Result"] = "Success"; try { Counters.ProcessCodeCompletion.BeginTiming(metadata); completionList = await DoHandleCodeCompletionAsync(CurrentCompletionContext, new CompletionTriggerInfo (reason), token); if (completionList != null && completionList.TriggerWordStart >= 0) { CurrentCompletionContext.TriggerOffset = completionList.TriggerWordStart; CurrentCompletionContext.TriggerWordLength = completionList.TriggerWordLength; } if (completionList == null || !CompletionWindowManager.ShowWindow(this, (char)0, completionList, CompletionWidget, CurrentCompletionContext)) { CurrentCompletionContext = null; } } catch (Exception) { metadata ["Result"] = "Failure"; throw; } finally { Counters.ProcessCodeCompletion.EndTiming(); } }
public Task <CompletionContext> GetCompletionContext(string documentText, CompletionTriggerReason reason = CompletionTriggerReason.Invoke, char triggerChar = '\0', char caretMarker = '$', string filename = default) { var caretOffset = documentText.IndexOf(caretMarker); if (caretOffset < 0) { throw new ArgumentException("Document does not contain a caret marker", nameof(documentText)); } documentText = documentText.Substring(0, caretOffset) + documentText.Substring(caretOffset + 1); var textView = CreateTextView(documentText, filename); return(GetCompletionContext(textView, caretOffset, reason, triggerChar)); }
static TriggerReason?ConvertReason(CompletionTriggerReason reason, char typedChar) { switch (reason) { case CompletionTriggerReason.Insertion: if (typedChar != '\0') { return(TriggerReason.TypedChar); } break; case CompletionTriggerReason.Backspace: return(TriggerReason.Backspace); case CompletionTriggerReason.Invoke: case CompletionTriggerReason.InvokeAndCommitIfUnique: return(TriggerReason.Invocation); } return(null); }
public CompletionTriggerInfo WithCompletionTriggerReason(CompletionTriggerReason reason) { return this.CompletionTriggerReason == reason ? this : new CompletionTriggerInfo(reason, this.TriggerCharacter, this.IsAugment, this.IsDebugger, this.IsImmediateWindow); }
/// <summary> /// Creates a <see cref="CompletionTrigger"/> associated with a text edit /// </summary> /// <param name="reason">The kind of action that caused completion to trigger or update</param> /// <param name="character">Character associated with the action</param> /// <param name="snapshotBeforeTrigger">Snapshot on the view's text buffer before or when action was taken</param> public CompletionTrigger(CompletionTriggerReason reason, ITextSnapshot snapshotBeforeTrigger, char character) { this.Reason = reason; this.Character = character; this.ViewSnapshotBeforeTrigger = snapshotBeforeTrigger ?? throw new ArgumentNullException(nameof(snapshotBeforeTrigger)); }
public async Task <CompletionContext> GetCompletionContext(ITextView textView, int caretPosition, CompletionTriggerReason reason, char triggerChar, CancellationToken cancellationToken = default) { var broker = Catalog.AsyncCompletionBroker; var snapshot = textView.TextBuffer.CurrentSnapshot; var trigger = new CompletionTrigger(reason, snapshot, triggerChar); if (triggerChar != '\0') { snapshot = textView.TextBuffer.Insert(caretPosition, triggerChar.ToString()); caretPosition++; } var context = await broker.GetAggregatedCompletionContextAsync( textView, trigger, new SnapshotPoint (snapshot, caretPosition), cancellationToken ); return(context.CompletionContext); }
private FilteredCompletionModel HandleDeletionTrigger( CompletionTriggerReason filterTriggerKind, List <ExtendedFilterResult> filterResults, string filterText, ImmutableArray <CompletionFilterWithState> filters, ImmutableArray <CompletionItemWithHighlight> highlightedList) { if (filterTriggerKind == CompletionTriggerReason.Insertion && !filterResults.Any(r => r.FilterResult.MatchedFilterText)) { // The user has typed something, but nothing in the actual list matched what // they were typing. In this case, we want to dismiss completion entirely. // The thought process is as follows: we aggressively brough up completion // to help them when they typed delete (in case they wanted to pick another // item). However, they're typing something that doesn't seem to match at all // The completion list is just distracting at this point. return(null); } ExtendedFilterResult?bestFilterResult = null; int matchCount = 1; foreach (var currentFilterResult in filterResults.Where(r => r.FilterResult.MatchedFilterText)) { if (bestFilterResult == null || IsBetterDeletionMatch(currentFilterResult.FilterResult, bestFilterResult.Value.FilterResult)) { // We had no best result yet, so this is now our best result. bestFilterResult = currentFilterResult; matchCount++; } } int index; bool hardSelect; // If we had a matching item, then pick the best of the matching items and // choose that one to be hard selected. If we had no actual matching items // (which can happen if the user deletes down to a single character and we // include everything), then we just soft select the first item. if (bestFilterResult != null) { // Only hard select this result if it's a prefix match // We need to do this so that // * deleting and retyping a dot in a member access does not change the // text that originally appeared before the dot // * deleting through a word from the end keeps that word selected // This also preserves the behavior the VB had through Dev12. hardSelect = bestFilterResult.Value.VSCompletionItem.FilterText.StartsWith(filterText, StringComparison.CurrentCultureIgnoreCase); index = filterResults.IndexOf(bestFilterResult.Value); } else { index = 0; hardSelect = false; } return(new FilteredCompletionModel( highlightedList, index, filters, hardSelect ? UpdateSelectionHint.Selected : UpdateSelectionHint.SoftSelected, centerSelection: true, uniqueItem: matchCount == 1 ? bestFilterResult.GetValueOrDefault().VSCompletionItem : default)); }
/// <summary> /// Creates a <see cref="CompletionTrigger"/> not associated with a text edit /// </summary> /// <param name="reason">The kind of action that triggered completion action</param> /// <param name="snapshotBeforeTrigger">Snapshot on the view's text buffer when action was taken</param> public CompletionTrigger(CompletionTriggerReason reason, ITextSnapshot snapshotBeforeTrigger) : this(reason, snapshotBeforeTrigger, default) { }
public CompletionTriggerInfo WithCompletionTriggerReason(CompletionTriggerReason reason) { return(this.CompletionTriggerReason == reason ? this : new CompletionTriggerInfo(reason, this.TriggerCharacter, this.IsAugment, this.IsDebugger, this.IsImmediateWindow)); }