提交 10ef7cf1 编写于 作者: C CyrusNajmabadi

Trim common path elements for C#/VB find references, just like we do for TypeScript.

上级 36670bb3
......@@ -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)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册