public Model( DisconnectedBufferGraph disconnectedBufferGraph, TextSpan textSpan, ISignatureHelpProvider provider, IList<SignatureHelpItem> items, SignatureHelpItem selectedItem, int argumentIndex, int argumentCount, string argumentName, int? selectedParameter) { Contract.ThrowIfNull(selectedItem); Contract.ThrowIfFalse(items.Count != 0, "Must have at least one item."); Contract.ThrowIfFalse(items.Contains(selectedItem), "Selected item must be in list of items."); _disconnectedBufferGraph = disconnectedBufferGraph; this.TextSpan = textSpan; this.Items = items; this.Provider = provider; this.SelectedItem = selectedItem; this.ArgumentIndex = argumentIndex; this.ArgumentCount = argumentCount; this.ArgumentName = argumentName; this.SelectedParameter = selectedParameter; }
public void ComputeModel( ImmutableArray <ISignatureHelpProvider> providers, SignatureHelpTriggerInfo triggerInfo ) { AssertIsForeground(); var caretPosition = Controller.TextView.GetCaretPoint(Controller.SubjectBuffer).Value; var disconnectedBufferGraph = new DisconnectedBufferGraph( Controller.SubjectBuffer, Controller.TextView.TextBuffer ); // If we've already computed a model, then just use that. Otherwise, actually // compute a new model and send that along. Computation.ChainTaskAndNotifyControllerWhenFinished( (model, cancellationToken) => ComputeModelInBackgroundAsync( model, providers, caretPosition, disconnectedBufferGraph, triggerInfo, cancellationToken ) ); }
private Model( DisconnectedBufferGraph disconnectedBufferGraph, IList <CompletionItem> totalItems, IList <CompletionItem> filteredItems, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionItem defaultBuilder, CompletionTriggerInfo triggerInfo, ITrackingPoint commitSpanEndPoint, bool dismissIfEmpty) { Contract.ThrowIfNull(selectedItem); Contract.ThrowIfFalse(totalItems.Count != 0, "Must have at least one item."); Contract.ThrowIfFalse(filteredItems.Count != 0, "Must have at least one filtered item."); Contract.ThrowIfFalse(filteredItems.Contains(selectedItem) || defaultBuilder == selectedItem, "Selected item must be in filtered items."); _disconnectedBufferGraph = disconnectedBufferGraph; this.TotalItems = totalItems; this.FilteredItems = filteredItems; this.SelectedItem = selectedItem; this.IsHardSelection = isHardSelection; this.IsUnique = isUnique; this.UseSuggestionCompletionMode = useSuggestionCompletionMode; this.Builder = builder; this.DefaultBuilder = defaultBuilder; this.TriggerInfo = triggerInfo; this.CommitTrackingSpanEndPoint = commitSpanEndPoint; this.DismissIfEmpty = dismissIfEmpty; }
public Model( DisconnectedBufferGraph disconnectedBufferGraph, TextSpan textSpan, ISignatureHelpProvider provider, IList <SignatureHelpItem> items, SignatureHelpItem selectedItem, int argumentIndex, int argumentCount, string argumentName, int?selectedParameter) { Contract.ThrowIfNull(selectedItem); Contract.ThrowIfFalse(items.Count != 0, "Must have at least one item."); Contract.ThrowIfFalse(items.Contains(selectedItem), "Selected item must be in list of items."); _disconnectedBufferGraph = disconnectedBufferGraph; this.TextSpan = textSpan; this.Items = items; this.Provider = provider; this.SelectedItem = selectedItem; this.ArgumentIndex = argumentIndex; this.ArgumentCount = argumentCount; this.ArgumentName = argumentName; this.SelectedParameter = selectedParameter; }
private Model( DisconnectedBufferGraph disconnectedBufferGraph, IList <CompletionItem> totalItems, IList <CompletionItem> filteredItems, CompletionItem selectedItem, ImmutableArray <CompletionItemFilter> completionItemFilters, ImmutableDictionary <CompletionItemFilter, bool> filterState, IReadOnlyDictionary <CompletionItem, string> completionItemToFilterText, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionItem defaultBuilder, CompletionTriggerInfo triggerInfo, ITrackingPoint commitSpanEndPoint, bool dismissIfEmpty) { Contract.ThrowIfFalse(totalItems.Count != 0, "Must have at least one item."); _disconnectedBufferGraph = disconnectedBufferGraph; this.TotalItems = totalItems; this.FilteredItems = filteredItems; this.FilterState = filterState; this.SelectedItem = selectedItem; this.CompletionItemFilters = completionItemFilters; this.CompletionItemToFilterText = completionItemToFilterText; this.IsHardSelection = isHardSelection; this.IsUnique = isUnique; this.UseSuggestionCompletionMode = useSuggestionCompletionMode; this.Builder = builder; this.DefaultBuilder = defaultBuilder; this.TriggerInfo = triggerInfo; this.CommitTrackingSpanEndPoint = commitSpanEndPoint; this.DismissIfEmpty = dismissIfEmpty; }
private Model( DisconnectedBufferGraph disconnectedBufferGraph, IList<CompletionItem> totalItems, IList<CompletionItem> filteredItems, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionItem defaultBuilder, CompletionTriggerInfo triggerInfo, ITrackingPoint commitSpanEndPoint, bool dismissIfEmpty) { Contract.ThrowIfNull(selectedItem); Contract.ThrowIfFalse(totalItems.Count != 0, "Must have at least one item."); Contract.ThrowIfFalse(filteredItems.Count != 0, "Must have at least one filtered item."); Contract.ThrowIfFalse(filteredItems.Contains(selectedItem) || defaultBuilder == selectedItem, "Selected item must be in filtered items."); _disconnectedBufferGraph = disconnectedBufferGraph; this.TotalItems = totalItems; this.FilteredItems = filteredItems; this.SelectedItem = selectedItem; this.IsHardSelection = isHardSelection; this.IsUnique = isUnique; this.UseSuggestionCompletionMode = useSuggestionCompletionMode; this.Builder = builder; this.DefaultBuilder = defaultBuilder; this.TriggerInfo = triggerInfo; this.CommitTrackingSpanEndPoint = commitSpanEndPoint; this.DismissIfEmpty = dismissIfEmpty; }
public void ComputeModel( ImmutableArray <ISignatureHelpProvider> providers, SignatureHelpTriggerInfo triggerInfo) { AssertIsForeground(); var caretPosition = Controller.TextView.GetCaretPoint(Controller.SubjectBuffer).Value; var disconnectedBufferGraph = new DisconnectedBufferGraph(Controller.SubjectBuffer, Controller.TextView.TextBuffer); // If this is a retrigger command then update the retrigger-id. This way // any in-flight retrigger-updates will immediately bail out. if (IsNonTypeCharRetrigger(triggerInfo)) { Interlocked.Increment(ref _retriggerId); } var localId = _retriggerId; // If we've already computed a model, then just use that. Otherwise, actually // compute a new model and send that along. Computation.ChainTaskAndNotifyControllerWhenFinished( (model, cancellationToken) => ComputeModelInBackgroundAsync( localId, model, providers, caretPosition, disconnectedBufferGraph, triggerInfo, cancellationToken)); }
private Model( DisconnectedBufferGraph disconnectedBufferGraph, IList<CompletionItem> totalItems, IList<CompletionItem> filteredItems, CompletionItem selectedItem, ImmutableArray<CompletionItemFilter> completionItemFilters, ImmutableDictionary<CompletionItemFilter, bool> filterState, IReadOnlyDictionary<CompletionItem, string> completionItemToFilterText, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionItem defaultBuilder, CompletionTriggerInfo triggerInfo, ITrackingPoint commitSpanEndPoint, bool dismissIfEmpty) { Contract.ThrowIfFalse(totalItems.Count != 0, "Must have at least one item."); _disconnectedBufferGraph = disconnectedBufferGraph; this.TotalItems = totalItems; this.FilteredItems = filteredItems; this.FilterState = filterState; this.SelectedItem = selectedItem; this.CompletionItemFilters = completionItemFilters; this.CompletionItemToFilterText = completionItemToFilterText; this.IsHardSelection = isHardSelection; this.IsUnique = isUnique; this.UseSuggestionCompletionMode = useSuggestionCompletionMode; this.Builder = builder; this.DefaultBuilder = defaultBuilder; this.TriggerInfo = triggerInfo; this.CommitTrackingSpanEndPoint = commitSpanEndPoint; this.DismissIfEmpty = dismissIfEmpty; }
private void SetCaretPosition(int desiredCaretPosition) { // Now, move the caret to the right location. var graph = new DisconnectedBufferGraph(this.SubjectBuffer, this.TextView.TextBuffer); var viewTextSpan = graph.GetSubjectBufferTextSpanInViewBuffer(new TextSpan(desiredCaretPosition, 0)); TextView.Caret.MoveTo(new SnapshotPoint(TextView.TextBuffer.CurrentSnapshot, viewTextSpan.TextSpan.Start)); }
private static ITrackingPoint GetDefaultTrackingSpanEnd( TextSpan defaultTrackingSpanInSubjectBuffer, DisconnectedBufferGraph disconnectedBufferGraph) { var viewSpan = disconnectedBufferGraph.GetSubjectBufferTextSpanInViewBuffer(defaultTrackingSpanInSubjectBuffer); return(disconnectedBufferGraph.ViewSnapshot.Version.CreateTrackingPoint( viewSpan.TextSpan.End, PointTrackingMode.Positive)); }
public static Model CreateModel( Document triggerDocument, DisconnectedBufferGraph disconnectedBufferGraph, CompletionList originalList, bool useSuggestionMode, CompletionTrigger trigger) { var selectedItem = originalList.Items.First(); var isHardSelection = false; var isUnique = false; // Get the set of actual filters used by all the completion items // that are in the list. var actualFiltersSeen = new HashSet <CompletionItemFilter>(); foreach (var item in originalList.Items) { foreach (var filter in CompletionItemFilter.AllFilters) { if (filter.Matches(item)) { actualFiltersSeen.Add(filter); } } } // The set of filters we'll want to show the user are the filters that are actually // used by our completion items. i.e. there's no reason to show the "field" filter // if none of completion items is actually a field. var actualItemFilters = CompletionItemFilter.AllFilters.Where(actualFiltersSeen.Contains) .ToImmutableArray(); // By default we do not filter anything out. ImmutableDictionary <CompletionItemFilter, bool> filterState = null; return(new Model( triggerDocument, disconnectedBufferGraph, originalList, originalList.Items, selectedItem, actualItemFilters, filterState, "", isHardSelection, isUnique, useSuggestionMode, originalList.SuggestionModeItem, trigger, GetDefaultTrackingSpanEnd(originalList.Span, disconnectedBufferGraph), originalList.Rules.DismissIfEmpty)); }
public void ComputeModel( IList<ISignatureHelpProvider> matchedProviders, IList<ISignatureHelpProvider> unmatchedProviders, SignatureHelpTriggerInfo triggerInfo) { AssertIsForeground(); var caretPosition = Controller.TextView.GetCaretPoint(Controller.SubjectBuffer).Value; var disconnectedBufferGraph = new DisconnectedBufferGraph(Controller.SubjectBuffer, Controller.TextView.TextBuffer); // If we've already computed a model, then just use that. Otherwise, actually // compute a new model and send that along. Computation.ChainTaskAndNotifyControllerWhenFinished( (model, cancellationToken) => ComputeModelInBackgroundAsync(model, matchedProviders, unmatchedProviders, caretPosition, disconnectedBufferGraph, triggerInfo, cancellationToken)); }
public ModelComputer( Session session, CompletionService completionService, CompletionTrigger trigger, ImmutableHashSet <string> roles, OptionSet options) { _session = session; _completionService = completionService; _options = options; _trigger = trigger; _subjectBufferCaretPosition = session.Controller.TextView.GetCaretPoint(session.Controller.SubjectBuffer).Value; _roles = roles; _text = _subjectBufferCaretPosition.Snapshot.AsText(); _useSuggestionMode = session.Controller.SubjectBuffer.GetOption(Options.EditorCompletionOptions.UseSuggestionMode); _disconnectedBufferGraph = new DisconnectedBufferGraph(session.Controller.SubjectBuffer, session.Controller.TextView.TextBuffer); }
public ModelComputer( Session session, ICompletionService completionService, CompletionTriggerInfo triggerInfo, IEnumerable <CompletionListProvider> completionProviders, bool isDebugger) { _session = session; _completionService = completionService; _options = session.Controller.SubjectBuffer.TryGetOptions(); _triggerInfo = triggerInfo; _subjectBufferCaretPosition = session.Controller.TextView.GetCaretPoint(session.Controller.SubjectBuffer).Value; _completionProviders = completionProviders; _text = _subjectBufferCaretPosition.Snapshot.AsText(); _includeBuilder = session.Controller.SubjectBuffer.GetOption(Options.EditorCompletionOptions.UseSuggestionMode); _disconnectedBufferGraph = new DisconnectedBufferGraph(session.Controller.SubjectBuffer, session.Controller.TextView.TextBuffer); }
public ModelComputer( Session session, CompletionService completionService, CompletionTrigger trigger, ImmutableHashSet<string> roles, OptionSet options) { _session = session; _completionService = completionService; _options = options; _trigger = trigger; _subjectBufferCaretPosition = session.Controller.TextView.GetCaretPoint(session.Controller.SubjectBuffer).Value; _roles = roles; _text = _subjectBufferCaretPosition.Snapshot.AsText(); _useSuggestionMode = session.Controller.SubjectBuffer.GetFeatureOnOffOption(Options.EditorCompletionOptions.UseSuggestionMode); _disconnectedBufferGraph = new DisconnectedBufferGraph(session.Controller.SubjectBuffer, session.Controller.TextView.TextBuffer); }
public ModelComputer( Session session, ICompletionService completionService, CompletionTriggerInfo triggerInfo, IEnumerable<ICompletionProvider> completionProviders, bool isDebugger) { _session = session; _completionService = completionService; _options = session.Controller.SubjectBuffer.TryGetOptions(); _triggerInfo = triggerInfo; _subjectBufferCaretPosition = session.Controller.TextView.GetCaretPoint(session.Controller.SubjectBuffer).Value; _completionProviders = completionProviders; _text = _subjectBufferCaretPosition.Snapshot.AsText(); _includeBuilder = session.Controller.SubjectBuffer.GetOption(Options.EditorCompletionOptions.UseSuggestionMode); _disconnectedBufferGraph = new DisconnectedBufferGraph(session.Controller.SubjectBuffer, session.Controller.TextView.TextBuffer); }
private Model( DisconnectedBufferGraph disconnectedBufferGraph, CompletionList originalList, ImmutableArray <PresentationItem> totalItems, ImmutableArray <PresentationItem> filteredItems, PresentationItem selectedItem, ImmutableArray <CompletionItemFilter> completionItemFilters, ImmutableDictionary <CompletionItemFilter, bool> filterState, IReadOnlyDictionary <CompletionItem, string> completionItemToFilterText, bool isHardSelection, bool isUnique, bool useSuggestionMode, PresentationItem suggestionModeItem, PresentationItem defaultSuggestionModeItem, CompletionTrigger trigger, ITrackingPoint commitSpanEndPoint, bool dismissIfEmpty) { Contract.ThrowIfNull(selectedItem); Contract.ThrowIfFalse(totalItems.Length != 0, "Must have at least one item."); Contract.ThrowIfFalse(filteredItems.Length != 0, "Must have at least one filtered item."); Contract.ThrowIfFalse(filteredItems.Contains(selectedItem) || defaultSuggestionModeItem == selectedItem, "Selected item must be in filtered items."); _disconnectedBufferGraph = disconnectedBufferGraph; this.OriginalList = originalList; this.TotalItems = totalItems; this.FilteredItems = filteredItems; this.FilterState = filterState; this.SelectedItem = selectedItem; this.CompletionItemFilters = completionItemFilters; this.CompletionItemToFilterText = completionItemToFilterText; this.IsHardSelection = isHardSelection; this.IsUnique = isUnique; this.UseSuggestionMode = useSuggestionMode; this.SuggestionModeItem = suggestionModeItem; this.DefaultSuggestionModeItem = defaultSuggestionModeItem; this.Trigger = trigger; this.CommitTrackingSpanEndPoint = commitSpanEndPoint; this.DismissIfEmpty = dismissIfEmpty; }
private Model( DisconnectedBufferGraph disconnectedBufferGraph, CompletionList originalList, ImmutableArray<PresentationItem> totalItems, ImmutableArray<PresentationItem> filteredItems, PresentationItem selectedItem, ImmutableArray<CompletionItemFilter> completionItemFilters, ImmutableDictionary<CompletionItemFilter, bool> filterState, IReadOnlyDictionary<CompletionItem, string> completionItemToFilterText, bool isHardSelection, bool isUnique, bool useSuggestionMode, PresentationItem suggestionModeItem, PresentationItem defaultSuggestionModeItem, CompletionTrigger trigger, ITrackingPoint commitSpanEndPoint, bool dismissIfEmpty) { Contract.ThrowIfNull(selectedItem); Contract.ThrowIfFalse(totalItems.Length != 0, "Must have at least one item."); Contract.ThrowIfFalse(filteredItems.Length != 0, "Must have at least one filtered item."); Contract.ThrowIfFalse(filteredItems.Contains(selectedItem) || defaultSuggestionModeItem == selectedItem, "Selected item must be in filtered items."); _disconnectedBufferGraph = disconnectedBufferGraph; this.OriginalList = originalList; this.TotalItems = totalItems; this.FilteredItems = filteredItems; this.FilterState = filterState; this.SelectedItem = selectedItem; this.CompletionItemFilters = completionItemFilters; this.CompletionItemToFilterText = completionItemToFilterText; this.IsHardSelection = isHardSelection; this.IsUnique = isUnique; this.UseSuggestionMode = useSuggestionMode; this.SuggestionModeItem = suggestionModeItem; this.DefaultSuggestionModeItem = defaultSuggestionModeItem; this.Trigger = trigger; this.CommitTrackingSpanEndPoint = commitSpanEndPoint; this.DismissIfEmpty = dismissIfEmpty; }
private Model( Document triggerDocument, DisconnectedBufferGraph disconnectedBufferGraph, CompletionList originalList, ImmutableArray <CompletionItem> filteredItems, CompletionItem selectedItem, ImmutableArray <CompletionItemFilter> completionItemFilters, ImmutableDictionary <CompletionItemFilter, bool> filterState, string filterText, bool isHardSelection, bool isUnique, bool useSuggestionMode, CompletionItem suggestionModeItem, CompletionTrigger trigger, ITrackingPoint commitSpanEndPoint, bool dismissIfEmpty) { Contract.ThrowIfFalse(originalList.Items.Length != 0, "Must have at least one item."); Contract.ThrowIfNull(selectedItem); this.TriggerDocument = triggerDocument; _disconnectedBufferGraph = disconnectedBufferGraph; this.OriginalList = originalList; this.FilteredItems = filteredItems; this.FilterState = filterState; this.SelectedItem = selectedItem; this.CompletionItemFilters = completionItemFilters; this.FilterText = filterText; this.IsHardSelection = isHardSelection; this.IsUnique = isUnique; this.Trigger = trigger; this.CommitTrackingSpanEndPoint = commitSpanEndPoint; this.DismissIfEmpty = dismissIfEmpty; this.UseSuggestionMode = useSuggestionMode; this.SuggestionModeItem = suggestionModeItem ?? CreateDefaultSuggestionModeItem(); }
private Model( Document triggerDocument, DisconnectedBufferGraph disconnectedBufferGraph, CompletionList originalList, ImmutableArray<CompletionItem> filteredItems, CompletionItem selectedItem, ImmutableArray<CompletionItemFilter> completionItemFilters, ImmutableDictionary<CompletionItemFilter, bool> filterState, string filterText, bool isHardSelection, bool isUnique, bool useSuggestionMode, CompletionItem suggestionModeItem, CompletionTrigger trigger, ITrackingPoint commitSpanEndPoint, bool dismissIfEmpty) { Contract.ThrowIfFalse(originalList.Items.Length != 0, "Must have at least one item."); Contract.ThrowIfNull(selectedItem); this.TriggerDocument = triggerDocument; _disconnectedBufferGraph = disconnectedBufferGraph; this.OriginalList = originalList; this.FilteredItems = filteredItems; this.FilterState = filterState; this.SelectedItem = selectedItem; this.CompletionItemFilters = completionItemFilters; this.FilterText = filterText; this.IsHardSelection = isHardSelection; this.IsUnique = isUnique; this.Trigger = trigger; this.CommitTrackingSpanEndPoint = commitSpanEndPoint; this.DismissIfEmpty = dismissIfEmpty; this.UseSuggestionMode = useSuggestionMode; this.SuggestionModeItem = suggestionModeItem ?? CreateDefaultSuggestionModeItem(); }
public static Model CreateModel( Document triggerDocument, DisconnectedBufferGraph disconnectedBufferGraph, CompletionList originalList, bool useSuggestionMode, CompletionTrigger trigger) { var selectedItem = originalList.Items.First(); var isHardSelection = false; var isUnique = false; // Get the set of actual filters used by all the completion items // that are in the list. var actualFiltersSeen = new HashSet<CompletionItemFilter>(); foreach (var item in originalList.Items) { foreach (var filter in CompletionItemFilter.AllFilters) { if (filter.Matches(item)) { actualFiltersSeen.Add(filter); } } } // The set of filters we'll want to show the user are the filters that are actually // used by our completion items. i.e. there's no reason to show the "field" filter // if none of completion items is actually a field. var actualItemFilters = CompletionItemFilter.AllFilters.Where(actualFiltersSeen.Contains) .ToImmutableArray(); // By default we do not filter anything out. ImmutableDictionary<CompletionItemFilter, bool> filterState = null; return new Model( triggerDocument, disconnectedBufferGraph, originalList, originalList.Items, selectedItem, actualItemFilters, filterState, "", isHardSelection, isUnique, useSuggestionMode, originalList.SuggestionModeItem, trigger, GetDefaultTrackingSpanEnd(originalList.Span, disconnectedBufferGraph), originalList.Rules.DismissIfEmpty); }
public static Model CreateModel( DisconnectedBufferGraph disconnectedBufferGraph, TextSpan defaultTrackingSpanInSubjectBuffer, ImmutableArray <CompletionItem> totalItems, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionTriggerInfo triggerInfo, ICompletionService completionService, Workspace workspace) { var updatedTotalItems = totalItems; CompletionItem updatedSelectedItem = selectedItem; CompletionItem updatedBuilder = builder; CompletionItem updatedDefaultBuilder = GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer); // Get the set of actual filters used by all the completion items // that are in the list. var actualFiltersSeen = new HashSet <CompletionItemFilter>(); foreach (var item in totalItems) { foreach (var filter in item.Filters) { actualFiltersSeen.Add(filter); } } // The set of filters we'll want to show the user are the filters that are actually // used by our completion items. i.e. there's no reason to show the "field" filter // if none of completion items is actually a field. var actualItemFilters = CompletionItemFilter.AllFilters.Where(actualFiltersSeen.Contains) .ToImmutableArray(); // By default we do not filter anything out. ImmutableDictionary <CompletionItemFilter, bool> filterState = null; if (completionService != null && workspace != null && workspace.Kind != WorkspaceKind.Interactive && // TODO (https://github.com/dotnet/roslyn/issues/5107): support in interactive workspace.Options.GetOption(InternalFeatureOnOffOptions.Snippets) && triggerInfo.TriggerReason != CompletionTriggerReason.Snippets) { // In order to add snippet expansion notes to completion item descriptions, update // all of the provided CompletionItems to DescriptionModifyingCompletionItem which will proxy // requests to the original completion items and add the snippet expansion note to // the description if necessary. We won't do this if the list was triggered to show // snippet shortcuts. var updatedTotalItemsBuilder = ImmutableArray.CreateBuilder <CompletionItem>(); updatedSelectedItem = null; foreach (var item in totalItems) { var updatedItem = new DescriptionModifyingCompletionItem(item, completionService, workspace); updatedTotalItemsBuilder.Add(updatedItem); if (item == selectedItem) { updatedSelectedItem = updatedItem; } } updatedTotalItems = updatedTotalItemsBuilder.AsImmutable(); updatedBuilder = null; if (builder != null) { updatedBuilder = new DescriptionModifyingCompletionItem(builder, completionService, workspace); } updatedDefaultBuilder = new DescriptionModifyingCompletionItem( GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer), completionService, workspace); } var completionItemToFilterText = new Dictionary <CompletionItem, string>(); return(new Model( disconnectedBufferGraph, updatedTotalItems, updatedTotalItems, updatedSelectedItem, actualItemFilters, filterState, completionItemToFilterText, isHardSelection, isUnique, useSuggestionCompletionMode, updatedBuilder, updatedDefaultBuilder, triggerInfo, GetDefaultTrackingSpanEnd(defaultTrackingSpanInSubjectBuffer, disconnectedBufferGraph), completionService.DismissIfEmpty)); }
public static Model CreateModel( DisconnectedBufferGraph disconnectedBufferGraph, TextSpan defaultTrackingSpanInSubjectBuffer, IList<CompletionItem> totalItems, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionTriggerInfo triggerInfo, ICompletionService completionService, Workspace workspace) { var updatedTotalItems = totalItems; CompletionItem updatedSelectedItem = selectedItem; CompletionItem updatedBuilder = builder; CompletionItem updatedDefaultBuilder = GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer); if (completionService != null && workspace != null && triggerInfo.TriggerReason != CompletionTriggerReason.Snippets) { // In order to add snippet expansion notes to completion item descriptions, update // all of the provided CompletionItems to DisplayCompletionItems which will proxy // requests to the original completion items and add the snippet expansion note to // the description if necessary. We won't do this if the list was triggered to show // snippet shorcuts. updatedTotalItems = new List<CompletionItem>(); updatedSelectedItem = null; foreach (var item in totalItems) { var updatedItem = new DescriptionModifyingCompletionItem(item, completionService, workspace); updatedTotalItems.Add(updatedItem); if (item == selectedItem) { updatedSelectedItem = updatedItem; } } updatedBuilder = null; if (builder != null) { updatedBuilder = new DescriptionModifyingCompletionItem(builder, completionService, workspace); } updatedDefaultBuilder = new DescriptionModifyingCompletionItem( GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer), completionService, workspace); } return new Model( disconnectedBufferGraph, updatedTotalItems, updatedTotalItems, updatedSelectedItem, isHardSelection, isUnique, useSuggestionCompletionMode, updatedBuilder, updatedDefaultBuilder, triggerInfo, GetDefaultTrackingSpanEnd(defaultTrackingSpanInSubjectBuffer, disconnectedBufferGraph), completionService.DismissIfEmpty); }
public static Model CreateModel( DisconnectedBufferGraph disconnectedBufferGraph, CompletionList originalList, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionMode, CompletionTrigger trigger, CompletionService completionService, Workspace workspace) { ImmutableArray <PresentationItem> totalItems; CompletionItem suggestionModeItem = originalList.SuggestionModeItem; PresentationItem suggestionModePresentationItem; PresentationItem defaultSuggestionModePresentationItem; // Get the set of actual filters used by all the completion items // that are in the list. var actualFiltersSeen = new HashSet <CompletionItemFilter>(); foreach (var item in originalList.Items) { foreach (var filter in CompletionItemFilter.AllFilters) { if (filter.Matches(item)) { actualFiltersSeen.Add(filter); } } } // The set of filters we'll want to show the user are the filters that are actually // used by our completion items. i.e. there's no reason to show the "field" filter // if none of completion items is actually a field. var actualItemFilters = CompletionItemFilter.AllFilters.Where(actualFiltersSeen.Contains) .ToImmutableArray(); // By default we do not filter anything out. ImmutableDictionary <CompletionItemFilter, bool> filterState = null; if (completionService != null && workspace != null && workspace.Kind != WorkspaceKind.Interactive && // TODO (https://github.com/dotnet/roslyn/issues/5107): support in interactive workspace.Options.GetOption(InternalFeatureOnOffOptions.Snippets) && trigger.Kind != CompletionTriggerKind.Snippets) { // In order to add snippet expansion notes to completion item descriptions, update // all of the provided CompletionItems to DescriptionModifyingCompletionItem which will proxy // requests to the original completion items and add the snippet expansion note to // the description if necessary. We won't do this if the list was triggered to show // snippet shortcuts. var totalItemsBuilder = ImmutableArray.CreateBuilder <PresentationItem>(); foreach (var item in originalList.Items) { totalItemsBuilder.Add(new DescriptionModifyingPresentationItem(item, completionService)); } totalItems = totalItemsBuilder.AsImmutable(); defaultSuggestionModePresentationItem = new DescriptionModifyingPresentationItem(CreateDefaultSuggestionModeItem(originalList.DefaultSpan), completionService, isSuggestionModeItem: true); suggestionModePresentationItem = suggestionModeItem != null ? new DescriptionModifyingPresentationItem(suggestionModeItem, completionService, isSuggestionModeItem: true) : null; } else { totalItems = originalList.Items.Select(item => new SimplePresentationItem(item, completionService)).ToImmutableArray <PresentationItem>(); defaultSuggestionModePresentationItem = new SimplePresentationItem(CreateDefaultSuggestionModeItem(originalList.DefaultSpan), completionService, isSuggestionModeItem: true); suggestionModePresentationItem = suggestionModeItem != null ? new SimplePresentationItem(suggestionModeItem, completionService, isSuggestionModeItem: true) : null; } var selectedPresentationItem = totalItems.FirstOrDefault(it => it.Item == selectedItem); var completionItemToFilterText = new Dictionary <CompletionItem, string>(); return(new Model( disconnectedBufferGraph, originalList, totalItems, totalItems, selectedPresentationItem, actualItemFilters, filterState, completionItemToFilterText, isHardSelection, isUnique, useSuggestionMode, suggestionModePresentationItem, defaultSuggestionModePresentationItem, trigger, GetDefaultTrackingSpanEnd(originalList.DefaultSpan, disconnectedBufferGraph), originalList.Rules.DismissIfEmpty)); }
private static ITrackingPoint GetDefaultTrackingSpanEnd( TextSpan defaultTrackingSpanInSubjectBuffer, DisconnectedBufferGraph disconnectedBufferGraph) { var viewSpan = disconnectedBufferGraph.GetSubjectBufferTextSpanInViewBuffer(defaultTrackingSpanInSubjectBuffer); return disconnectedBufferGraph.ViewSnapshot.Version.CreateTrackingPoint( viewSpan.TextSpan.End, PointTrackingMode.Positive); }
public static Model CreateModel( DisconnectedBufferGraph disconnectedBufferGraph, TextSpan defaultTrackingSpanInSubjectBuffer, ImmutableArray<CompletionItem> totalItems, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionTriggerInfo triggerInfo, ICompletionService completionService, Workspace workspace) { var updatedTotalItems = totalItems; CompletionItem updatedSelectedItem = selectedItem; CompletionItem updatedBuilder = builder; CompletionItem updatedDefaultBuilder = GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer); // Get the set of actual filters used by all the completion items // that are in the list. var actualFiltersSeen = new HashSet<CompletionItemFilter>(); foreach (var item in totalItems) { foreach (var filter in item.Filters) { actualFiltersSeen.Add(filter); } } // The set of filters we'll want to show the user are the filters that are actually // used by our completion items. i.e. there's no reason to show the "field" filter // if none of completion items is actually a field. var actualItemFilters = CompletionItemFilter.AllFilters.Where(actualFiltersSeen.Contains) .ToImmutableArray(); // By default we do not filter anything out. ImmutableDictionary<CompletionItemFilter, bool> filterState = null; if (completionService != null && workspace != null && workspace.Kind != WorkspaceKind.Interactive && // TODO (https://github.com/dotnet/roslyn/issues/5107): support in interactive workspace.Options.GetOption(InternalFeatureOnOffOptions.Snippets) && triggerInfo.TriggerReason != CompletionTriggerReason.Snippets) { // In order to add snippet expansion notes to completion item descriptions, update // all of the provided CompletionItems to DescriptionModifyingCompletionItem which will proxy // requests to the original completion items and add the snippet expansion note to // the description if necessary. We won't do this if the list was triggered to show // snippet shortcuts. var updatedTotalItemsBuilder = ImmutableArray.CreateBuilder<CompletionItem>(); updatedSelectedItem = null; foreach (var item in totalItems) { var updatedItem = new DescriptionModifyingCompletionItem(item, completionService, workspace); updatedTotalItemsBuilder.Add(updatedItem); if (item == selectedItem) { updatedSelectedItem = updatedItem; } } updatedTotalItems = updatedTotalItemsBuilder.AsImmutable(); updatedBuilder = null; if (builder != null) { updatedBuilder = new DescriptionModifyingCompletionItem(builder, completionService, workspace); } updatedDefaultBuilder = new DescriptionModifyingCompletionItem( GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer), completionService, workspace); } var completionItemToFilterText= new Dictionary<CompletionItem, string>(); return new Model( disconnectedBufferGraph, updatedTotalItems, updatedTotalItems, updatedSelectedItem, actualItemFilters, filterState, completionItemToFilterText, isHardSelection, isUnique, useSuggestionCompletionMode, updatedBuilder, updatedDefaultBuilder, triggerInfo, GetDefaultTrackingSpanEnd(defaultTrackingSpanInSubjectBuffer, disconnectedBufferGraph), completionService.DismissIfEmpty); }
public static Model CreateModel( DisconnectedBufferGraph disconnectedBufferGraph, TextSpan defaultTrackingSpanInSubjectBuffer, ImmutableArray<CompletionItem> totalItems, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionTriggerInfo triggerInfo, ICompletionService completionService, Workspace workspace) { var updatedTotalItems = totalItems; CompletionItem updatedSelectedItem = selectedItem; CompletionItem updatedBuilder = builder; CompletionItem updatedDefaultBuilder = GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer); if (completionService != null && workspace != null && workspace.Kind != WorkspaceKind.Interactive && // TODO (https://github.com/dotnet/roslyn/issues/5107): support in interactive workspace.Options.GetOption(InternalFeatureOnOffOptions.Snippets) && triggerInfo.TriggerReason != CompletionTriggerReason.Snippets) { // In order to add snippet expansion notes to completion item descriptions, update // all of the provided CompletionItems to DescriptionModifyingCompletionItem which will proxy // requests to the original completion items and add the snippet expansion note to // the description if necessary. We won't do this if the list was triggered to show // snippet shortcuts. var updatedTotalItemsBuilder = ImmutableArray.CreateBuilder<CompletionItem>(); updatedSelectedItem = null; foreach (var item in totalItems) { var updatedItem = new DescriptionModifyingCompletionItem(item, completionService, workspace); updatedTotalItemsBuilder.Add(updatedItem); if (item == selectedItem) { updatedSelectedItem = updatedItem; } } updatedTotalItems = updatedTotalItemsBuilder.AsImmutable(); updatedBuilder = null; if (builder != null) { updatedBuilder = new DescriptionModifyingCompletionItem(builder, completionService, workspace); } updatedDefaultBuilder = new DescriptionModifyingCompletionItem( GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer), completionService, workspace); } return new Model( disconnectedBufferGraph, updatedTotalItems, updatedTotalItems, updatedSelectedItem, isHardSelection, isUnique, useSuggestionCompletionMode, updatedBuilder, updatedDefaultBuilder, triggerInfo, GetDefaultTrackingSpanEnd(defaultTrackingSpanInSubjectBuffer, disconnectedBufferGraph), completionService.DismissIfEmpty); }
public static Model CreateModel( DisconnectedBufferGraph disconnectedBufferGraph, TextSpan defaultTrackingSpanInSubjectBuffer, IList <CompletionItem> totalItems, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionTriggerInfo triggerInfo, ICompletionService completionService, Workspace workspace) { var updatedTotalItems = totalItems; CompletionItem updatedSelectedItem = selectedItem; CompletionItem updatedBuilder = builder; CompletionItem updatedDefaultBuilder = GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer); if (completionService != null && workspace != null && triggerInfo.TriggerReason != CompletionTriggerReason.Snippets) { // In order to add snippet expansion notes to completion item descriptions, update // all of the provided CompletionItems to DisplayCompletionItems which will proxy // requests to the original completion items and add the snippet expansion note to // the description if necessary. We won't do this if the list was triggered to show // snippet shorcuts. updatedTotalItems = new List <CompletionItem>(); updatedSelectedItem = null; foreach (var item in totalItems) { var updatedItem = new DescriptionModifyingCompletionItem(item, completionService, workspace); updatedTotalItems.Add(updatedItem); if (item == selectedItem) { updatedSelectedItem = updatedItem; } } updatedBuilder = null; if (builder != null) { updatedBuilder = new DescriptionModifyingCompletionItem(builder, completionService, workspace); } updatedDefaultBuilder = new DescriptionModifyingCompletionItem( GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer), completionService, workspace); } return(new Model( disconnectedBufferGraph, updatedTotalItems, updatedTotalItems, updatedSelectedItem, isHardSelection, isUnique, useSuggestionCompletionMode, updatedBuilder, updatedDefaultBuilder, triggerInfo, GetDefaultTrackingSpanEnd(defaultTrackingSpanInSubjectBuffer, disconnectedBufferGraph), completionService.DismissIfEmpty)); }
public static Model CreateModel( DisconnectedBufferGraph disconnectedBufferGraph, TextSpan defaultTrackingSpanInSubjectBuffer, ImmutableArray <CompletionItem> totalItems, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionCompletionMode, CompletionItem builder, CompletionTriggerInfo triggerInfo, ICompletionService completionService, Workspace workspace) { var updatedTotalItems = totalItems; CompletionItem updatedSelectedItem = selectedItem; CompletionItem updatedBuilder = builder; CompletionItem updatedDefaultBuilder = GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer); if (completionService != null && workspace != null && workspace.Kind != WorkspaceKind.Interactive && // TODO (https://github.com/dotnet/roslyn/issues/5107): support in interactive workspace.Options.GetOption(InternalFeatureOnOffOptions.Snippets) && triggerInfo.TriggerReason != CompletionTriggerReason.Snippets) { // In order to add snippet expansion notes to completion item descriptions, update // all of the provided CompletionItems to DescriptionModifyingCompletionItem which will proxy // requests to the original completion items and add the snippet expansion note to // the description if necessary. We won't do this if the list was triggered to show // snippet shortcuts. var updatedTotalItemsBuilder = ImmutableArray.CreateBuilder <CompletionItem>(); updatedSelectedItem = null; foreach (var item in totalItems) { var updatedItem = new DescriptionModifyingCompletionItem(item, completionService, workspace); updatedTotalItemsBuilder.Add(updatedItem); if (item == selectedItem) { updatedSelectedItem = updatedItem; } } updatedTotalItems = updatedTotalItemsBuilder.AsImmutable(); updatedBuilder = null; if (builder != null) { updatedBuilder = new DescriptionModifyingCompletionItem(builder, completionService, workspace); } updatedDefaultBuilder = new DescriptionModifyingCompletionItem( GetDefaultBuilder(defaultTrackingSpanInSubjectBuffer), completionService, workspace); } return(new Model( disconnectedBufferGraph, updatedTotalItems, updatedTotalItems, updatedSelectedItem, isHardSelection, isUnique, useSuggestionCompletionMode, updatedBuilder, updatedDefaultBuilder, triggerInfo, GetDefaultTrackingSpanEnd(defaultTrackingSpanInSubjectBuffer, disconnectedBufferGraph), completionService.DismissIfEmpty)); }
private async Task<Model> ComputeModelInBackgroundAsync( Model currentModel, IList<ISignatureHelpProvider> matchedProviders, IList<ISignatureHelpProvider> unmatchedProviders, SnapshotPoint caretPosition, DisconnectedBufferGraph disconnectedBufferGraph, SignatureHelpTriggerInfo triggerInfo, CancellationToken cancellationToken) { try { using (Logger.LogBlock(FunctionId.SignatureHelp_ModelComputation_ComputeModelInBackground, cancellationToken)) { AssertIsBackground(); cancellationToken.ThrowIfCancellationRequested(); var document = await Controller.DocumentProvider.GetDocumentAsync(caretPosition.Snapshot, cancellationToken).ConfigureAwait(false); if (document == null) { return currentModel; } if (triggerInfo.TriggerReason == SignatureHelpTriggerReason.RetriggerCommand) { if (currentModel == null || (triggerInfo.TriggerCharacter.HasValue && !currentModel.Provider.IsRetriggerCharacter(triggerInfo.TriggerCharacter.Value))) { return currentModel; } } // first try to query the providers that can trigger on the specified character var result = await ComputeItemsAsync(matchedProviders, caretPosition, triggerInfo, document, cancellationToken).ConfigureAwait(false); var provider = result.Item1; var items = result.Item2; if (provider == null) { // no match, so now query the other providers result = await ComputeItemsAsync(unmatchedProviders, caretPosition, triggerInfo, document, cancellationToken).ConfigureAwait(false); provider = result.Item1; items = result.Item2; if (provider == null) { // the other providers didn't produce items either, so we don't produce a model return null; } } if (currentModel != null && currentModel.Provider == provider && currentModel.GetCurrentSpanInSubjectBuffer(disconnectedBufferGraph.SubjectBufferSnapshot).Span.Start == items.ApplicableSpan.Start && currentModel.ArgumentIndex == items.ArgumentIndex && currentModel.ArgumentCount == items.ArgumentCount && currentModel.ArgumentName == items.ArgumentName) { // The new model is the same as the current model. Return the currentModel // so we keep the active selection. return currentModel; } var selectedItem = GetSelectedItem(currentModel, items, provider); var model = new Model(disconnectedBufferGraph, items.ApplicableSpan, provider, items.Items, selectedItem, items.ArgumentIndex, items.ArgumentCount, items.ArgumentName, selectedParameter: 0); var syntaxFactsService = document.GetLanguageService<ISyntaxFactsService>(); var isCaseSensitive = syntaxFactsService == null || syntaxFactsService.IsCaseSensitive; var selection = DefaultSignatureHelpSelector.GetSelection(model.Items, model.SelectedItem, model.ArgumentIndex, model.ArgumentCount, model.ArgumentName, isCaseSensitive); return model.WithSelectedItem(selection.SelectedItem) .WithSelectedParameter(selection.SelectedParameter); } } catch (Exception e) when (FatalError.ReportUnlessCanceled(e)) { throw ExceptionUtilities.Unreachable; } }
private async Task <Model> ComputeModelInBackgroundAsync( Model currentModel, ImmutableArray <ISignatureHelpProvider> providers, SnapshotPoint caretPosition, DisconnectedBufferGraph disconnectedBufferGraph, SignatureHelpTriggerInfo triggerInfo, CancellationToken cancellationToken) { try { using (Logger.LogBlock(FunctionId.SignatureHelp_ModelComputation_ComputeModelInBackground, cancellationToken)) { AssertIsBackground(); cancellationToken.ThrowIfCancellationRequested(); var document = Controller.DocumentProvider.GetDocument(caretPosition.Snapshot, cancellationToken); if (document == null) { return(currentModel); } if (triggerInfo.TriggerReason == SignatureHelpTriggerReason.RetriggerCommand) { if (currentModel == null) { return(null); } if (triggerInfo.TriggerCharacter.HasValue && !currentModel.Provider.IsRetriggerCharacter(triggerInfo.TriggerCharacter.Value)) { return(currentModel); } } // first try to query the providers that can trigger on the specified character var(provider, items) = await ComputeItemsAsync( providers, caretPosition, triggerInfo, document, cancellationToken).ConfigureAwait(false); if (provider == null) { // No provider produced items. So we can't produce a model return(null); } if (currentModel != null && currentModel.Provider == provider && currentModel.GetCurrentSpanInSubjectBuffer(disconnectedBufferGraph.SubjectBufferSnapshot).Span.Start == items.ApplicableSpan.Start && currentModel.Items.IndexOf(currentModel.SelectedItem) == items.SelectedItemIndex && currentModel.ArgumentIndex == items.ArgumentIndex && currentModel.ArgumentCount == items.ArgumentCount && currentModel.ArgumentName == items.ArgumentName) { // The new model is the same as the current model. Return the currentModel // so we keep the active selection. return(currentModel); } var selectedItem = GetSelectedItem(currentModel, items, provider, out var userSelected); var model = new Model(disconnectedBufferGraph, items.ApplicableSpan, provider, items.Items, selectedItem, items.ArgumentIndex, items.ArgumentCount, items.ArgumentName, selectedParameter: 0, userSelected); var syntaxFactsService = document.GetLanguageService <ISyntaxFactsService>(); var isCaseSensitive = syntaxFactsService == null || syntaxFactsService.IsCaseSensitive; var selection = DefaultSignatureHelpSelector.GetSelection(model.Items, model.SelectedItem, model.UserSelected, model.ArgumentIndex, model.ArgumentCount, model.ArgumentName, isCaseSensitive); return(model.WithSelectedItem(selection.SelectedItem, selection.UserSelected) .WithSelectedParameter(selection.SelectedParameter)); } } catch (Exception e) when(FatalError.ReportUnlessCanceled(e)) { throw ExceptionUtilities.Unreachable; } }
public static Model CreateModel( Document triggerDocument, DisconnectedBufferGraph disconnectedBufferGraph, CompletionList originalList, CompletionItem selectedItem, bool isHardSelection, bool isUnique, bool useSuggestionMode, CompletionTrigger trigger, CompletionService completionService, Workspace workspace) { ImmutableArray<PresentationItem> totalItems; CompletionItem suggestionModeItem = originalList.SuggestionModeItem; PresentationItem suggestionModePresentationItem; PresentationItem defaultSuggestionModePresentationItem; // Get the set of actual filters used by all the completion items // that are in the list. var actualFiltersSeen = new HashSet<CompletionItemFilter>(); foreach (var item in originalList.Items) { foreach (var filter in CompletionItemFilter.AllFilters) { if (filter.Matches(item)) { actualFiltersSeen.Add(filter); } } } // The set of filters we'll want to show the user are the filters that are actually // used by our completion items. i.e. there's no reason to show the "field" filter // if none of completion items is actually a field. var actualItemFilters = CompletionItemFilter.AllFilters.Where(actualFiltersSeen.Contains) .ToImmutableArray(); // By default we do not filter anything out. ImmutableDictionary<CompletionItemFilter, bool> filterState = null; if (completionService != null && workspace != null && workspace.Kind != WorkspaceKind.Interactive && // TODO (https://github.com/dotnet/roslyn/issues/5107): support in interactive workspace.Options.GetOption(InternalFeatureOnOffOptions.Snippets) && trigger.Kind != CompletionTriggerKind.Snippets) { // In order to add snippet expansion notes to completion item descriptions, update // all of the provided CompletionItems to DescriptionModifyingCompletionItem which will proxy // requests to the original completion items and add the snippet expansion note to // the description if necessary. We won't do this if the list was triggered to show // snippet shortcuts. var totalItemsBuilder = ArrayBuilder<PresentationItem>.GetInstance(); foreach (var item in originalList.Items) { totalItemsBuilder.Add(new DescriptionModifyingPresentationItem(item, completionService)); } totalItems = totalItemsBuilder.ToImmutableAndFree(); defaultSuggestionModePresentationItem = new DescriptionModifyingPresentationItem( CreateDefaultSuggestionModeItem(), completionService, isSuggestionModeItem: true); suggestionModePresentationItem = suggestionModeItem != null ? new DescriptionModifyingPresentationItem(suggestionModeItem, completionService, isSuggestionModeItem: true) : null; } else { totalItems = originalList.Items.Select(item => new SimplePresentationItem(item, completionService)).ToImmutableArray<PresentationItem>(); defaultSuggestionModePresentationItem = new SimplePresentationItem(CreateDefaultSuggestionModeItem(), completionService, isSuggestionModeItem: true); suggestionModePresentationItem = suggestionModeItem != null ? new SimplePresentationItem(suggestionModeItem, completionService, isSuggestionModeItem: true) : null; } var selectedPresentationItem = totalItems.FirstOrDefault(it => it.Item == selectedItem); return new Model( triggerDocument, disconnectedBufferGraph, originalList, totalItems, totalItems, selectedPresentationItem, actualItemFilters, filterState, "", isHardSelection, isUnique, useSuggestionMode, suggestionModePresentationItem, defaultSuggestionModePresentationItem, trigger, GetDefaultTrackingSpanEnd(originalList.Span, disconnectedBufferGraph), originalList.Rules.DismissIfEmpty); }