提交 4ad33373 编写于 作者: C CyrusNajmabadi

Show all source locations for a source item.

上级 90661187
...@@ -52,8 +52,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.FindReferences ...@@ -52,8 +52,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.FindReferences
Dim actualDefinitions = GetFileNamesAndSpans( Dim actualDefinitions = GetFileNamesAndSpans(
context.Definitions.Where(AddressOf context.ShouldShow). context.Definitions.Where(AddressOf context.ShouldShow).
OfType(Of DefinitionItem.DocumentLocationDefinitionItem). SelectMany(Function(d) d.SourceLocations))
SelectMany(Function(d) d.AdditionalLocations.Concat(d.Location)))
Assert.Equal(expectedDefinitions, actualDefinitions) Assert.Equal(expectedDefinitions, actualDefinitions)
......
...@@ -14,25 +14,21 @@ internal partial class DefinitionItem ...@@ -14,25 +14,21 @@ internal partial class DefinitionItem
// internal for testing purposes. // internal for testing purposes.
internal sealed class DocumentLocationDefinitionItem : DefinitionItem internal sealed class DocumentLocationDefinitionItem : DefinitionItem
{ {
public readonly DocumentLocation Location;
internal override bool IsExternal => false; internal override bool IsExternal => false;
public DocumentLocationDefinitionItem( public DocumentLocationDefinitionItem(
ImmutableArray<string> tags, ImmutableArray<string> tags,
ImmutableArray<TaggedText> displayParts, ImmutableArray<TaggedText> displayParts,
ImmutableArray<DocumentLocation> additionalLocations, ImmutableArray<DocumentLocation> sourceLocations,
bool displayIfNoReferences, bool displayIfNoReferences)
DocumentLocation location)
: base(tags, displayParts, : base(tags, displayParts,
ImmutableArray.Create(new TaggedText(TextTags.Text, location.Document.Project.Name)), ImmutableArray.Create(new TaggedText(TextTags.Text, sourceLocations[0].Document.Project.Name)),
additionalLocations, displayIfNoReferences) sourceLocations, displayIfNoReferences)
{ {
Location = location;
} }
public override bool CanNavigateTo() => Location.CanNavigateTo(); public override bool CanNavigateTo() => SourceLocations[0].CanNavigateTo();
public override bool TryNavigateTo() => Location.TryNavigateTo(); public override bool TryNavigateTo() => SourceLocations[0].TryNavigateTo();
} }
} }
} }
\ No newline at end of file
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // 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 System.Collections.Immutable;
using Microsoft.CodeAnalysis.Completion; using Microsoft.CodeAnalysis.Completion;
...@@ -38,7 +39,7 @@ internal abstract partial class DefinitionItem ...@@ -38,7 +39,7 @@ internal abstract partial class DefinitionItem
/// Additional locations to present in the UI. A definition may have multiple locations /// Additional locations to present in the UI. A definition may have multiple locations
/// for cases like partial types/members. /// for cases like partial types/members.
/// </summary> /// </summary>
public ImmutableArray<DocumentLocation> AdditionalLocations { get; } public ImmutableArray<DocumentLocation> SourceLocations { get; }
/// <summary> /// <summary>
/// Whether or not this definition should be presented if we never found any references to /// Whether or not this definition should be presented if we never found any references to
...@@ -58,13 +59,13 @@ internal abstract partial class DefinitionItem ...@@ -58,13 +59,13 @@ internal abstract partial class DefinitionItem
ImmutableArray<string> tags, ImmutableArray<string> tags,
ImmutableArray<TaggedText> displayParts, ImmutableArray<TaggedText> displayParts,
ImmutableArray<TaggedText> originationParts = default(ImmutableArray<TaggedText>), ImmutableArray<TaggedText> originationParts = default(ImmutableArray<TaggedText>),
ImmutableArray<DocumentLocation> additionalLocations = default(ImmutableArray<DocumentLocation>), ImmutableArray<DocumentLocation> sourceLocations = default(ImmutableArray<DocumentLocation>),
bool displayIfNoReferences = true) bool displayIfNoReferences = true)
{ {
Tags = tags; Tags = tags;
DisplayParts = displayParts; DisplayParts = displayParts;
OriginationParts = originationParts.NullToEmpty(); OriginationParts = originationParts.NullToEmpty();
AdditionalLocations = additionalLocations.NullToEmpty(); SourceLocations = sourceLocations.NullToEmpty();
DisplayIfNoReferences = displayIfNoReferences; DisplayIfNoReferences = displayIfNoReferences;
} }
...@@ -74,12 +75,25 @@ internal abstract partial class DefinitionItem ...@@ -74,12 +75,25 @@ internal abstract partial class DefinitionItem
public static DefinitionItem Create( public static DefinitionItem Create(
ImmutableArray<string> tags, ImmutableArray<string> tags,
ImmutableArray<TaggedText> displayParts, ImmutableArray<TaggedText> displayParts,
DocumentLocation location, DocumentLocation sourceLocation,
ImmutableArray<DocumentLocation> additionalLocations = default(ImmutableArray<DocumentLocation>),
bool displayIfNoReferences = true) bool displayIfNoReferences = true)
{ {
return Create(tags, displayParts, ImmutableArray.Create(sourceLocation), displayIfNoReferences);
}
public static DefinitionItem Create(
ImmutableArray<string> tags,
ImmutableArray<TaggedText> displayParts,
ImmutableArray<DocumentLocation> sourceLocations,
bool displayIfNoReferences = true)
{
if (sourceLocations.Length == 0)
{
throw new ArgumentException($"{nameof(sourceLocations)} cannot be empty.");
}
return new DocumentLocationDefinitionItem( return new DocumentLocationDefinitionItem(
tags, displayParts, additionalLocations, displayIfNoReferences, location); tags, displayParts, sourceLocations, displayIfNoReferences);
} }
internal static DefinitionItem CreateMetadataDefinition( internal static DefinitionItem CreateMetadataDefinition(
......
...@@ -154,8 +154,7 @@ internal static class DefinitionItemExtensions ...@@ -154,8 +154,7 @@ internal static class DefinitionItemExtensions
var tags = GlyphTags.GetTags(definition.GetGlyph()); var tags = GlyphTags.GetTags(definition.GetGlyph());
var displayIfNoReferences = definition.ShouldShowWithNoReferenceLocations(); var displayIfNoReferences = definition.ShouldShowWithNoReferenceLocations();
var additionalLocations = ImmutableArray.CreateBuilder<DocumentLocation>(); var sourceLocations = ImmutableArray.CreateBuilder<DocumentLocation>();
DocumentLocation? mainLocation = null;
// If it's a namespace, don't create any normal lcoation. Namespaces // If it's a namespace, don't create any normal lcoation. Namespaces
// come from many different sources, but we'll only show a single // come from many different sources, but we'll only show a single
...@@ -175,16 +174,16 @@ internal static class DefinitionItemExtensions ...@@ -175,16 +174,16 @@ internal static class DefinitionItemExtensions
if (document != null) if (document != null)
{ {
var documentLocation = new DocumentLocation(document, location.SourceSpan); var documentLocation = new DocumentLocation(document, location.SourceSpan);
if (mainLocation == null) if (sourceLocations.Count == 0)
{ {
mainLocation = documentLocation; sourceLocations.Add(documentLocation);
} }
else else
{ {
if (uniqueLocations == null || if (uniqueLocations == null ||
uniqueLocations.Add(documentLocation)) uniqueLocations.Add(documentLocation))
{ {
additionalLocations.Add(documentLocation); sourceLocations.Add(documentLocation);
} }
} }
} }
...@@ -192,7 +191,7 @@ internal static class DefinitionItemExtensions ...@@ -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 // If we got no definition locations, then create a sentinel one
// that we can display but which will not allow navigation. // that we can display but which will not allow navigation.
...@@ -203,8 +202,7 @@ internal static class DefinitionItemExtensions ...@@ -203,8 +202,7 @@ internal static class DefinitionItemExtensions
} }
return DefinitionItem.Create( return DefinitionItem.Create(
tags, displayParts, mainLocation.Value, tags, displayParts, sourceLocations.ToImmutable(), displayIfNoReferences);
additionalLocations.ToImmutable(), displayIfNoReferences);
} }
public static SourceReferenceItem TryCreateSourceReferenceItem( public static SourceReferenceItem TryCreateSourceReferenceItem(
......
...@@ -26,10 +26,12 @@ public void PresentDefinitionsAndReferences(DefinitionsAndReferences definitions ...@@ -26,10 +26,12 @@ public void PresentDefinitionsAndReferences(DefinitionsAndReferences definitions
DefinitionsAndReferences definitionsAndReferences) DefinitionsAndReferences definitionsAndReferences)
{ {
var definitionDocuments = var definitionDocuments =
definitionsAndReferences.Definitions.SelectMany(d => d.AdditionalLocations) definitionsAndReferences.Definitions.SelectMany(d => d.SourceLocations)
.Select(loc => loc.Document); .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 allDocuments = definitionDocuments.Concat(referenceDocuments).WhereNotNull().ToSet();
var commonPathElements = CountCommonPathElements(allDocuments); var commonPathElements = CountCommonPathElements(allDocuments);
...@@ -51,8 +53,9 @@ public void PresentDefinitionsAndReferences(DefinitionsAndReferences definitions ...@@ -51,8 +53,9 @@ public void PresentDefinitionsAndReferences(DefinitionsAndReferences definitions
var definitionGlyph = definitionItem.Tags.GetGlyph(); var definitionGlyph = definitionItem.Tags.GetGlyph();
var definitionLocationsAndGlyphs = // Skip the first definition. We'll present it in the definition item.
from loc in definitionItem.AdditionalLocations var definitionLocationsAndGlyphs =
from loc in definitionItem.SourceLocations.Skip(1)
select ValueTuple.Create(loc, definitionGlyph); select ValueTuple.Create(loc, definitionGlyph);
var referenceLocationsAndGlyphs = var referenceLocationsAndGlyphs =
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册