From 01351b1d6e4609a36bca4dc4db2936233b3c0bba Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Mon, 25 Jul 2016 00:45:28 -0700 Subject: [PATCH] Simplify how we display reference counts for find-ref items. --- .../LibraryManager_FindReferences.cs | 45 +++++++++---------- .../LibraryManager_GoToDefinition.cs | 1 - .../FindResults/TreeItems/AbstractTreeItem.cs | 6 +-- ...itionTreeItem.cs => DefinitionTreeItem.cs} | 45 +++++++++++++------ .../Core/Def/ServicesVisualStudio.csproj | 2 +- 5 files changed, 55 insertions(+), 44 deletions(-) rename src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/{SourceDefinitionTreeItem.cs => DefinitionTreeItem.cs} (55%) 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 8015c42e073..31ad687b14f 100644 --- a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_FindReferences.cs +++ b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_FindReferences.cs @@ -31,51 +31,50 @@ public void PresentDefinitionsAndReferences(DefinitionsAndReferences definitions var query = from d in definitionsAndReferences.Definitions from i in CreateDefinitionItems(d, definitionsAndReferences, commonPathElements) - select i; + select (AbstractTreeItem)i; return query.ToList(); } - private IEnumerable CreateDefinitionItems( + private ImmutableArray CreateDefinitionItems( DefinitionItem definitionItem, DefinitionsAndReferences definitionsAndReferences, int commonPathElements) { - // Each definition item may end up as several top nodes (because of partials). - // Add the references to the last item actually in the list. - var definitionTreeItems = ConvertToDefinitionTreeItems(definitionItem); - if (!definitionTreeItems.IsEmpty) - { - var lastTreeItem = definitionTreeItems.Last(); - var referenceItems = CreateReferenceItems( - definitionItem, definitionsAndReferences, commonPathElements); - - lastTreeItem.Children.AddRange(referenceItems); - lastTreeItem.SetReferenceCount(referenceItems.Count); - } + var referenceItems = CreateReferenceItems( + definitionItem, definitionsAndReferences, commonPathElements); - return definitionTreeItems; + return ConvertToDefinitionTreeItems(definitionItem, referenceItems); } - private ImmutableArray ConvertToDefinitionTreeItems( - DefinitionItem definitionItem) + private ImmutableArray ConvertToDefinitionTreeItems( + DefinitionItem definitionItem, + ImmutableArray referenceItems) { - var result = ImmutableArray.CreateBuilder(); + var result = ImmutableArray.CreateBuilder(); - foreach (var location in definitionItem.Locations) + for (int i = 0, n = definitionItem.Locations.Length; i < n; i++) { - result.Add(new DefinitionTreeItem(definitionItem, location)); + var location = definitionItem.Locations[i]; + + // Each definition item may end up as several top nodes (because of partials). + // Add the references to the last item actually in the list. + var definitionTreeItem = i == n - 1 + ? new DefinitionTreeItem(definitionItem, location) + : new DefinitionTreeItem(definitionItem, location, referenceItems); + + result.Add(definitionTreeItem); } return result.ToImmutable(); } - private IList CreateReferenceItems( + private ImmutableArray CreateReferenceItems( DefinitionItem definitionItem, DefinitionsAndReferences definitionsAndReferences, int commonPathElements) { - var result = new List(); + var result = ImmutableArray.CreateBuilder(); var referenceItems = definitionsAndReferences.References.Where(r => r.Definition == definitionItem); foreach (var referenceItem in referenceItems) @@ -95,7 +94,7 @@ public void PresentDefinitionsAndReferences(DefinitionsAndReferences definitions } result.Sort(); - return result; + return result.ToImmutable(); } } } \ No newline at end of file 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 4d2a5c30f26..4bab180b95f 100644 --- a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_GoToDefinition.cs +++ b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_GoToDefinition.cs @@ -107,7 +107,6 @@ private AbstractTreeItem CreateTreeItem(INavigableItem item, int commonPathEleme { var childItems = CreateNavigableItemTreeItems(item.ChildItems, commonPathElements); result.Children.AddRange(childItems); - result.SetReferenceCount(childItems.Count); } return result; diff --git a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/AbstractTreeItem.cs b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/AbstractTreeItem.cs index 37441bcdb87..588db636c1e 100644 --- a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/AbstractTreeItem.cs +++ b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/AbstractTreeItem.cs @@ -39,9 +39,5 @@ public virtual bool CanGoToDefinition() { return false; } - - internal virtual void SetReferenceCount(int referenceCount) - { - } } -} +} \ No newline at end of file diff --git a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/SourceDefinitionTreeItem.cs b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/DefinitionTreeItem.cs similarity index 55% rename from src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/SourceDefinitionTreeItem.cs rename to src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/DefinitionTreeItem.cs index b08b7d5e19c..e158b838d98 100644 --- a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/SourceDefinitionTreeItem.cs +++ b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/TreeItems/DefinitionTreeItem.cs @@ -1,9 +1,11 @@ // 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.Collections.Immutable; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Editor.Implementation.FindReferences; using Microsoft.CodeAnalysis.Editor.Shared.Extensions; using Microsoft.VisualStudio.LanguageServices.Implementation.Utilities; +using Roslyn.Utilities; namespace Microsoft.VisualStudio.LanguageServices.Implementation.Library.FindResults { @@ -12,22 +14,47 @@ internal class DefinitionTreeItem : AbstractTreeItem private readonly DefinitionItem _definitionItem; private readonly DefinitionLocation _definitionLocation; - public DefinitionTreeItem(DefinitionItem definitionItem, DefinitionLocation definitionLocation) + public DefinitionTreeItem( + DefinitionItem definitionItem, + DefinitionLocation definitionLocation, + ImmutableArray referenceItems = default(ImmutableArray)) : base(definitionItem.Tags.GetGlyph().GetGlyphIndex()) { _definitionItem = definitionItem; _definitionLocation = definitionLocation; + if (!referenceItems.IsDefault) + { + this.Children.AddRange(referenceItems); + } + this.DisplayText = CreateDisplayText(); } private string CreateDisplayText() { var displayString = _definitionItem.DisplayParts.JoinText(); + var referenceCount = this.Children.Count; + + var referenceCountDisplay = referenceCount == 1 + ? ServicesVSResources._1_reference + : string.Format(ServicesVSResources._0_references, referenceCount); + + // If we don't have an origination or reference count, then just display the + // parts and nothing else. These items happen when we're getting third party + // results that tell us about their definition location, but not any additional + // reference. We don't want to say '0' references in that case as that can + // be misleading. + return HasOrigination() + ? $"[{_definitionLocation.OriginationParts.JoinText()}] {displayString} ({referenceCountDisplay})" + : referenceCount > 0 + ? $"{displayString} ({referenceCountDisplay})" + : displayString; + } - return _definitionLocation.OriginationParts.Length == 0 - ? displayString - : $"[{_definitionLocation.OriginationParts.JoinText()}] {displayString}"; + private bool HasOrigination() + { + return _definitionLocation.OriginationParts.Length > 0; } public override int GoToSource() @@ -41,15 +68,5 @@ public override bool CanGoToDefinition() { return _definitionLocation.CanNavigateTo(); } - - internal override void SetReferenceCount(int referenceCount) - { - // source case. - var referenceCountDisplay = referenceCount == 1 - ? ServicesVSResources._1_reference - : string.Format(ServicesVSResources._0_references, referenceCount); - - this.DisplayText = CreateDisplayText() + $" ({referenceCountDisplay})"; - } } } \ No newline at end of file diff --git a/src/VisualStudio/Core/Def/ServicesVisualStudio.csproj b/src/VisualStudio/Core/Def/ServicesVisualStudio.csproj index 5821b876de5..5c6dbc61005 100644 --- a/src/VisualStudio/Core/Def/ServicesVisualStudio.csproj +++ b/src/VisualStudio/Core/Def/ServicesVisualStudio.csproj @@ -74,7 +74,7 @@ - + -- GitLab