From 10ef7cf121326c4783ee6818619db17055112403 Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Sun, 24 Jul 2016 17:57:09 -0700 Subject: [PATCH] Trim common path elements for C#/VB find references, just like we do for TypeScript. --- .../LibraryManager_FindReferences.cs | 23 +++++++++++++++---- .../LibraryManager_GoToDefinition.cs | 10 +++++--- .../TreeItems/SourceReferenceTreeItem.cs | 4 +++- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_FindReferences.cs b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_FindReferences.cs index c1843256606..bfd4d568048 100644 --- a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_FindReferences.cs +++ b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_FindReferences.cs @@ -21,12 +21,19 @@ public void PresentReferencedSymbols(string title, Solution solution, IEnumerabl } // internal for test purposes - internal IList CreateFindReferencesItems(Solution solution, IEnumerable referencedSymbols) + internal IList CreateFindReferencesItems( + Solution solution, IEnumerable referencedSymbols) { var definitions = new List(); var uniqueLocations = new HashSet>(); var symbolNavigationService = solution.Workspace.Services.GetService(); + var documents = referencedSymbols.SelectMany(s => s.Locations) + .Select(loc => loc.Document) + .WhereNotNull() + .ToSet(); + var commonPathElements = CountCommonPathElements(documents); + referencedSymbols = referencedSymbols.FilterToItemsToShow().ToList(); foreach (var referencedSymbol in referencedSymbols.OrderBy(GetDefinitionPrecedence)) @@ -56,7 +63,10 @@ internal IList CreateFindReferencesItems(Solution solution, IE { definitions.Add(definitionItem); - var referenceItems = CreateReferenceItems(solution, uniqueLocations, referencedSymbol.Locations.Select(loc => loc.Location)); + var referenceItems = CreateReferenceItems( + solution, uniqueLocations, + referencedSymbol.Locations.Select(loc => loc.Location), + commonPathElements); definitionItem.Children.AddRange(referenceItems); definitionItem.SetReferenceCount(referenceItems.Count); } @@ -136,7 +146,11 @@ private int GetDefinitionPrecedence(ReferencedSymbol referencedSymbol) return new SourceDefinitionTreeItem(document, sourceSpan, referencedSymbol.Definition, glyph.GetGlyphIndex()); } - private IList CreateReferenceItems(Solution solution, HashSet> uniqueLocations, IEnumerable locations) + private IList CreateReferenceItems( + Solution solution, + HashSet> uniqueLocations, + IEnumerable locations, + int commonPathElements) { var referenceItems = new List(); foreach (var location in locations) @@ -155,7 +169,8 @@ private IList CreateReferenceItems(Solution solution, H if (uniqueLocations.Add(new ValueTuple(document, sourceSpan))) { - referenceItems.Add(new SourceReferenceTreeItem(document, sourceSpan, Glyph.Reference.GetGlyphIndex())); + referenceItems.Add(new SourceReferenceTreeItem( + document, sourceSpan, Glyph.Reference.GetGlyphIndex(), commonPathElements)); } } diff --git a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_GoToDefinition.cs b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_GoToDefinition.cs index 3f10cead903..4d2a5c30f26 100644 --- a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_GoToDefinition.cs +++ b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_GoToDefinition.cs @@ -1,6 +1,5 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; @@ -32,10 +31,15 @@ private IList CreateNavigableItemTreeItems(IEnumerable documents) + private int CountCommonPathElements(ISet documents) { - Debug.Assert(documents.Count > 0); + if (documents.Count == 0) + { + return 0; + } + var commonPathElements = 0; + for (var index = 0; ; index++) { var pathPortion = GetPathPortion(documents.First(), index); diff --git a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/SourceReferenceTreeItem.cs b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/SourceReferenceTreeItem.cs index e8feff5b255..ff43877e11b 100644 --- a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/SourceReferenceTreeItem.cs +++ b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/SourceReferenceTreeItem.cs @@ -9,7 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Library.FindRes { internal class SourceReferenceTreeItem : AbstractSourceTreeItem, IComparable { - public SourceReferenceTreeItem(Document document, TextSpan sourceSpan, ushort glyphIndex, int commonPathElements = 0, string displayText = null, bool includeFileLocation = false) + public SourceReferenceTreeItem( + Document document, TextSpan sourceSpan, ushort glyphIndex, int commonPathElements, + string displayText = null, bool includeFileLocation = false) : base(document, sourceSpan, glyphIndex, commonPathElements) { if (displayText != null && !includeFileLocation) -- GitLab