提交 a09302b1 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #12710 from CyrusNajmabadi/commonPathElements

Trim common path elements for C#/VB find references, just like we do for TypeScript
......@@ -21,12 +21,19 @@ public void PresentReferencedSymbols(string title, Solution solution, IEnumerabl
}
// internal for test purposes
internal IList<AbstractTreeItem> CreateFindReferencesItems(Solution solution, IEnumerable<ReferencedSymbol> referencedSymbols)
internal IList<AbstractTreeItem> CreateFindReferencesItems(
Solution solution, IEnumerable<ReferencedSymbol> referencedSymbols)
{
var definitions = new List<AbstractTreeItem>();
var uniqueLocations = new HashSet<ValueTuple<Document, TextSpan>>();
var symbolNavigationService = solution.Workspace.Services.GetService<ISymbolNavigationService>();
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<AbstractTreeItem> 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<SourceReferenceTreeItem> CreateReferenceItems(Solution solution, HashSet<ValueTuple<Document, TextSpan>> uniqueLocations, IEnumerable<Location> locations)
private IList<SourceReferenceTreeItem> CreateReferenceItems(
Solution solution,
HashSet<ValueTuple<Document, TextSpan>> uniqueLocations,
IEnumerable<Location> locations,
int commonPathElements)
{
var referenceItems = new List<SourceReferenceTreeItem>();
foreach (var location in locations)
......@@ -155,7 +169,8 @@ private IList<SourceReferenceTreeItem> CreateReferenceItems(Solution solution, H
if (uniqueLocations.Add(new ValueTuple<Document, TextSpan>(document, sourceSpan)))
{
referenceItems.Add(new SourceReferenceTreeItem(document, sourceSpan, Glyph.Reference.GetGlyphIndex()));
referenceItems.Add(new SourceReferenceTreeItem(
document, sourceSpan, Glyph.Reference.GetGlyphIndex(), commonPathElements));
}
}
......
// 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<AbstractTreeItem> CreateNavigableItemTreeItems(IEnumerable<INaviga
return CreateNavigableItemTreeItems(itemsList, commonPathElements);
}
private int CountCommonPathElements(HashSet<Document> documents)
private int CountCommonPathElements(ISet<Document> 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);
......
......@@ -9,7 +9,9 @@ namespace Microsoft.VisualStudio.LanguageServices.Implementation.Library.FindRes
{
internal class SourceReferenceTreeItem : AbstractSourceTreeItem, IComparable<SourceReferenceTreeItem>
{
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)
......
......@@ -4,7 +4,6 @@ Imports System.Text
Imports System.Threading
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.Editor.UnitTests
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Extensions
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Utilities
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
Imports Microsoft.CodeAnalysis.FindSymbols
......@@ -38,11 +37,11 @@ class $$C
Dim expectedResults = New List(Of AbstractTreeItem) From
{
TestFindResult.CreateDefinition($"[CSharpAssembly1] C.C() ({ServicesVSResources._1_reference})",
TestFindResult.CreateReference("CSharpAssembly1\Test1.cs - (11, 21) : var a = new C();")),
TestFindResult.CreateReference("Test1.cs - (11, 21) : var a = new C();")),
TestFindResult.CreateDefinition($"[CSharpAssembly1] C.C(int) ({ServicesVSResources._1_reference})",
TestFindResult.CreateReference("CSharpAssembly1\Test1.cs - (12, 21) : var b = new C(5);")),
TestFindResult.CreateReference("Test1.cs - (12, 21) : var b = new C(5);")),
TestFindResult.CreateDefinition($"[CSharpAssembly1] class C ({ServicesVSResources._1_reference})",
TestFindResult.CreateReference("CSharpAssembly1\Test1.cs - (13, 17) : var c = C.z;"))
TestFindResult.CreateReference("Test1.cs - (13, 17) : var c = C.z;"))
}
Await VerifyAsync(markup, LanguageNames.CSharp, expectedResults)
......@@ -71,11 +70,11 @@ End Class"]]></Text>
Dim expectedResults = New List(Of AbstractTreeItem) From
{
TestFindResult.CreateDefinition($"[VisualBasicAssembly1] Class C ({ServicesVSResources._1_reference})",
TestFindResult.CreateReference("VisualBasicAssembly1\Test1.vb - (14, 17) : Dim d = C.z")),
TestFindResult.CreateReference("Test1.vb - (14, 17) : Dim d = C.z")),
TestFindResult.CreateDefinition($"[VisualBasicAssembly1] Sub C.New() ({ServicesVSResources._1_reference})",
TestFindResult.CreateReference("VisualBasicAssembly1\Test1.vb - (12, 21) : Dim a = New C()")),
TestFindResult.CreateReference("Test1.vb - (12, 21) : Dim a = New C()")),
TestFindResult.CreateDefinition($"[VisualBasicAssembly1] Sub C.New(Integer) ({ServicesVSResources._1_reference})",
TestFindResult.CreateReference("VisualBasicAssembly1\Test1.vb - (13, 21) : Dim b = New C(5)"))
TestFindResult.CreateReference("Test1.vb - (13, 21) : Dim b = New C(5)"))
}
Await VerifyAsync(markup, LanguageNames.VisualBasic, expectedResults)
......@@ -96,8 +95,8 @@ namespace NS
Dim expectedResults = New List(Of AbstractTreeItem) From
{
TestFindResult.CreateUnnavigable($"namespace NS ({String.Format(ServicesVSResources._0_references, 2)})",
TestFindResult.CreateReference("CSharpAssembly1\Test1.cs - (2, 11) : namespace NS"),
TestFindResult.CreateReference("CSharpAssembly1\Test1.cs - (6, 11) : namespace NS"))
TestFindResult.CreateReference("Test1.cs - (2, 11) : namespace NS"),
TestFindResult.CreateReference("Test1.cs - (6, 11) : namespace NS"))
}
Await VerifyAsync(markup, LanguageNames.CSharp, expectedResults)
......@@ -113,8 +112,8 @@ using System.Threading;
Dim expectedResults = New List(Of AbstractTreeItem) From
{
TestFindResult.CreateUnnavigable($"namespace System ({String.Format(ServicesVSResources._0_references, 2)})",
TestFindResult.CreateReference("CSharpAssembly1\Test1.cs - (2, 7) : using System;"),
TestFindResult.CreateReference("CSharpAssembly1\Test1.cs - (3, 7) : using System.Threading;"))
TestFindResult.CreateReference("Test1.cs - (2, 7) : using System;"),
TestFindResult.CreateReference("Test1.cs - (3, 7) : using System.Threading;"))
}
Await VerifyAsync(markup, LanguageNames.CSharp, expectedResults)
......@@ -253,4 +252,4 @@ Actual Items:
End Function
End Class
End Class
End Namespace
End Namespace
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册