/// <summary> /// Populates R completion list for a given position /// </summary> /// <param name="position">Position in R text buffer</param> /// <param name="session">Completion session</param> /// <param name="completionSets">Completion sets to add to</param> /// <param name="ast">Document abstract syntax tree</param> internal void PopulateCompletionList(int position, ICompletionSession session, IList <CompletionSet> completionSets, AstRoot ast) { RCompletionContext context = new RCompletionContext(session, _textBuffer, ast, position); bool autoShownCompletion = true; if (session.TextView.Properties.ContainsProperty(CompletionController.AutoShownCompletion)) { autoShownCompletion = session.TextView.Properties.GetProperty <bool>(CompletionController.AutoShownCompletion); } IReadOnlyCollection <IRCompletionListProvider> providers = RCompletionEngine.GetCompletionForLocation(context, autoShownCompletion, _shell); // Position is in R as is the applicable spa, so no need to map down Span?applicableSpan = GetApplicableSpan(position, session); if (applicableSpan.HasValue) { ITrackingSpan trackingSpan = context.TextBuffer.CurrentSnapshot.CreateTrackingSpan(applicableSpan.Value, SpanTrackingMode.EdgeInclusive); List <RCompletion> completions = new List <RCompletion>(); bool sort = true; foreach (IRCompletionListProvider provider in providers) { IReadOnlyCollection <RCompletion> entries = provider.GetEntries(context); Debug.Assert(entries != null); if (entries.Count > 0) { completions.AddRange(entries); } sort &= provider.AllowSorting; } if (sort) { completions.Sort(RCompletion.CompareOrdinal); completions.RemoveDuplicates(RCompletion.CompareOrdinal); } CompletionSet completionSet = new RCompletionSet(session.TextView.TextBuffer, trackingSpan, completions); completionSets.Add(completionSet); } }
/// <summary> /// Should this key press trigger a completion session? /// </summary> public override bool IsTriggerChar(char typedCharacter) { if (!HasActiveCompletionSession) { switch (typedCharacter) { case '$': case '@': return(true); case ':': return(RCompletionContext.IsCaretInNamespace(TextView)); case '(': return(RCompletionContext.IsCaretInLibraryStatement(TextView)); default: if (_settings.ShowCompletionOnFirstChar) { SnapshotPoint?position = REditorDocument.MapCaretPositionFromView(TextView); if (position.HasValue) { int pos = position.Value; var snapshot = position.Value.Snapshot; // Trigger on first character if (RTokenizer.IsIdentifierCharacter(typedCharacter) && !char.IsDigit(typedCharacter)) { // Ignore if this is not the first character return(pos <= 1 || (pos > 1 && !RTokenizer.IsIdentifierCharacter(snapshot[pos - 2]))); } } } break; } } return(false); }