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);
        }
Exemple #3
0
        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);
        }
    }
Exemple #4
0
        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;
                }
            }
        }
Exemple #9
0
 public OptimizedVSCompletionList(VSCompletionList completionList) : base(completionList)
 {
     CommitCharacters = completionList.CommitCharacters;
     Data             = completionList.Data;
 }