public void Convert_DataTrue_RemovesDataFromItems() { // Arrange var dataObject = new JObject() { ["resultId"] = 123 }; var completionList = new CompletionList( new CompletionItem() { Label = "Test", Data = dataObject, }); var capabilities = new VSCompletionListCapability() { Data = true, }; // Act var vsCompletionList = VSCompletionList.Convert(completionList, capabilities); // Assert Assert.Collection(vsCompletionList.Items, item => Assert.Null(item.Data)); Assert.Same(dataObject, vsCompletionList.Data); }
public void Convert_DataFalse_DoesNotTouchData() { // Arrange var dataObject = new JObject() { ["resultId"] = 123 }; var completionList = new CompletionList( new CompletionItem() { Label = "Test", Data = dataObject, }); var capabilities = new VSCompletionListCapability() { Data = false, }; // Act var vsCompletionList = VSCompletionList.Convert(completionList, capabilities); // Assert Assert.Collection(vsCompletionList.Items, item => Assert.Same(dataObject, item.Data)); Assert.Null(vsCompletionList.Data); }
private static VSCompletionList PromotedDataOntoList(VSCompletionList completionList) { // This piece makes a massive assumption that all completion items will have a resultId associated with them and their // data properties will all be the same. Therefore, we can inspect the first item and empty out the rest. var commonDataItem = completionList.FirstOrDefault(); if (commonDataItem is null) { // No common data items, nothing to do return(completionList); } var promotedCompletionItems = new List <CompletionItem>(); foreach (var completionItem in completionList.Items) { var clearedCompletionItem = completionItem with { Data = null }; promotedCompletionItems.Add(clearedCompletionItem); } var promotedCompletionList = new VSCompletionList(promotedCompletionItems, completionList.IsIncomplete) { CommitCharacters = completionList.CommitCharacters, Data = commonDataItem.Data, }; return(promotedCompletionList); } }
private static VSCompletionList PromoteCommonCommitCharactersOntoList(VSCompletionList completionList) { var commitCharacterReferences = new Dictionary <object, int>(); var highestUsedCount = 0; Container <string> mostUsedCommitCharacters = null; foreach (var completionItem in completionList.Items) { var commitCharacters = completionItem.CommitCharacters; if (commitCharacters == null) { continue; } commitCharacterReferences.TryGetValue(commitCharacters, out var existingCount); existingCount++; if (existingCount > highestUsedCount) { // Capture the most used commit character counts so we don't need to re-iterate the array later mostUsedCommitCharacters = commitCharacters; highestUsedCount = existingCount; } commitCharacterReferences[commitCharacters] = existingCount; } // Promote the most used commit characters onto the list and remove duplicates from child items. var promotedCompletionItems = new List <CompletionItem>(); foreach (var completionItem in completionList.Items) { if (completionItem.CommitCharacters == mostUsedCommitCharacters) { var clearedCompletionItem = completionItem with { CommitCharacters = null }; promotedCompletionItems.Add(clearedCompletionItem); } else { promotedCompletionItems.Add(completionItem); } } var promotedCompletionList = new VSCompletionList(promotedCompletionItems, completionList.IsIncomplete) { CommitCharacters = mostUsedCommitCharacters, Data = completionList.Data, }; return(promotedCompletionList); }
public static VSCompletionList Convert(CompletionList completionList, VSCompletionListCapability vsCompletionListCapability) { var vsCompletionList = new VSCompletionList(completionList); if (vsCompletionListCapability.CommitCharacters) { PromoteCommonCommitCharactersOntoList(vsCompletionList); } if (vsCompletionListCapability.Data) { PromotedDataOntoList(vsCompletionList); } return(vsCompletionList); }
private static void PromotedDataOntoList(VSCompletionList completionList) { // This piece makes a massive assumption that all completion items will have a resultId associated with them and their // data properties will all be the same. Therefore, we can inspect the first item and empty out the rest. var commonDataItem = completionList.FirstOrDefault(); if (commonDataItem is null) { // Empty list return; } completionList.Data = commonDataItem.Data; foreach (var completionItem in completionList.Items) { completionItem.Data = null; } }
public void Convert_CommitCharactersFalse_DoesNotTouchCommitCharacters() { // Arrange var commitCharacters = new Container <string>("<"); var completionList = new CompletionList( new CompletionItem() { Label = "Test", CommitCharacters = commitCharacters }); var capabilities = new VSCompletionListCapability() { CommitCharacters = false, }; // Act var vsCompletionList = VSCompletionList.Convert(completionList, capabilities); // Assert Assert.Collection(vsCompletionList.Items, item => Assert.Equal(commitCharacters, item.CommitCharacters)); Assert.Null(vsCompletionList.CommitCharacters); }
private static void PromoteCommonCommitCharactersOntoList(VSCompletionList completionList) { var commitCharacterReferences = new Dictionary <object, int>(); var highestUsedCount = 0; Container <string> mostUsedCommitCharacters = null; foreach (var completionItem in completionList.Items) { var commitCharacters = completionItem.CommitCharacters; if (commitCharacters == null) { continue; } commitCharacterReferences.TryGetValue(commitCharacters, out var existingCount); existingCount++; if (existingCount > highestUsedCount) { // Capture the most used commit character counts so we don't need to re-iterate the array later mostUsedCommitCharacters = commitCharacters; highestUsedCount = existingCount; } commitCharacterReferences[commitCharacters] = existingCount; } // Promoted the most used commit characters onto the list and then remove these from child items. completionList.CommitCharacters = mostUsedCommitCharacters; foreach (var completionItem in completionList.Items) { if (completionItem.CommitCharacters == completionList.CommitCharacters) { completionItem.CommitCharacters = null; } } }
public OptimizedVSCompletionList(VSCompletionList completionList) : base(completionList) { CommitCharacters = completionList.CommitCharacters; Data = completionList.Data; }