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;
 }
Beispiel #5
0
        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;
 }
Beispiel #9
0
 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();
            }
        }
Beispiel #12
0
        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));
        }
Beispiel #13
0
        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));
 }
Beispiel #16
0
        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);
        }
Beispiel #17
0
        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));
 }