From 4ad33373421926f2e8fddeb84e8170114b91d22c Mon Sep 17 00:00:00 2001 From: CyrusNajmabadi Date: Sat, 30 Jul 2016 21:24:39 -0400 Subject: [PATCH] Show all source locations for a source item. --- .../FindReferences/FindReferencesTests.vb | 3 +-- ...tionItem.DocumentLocationDefinitionItem.cs | 16 +++++------- .../Portable/FindReferences/DefinitionItem.cs | 26 ++++++++++++++----- .../IDefinitionsAndReferencesFactory.cs | 14 +++++----- .../LibraryManager_FindReferences.cs | 11 +++++--- 5 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.vb b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.vb index 95e601d35bc..23cab0096bf 100644 --- a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.vb +++ b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.vb @@ -52,8 +52,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.FindReferences Dim actualDefinitions = GetFileNamesAndSpans( context.Definitions.Where(AddressOf context.ShouldShow). - OfType(Of DefinitionItem.DocumentLocationDefinitionItem). - SelectMany(Function(d) d.AdditionalLocations.Concat(d.Location))) + SelectMany(Function(d) d.SourceLocations)) Assert.Equal(expectedDefinitions, actualDefinitions) diff --git a/src/Features/Core/Portable/FindReferences/DefinitionItem.DocumentLocationDefinitionItem.cs b/src/Features/Core/Portable/FindReferences/DefinitionItem.DocumentLocationDefinitionItem.cs index 06f95b6dca3..c5ac2625e19 100644 --- a/src/Features/Core/Portable/FindReferences/DefinitionItem.DocumentLocationDefinitionItem.cs +++ b/src/Features/Core/Portable/FindReferences/DefinitionItem.DocumentLocationDefinitionItem.cs @@ -14,25 +14,21 @@ internal partial class DefinitionItem // internal for testing purposes. internal sealed class DocumentLocationDefinitionItem : DefinitionItem { - public readonly DocumentLocation Location; - internal override bool IsExternal => false; public DocumentLocationDefinitionItem( ImmutableArray tags, ImmutableArray displayParts, - ImmutableArray additionalLocations, - bool displayIfNoReferences, - DocumentLocation location) + ImmutableArray sourceLocations, + bool displayIfNoReferences) : base(tags, displayParts, - ImmutableArray.Create(new TaggedText(TextTags.Text, location.Document.Project.Name)), - additionalLocations, displayIfNoReferences) + ImmutableArray.Create(new TaggedText(TextTags.Text, sourceLocations[0].Document.Project.Name)), + sourceLocations, displayIfNoReferences) { - Location = location; } - public override bool CanNavigateTo() => Location.CanNavigateTo(); - public override bool TryNavigateTo() => Location.TryNavigateTo(); + public override bool CanNavigateTo() => SourceLocations[0].CanNavigateTo(); + public override bool TryNavigateTo() => SourceLocations[0].TryNavigateTo(); } } } \ No newline at end of file diff --git a/src/Features/Core/Portable/FindReferences/DefinitionItem.cs b/src/Features/Core/Portable/FindReferences/DefinitionItem.cs index fdb15f24a89..788233257f1 100644 --- a/src/Features/Core/Portable/FindReferences/DefinitionItem.cs +++ b/src/Features/Core/Portable/FindReferences/DefinitionItem.cs @@ -1,5 +1,6 @@ // 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.Immutable; using Microsoft.CodeAnalysis.Completion; @@ -38,7 +39,7 @@ internal abstract partial class DefinitionItem /// Additional locations to present in the UI. A definition may have multiple locations /// for cases like partial types/members. /// - public ImmutableArray AdditionalLocations { get; } + public ImmutableArray SourceLocations { get; } /// /// Whether or not this definition should be presented if we never found any references to @@ -58,13 +59,13 @@ internal abstract partial class DefinitionItem ImmutableArray tags, ImmutableArray displayParts, ImmutableArray originationParts = default(ImmutableArray), - ImmutableArray additionalLocations = default(ImmutableArray), + ImmutableArray sourceLocations = default(ImmutableArray), bool displayIfNoReferences = true) { Tags = tags; DisplayParts = displayParts; OriginationParts = originationParts.NullToEmpty(); - AdditionalLocations = additionalLocations.NullToEmpty(); + SourceLocations = sourceLocations.NullToEmpty(); DisplayIfNoReferences = displayIfNoReferences; } @@ -74,12 +75,25 @@ internal abstract partial class DefinitionItem public static DefinitionItem Create( ImmutableArray tags, ImmutableArray displayParts, - DocumentLocation location, - ImmutableArray additionalLocations = default(ImmutableArray), + DocumentLocation sourceLocation, bool displayIfNoReferences = true) { + return Create(tags, displayParts, ImmutableArray.Create(sourceLocation), displayIfNoReferences); + } + + public static DefinitionItem Create( + ImmutableArray tags, + ImmutableArray displayParts, + ImmutableArray sourceLocations, + bool displayIfNoReferences = true) + { + if (sourceLocations.Length == 0) + { + throw new ArgumentException($"{nameof(sourceLocations)} cannot be empty."); + } + return new DocumentLocationDefinitionItem( - tags, displayParts, additionalLocations, displayIfNoReferences, location); + tags, displayParts, sourceLocations, displayIfNoReferences); } internal static DefinitionItem CreateMetadataDefinition( diff --git a/src/Features/Core/Portable/FindReferences/IDefinitionsAndReferencesFactory.cs b/src/Features/Core/Portable/FindReferences/IDefinitionsAndReferencesFactory.cs index 6b0eaf6974f..ae635710bd3 100644 --- a/src/Features/Core/Portable/FindReferences/IDefinitionsAndReferencesFactory.cs +++ b/src/Features/Core/Portable/FindReferences/IDefinitionsAndReferencesFactory.cs @@ -154,8 +154,7 @@ internal static class DefinitionItemExtensions var tags = GlyphTags.GetTags(definition.GetGlyph()); var displayIfNoReferences = definition.ShouldShowWithNoReferenceLocations(); - var additionalLocations = ImmutableArray.CreateBuilder(); - DocumentLocation? mainLocation = null; + var sourceLocations = ImmutableArray.CreateBuilder(); // If it's a namespace, don't create any normal lcoation. Namespaces // come from many different sources, but we'll only show a single @@ -175,16 +174,16 @@ internal static class DefinitionItemExtensions if (document != null) { var documentLocation = new DocumentLocation(document, location.SourceSpan); - if (mainLocation == null) + if (sourceLocations.Count == 0) { - mainLocation = documentLocation; + sourceLocations.Add(documentLocation); } else { if (uniqueLocations == null || uniqueLocations.Add(documentLocation)) { - additionalLocations.Add(documentLocation); + sourceLocations.Add(documentLocation); } } } @@ -192,7 +191,7 @@ internal static class DefinitionItemExtensions } } - if (mainLocation == null) + if (sourceLocations.Count == 0) { // If we got no definition locations, then create a sentinel one // that we can display but which will not allow navigation. @@ -203,8 +202,7 @@ internal static class DefinitionItemExtensions } return DefinitionItem.Create( - tags, displayParts, mainLocation.Value, - additionalLocations.ToImmutable(), displayIfNoReferences); + tags, displayParts, sourceLocations.ToImmutable(), displayIfNoReferences); } public static SourceReferenceItem TryCreateSourceReferenceItem( 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 e1a7c05adb5..3af007ae91e 100644 --- a/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_FindReferences.cs +++ b/src/VisualStudio/Core/Def/Implementation/Library/FindResults/LibraryManager_FindReferences.cs @@ -26,10 +26,12 @@ public void PresentDefinitionsAndReferences(DefinitionsAndReferences definitions DefinitionsAndReferences definitionsAndReferences) { var definitionDocuments = - definitionsAndReferences.Definitions.SelectMany(d => d.AdditionalLocations) + definitionsAndReferences.Definitions.SelectMany(d => d.SourceLocations) .Select(loc => loc.Document); - var referenceDocuments = definitionsAndReferences.References.Select(r => r.Location.Document); + var referenceDocuments = + definitionsAndReferences.References + .Select(r => r.Location.Document); var allDocuments = definitionDocuments.Concat(referenceDocuments).WhereNotNull().ToSet(); var commonPathElements = CountCommonPathElements(allDocuments); @@ -51,8 +53,9 @@ public void PresentDefinitionsAndReferences(DefinitionsAndReferences definitions var definitionGlyph = definitionItem.Tags.GetGlyph(); - var definitionLocationsAndGlyphs = - from loc in definitionItem.AdditionalLocations + // Skip the first definition. We'll present it in the definition item. + var definitionLocationsAndGlyphs = + from loc in definitionItem.SourceLocations.Skip(1) select ValueTuple.Create(loc, definitionGlyph); var referenceLocationsAndGlyphs = -- GitLab