提交 0ca1ff7d 编写于 作者: C CyrusNajmabadi

Move over to the FindRefs data model.

上级 5025f6b0
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis.Editor.Navigation;
using Microsoft.CodeAnalysis.FindReferences;
using Microsoft.CodeAnalysis.FindSymbols;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Utilities;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.Editor.Implementation.FindReferences
{
......@@ -30,24 +27,16 @@ private class ProgressAdapter : IFindReferencesProgress
/// This dictionary allows us to make that mapping once and then keep it around for
/// all future callbacks.
/// </summary>
private readonly ConcurrentDictionary<ISymbol, IList<INavigableItem>> _definitionToNavigableItem =
new ConcurrentDictionary<ISymbol, IList<INavigableItem>>(MetadataUnifyingEquivalenceComparer.Instance);
private readonly ConcurrentDictionary<ISymbol, DefinitionItem> _definitionToNavigableItem =
new ConcurrentDictionary<ISymbol, DefinitionItem>(MetadataUnifyingEquivalenceComparer.Instance);
private readonly Func<ISymbol, IList<INavigableItem>> _navigableItemFactory;
private readonly Func<ISymbol, DefinitionItem> _definitionFactory;
public ProgressAdapter(Solution solution, FindReferencesContext context)
{
_solution = solution;
_context = context;
_navigableItemFactory = s =>
{
var taggedParts = s.ToDisplayParts(FindAllReferencesUtilities.DefinitionDisplayFormat)
.ToTaggedText();
var definitionLocations = s.GetDefinitionLocationsToShow();
return definitionLocations.Select(loc => NavigableItemFactory.GetItemFromSymbolLocation(
solution, s, loc, taggedParts)).ToList();
};
_definitionFactory = s => s.ToDefinitionItem(solution);
}
// Simple context forwarding functions.
......@@ -61,27 +50,27 @@ public ProgressAdapter(Solution solution, FindReferencesContext context)
// used by the FAR engine to the INavigableItems used by the streaming FAR
// feature.
private IList<INavigableItem> GetNavigableItems(ISymbol definition)
private DefinitionItem GetDefinitionItem(ISymbol definition)
{
return _definitionToNavigableItem.GetOrAdd(definition, _navigableItemFactory);
return _definitionToNavigableItem.GetOrAdd(definition, _definitionFactory);
}
public void OnDefinitionFound(ISymbol definition)
{
foreach (var item in GetNavigableItems(definition))
{
_context.OnDefinitionFound(
item,
GetDefinitionItem(definition),
definition.ShouldShowWithNoReferenceLocations());
}
}
public void OnReferenceFound(ISymbol definition, ReferenceLocation location)
{
_context.OnReferenceFound(
GetNavigableItems(definition).First(),
NavigableItemFactory.GetItemFromSymbolLocation(
_solution, definition, location.Location, displayTaggedParts: null));
var referenceItem = location.TryCreateSourceReferenceItem(
GetDefinitionItem(definition));
if (referenceItem != null)
{
_context.OnReferenceFound(referenceItem);
}
}
}
}
......
// 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.Threading;
using Microsoft.CodeAnalysis.Editor.Navigation;
using Microsoft.CodeAnalysis.FindReferences;
namespace Microsoft.CodeAnalysis.Editor
{
......@@ -30,11 +30,11 @@ public virtual void OnFindInDocumentCompleted(Document document)
}
public virtual void OnDefinitionFound(
INavigableItem definition, bool shouldDisplayWithNoReferences)
DefinitionItem definition, bool shouldDisplayWithNoReferences)
{
}
public virtual void OnReferenceFound(INavigableItem definition, INavigableItem reference)
public virtual void OnReferenceFound(SourceReferenceItem reference)
{
}
......
......@@ -94,14 +94,7 @@ private static int GetPrecedence(ReferencedSymbol referencedSymbol)
return;
}
// Try to create an item for this definition. If we can't,
// ignore it entirely (including all its reference locations).
var definitionItem = CreateDefinitionItem(solution, referencedSymbol);
if (definitionItem == null)
{
return;
}
var definitionItem = referencedSymbol.Definition.ToDefinitionItem(solution);
definitions.Add(definitionItem);
// Now, create the SourceReferenceItems for all the reference locations
......@@ -127,11 +120,34 @@ private static int GetPrecedence(ReferencedSymbol referencedSymbol)
return null;
}
private static DefinitionItem CreateDefinitionItem(
Solution solution, ReferencedSymbol referencedSymbol)
private static void CreateReferences(
ReferencedSymbol referencedSymbol,
ImmutableArray<SourceReferenceItem>.Builder references,
DefinitionItem definitionItem,
HashSet<DocumentLocation> uniqueLocations)
{
foreach (var referenceLocation in referencedSymbol.Locations)
{
var definition = referencedSymbol.Definition;
var sourceReferenceItem = referenceLocation.TryCreateSourceReferenceItem(definitionItem);
if (sourceReferenceItem == null)
{
continue;
}
if (uniqueLocations.Add(sourceReferenceItem.Location))
{
references.Add(sourceReferenceItem);
}
}
}
}
internal static class DefinitionItemExtensions
{
public static DefinitionItem ToDefinitionItem(
this ISymbol definition,
Solution solution)
{
var definitionLocations = ConvertDefinitionLocations(solution, definition);
var displayParts = definition.ToDisplayParts(s_definitionDisplayFormat).ToTaggedText();
......@@ -184,13 +200,9 @@ private static int GetPrecedence(ReferencedSymbol referencedSymbol)
return result.ToImmutable();
}
private static void CreateReferences(
ReferencedSymbol referencedSymbol,
ImmutableArray<SourceReferenceItem>.Builder references,
DefinitionItem definitionItem,
HashSet<DocumentLocation> uniqueLocations)
{
foreach (var referenceLocation in referencedSymbol.Locations)
public static SourceReferenceItem TryCreateSourceReferenceItem(
this ReferenceLocation referenceLocation,
DefinitionItem definitionItem)
{
var location = referenceLocation.Location;
Debug.Assert(location.IsInSource);
......@@ -201,17 +213,13 @@ private static int GetPrecedence(ReferencedSymbol referencedSymbol)
var documentLocation = new DocumentLocation(document, sourceSpan);
if (!documentLocation.CanNavigateTo())
{
continue;
return null;
}
if (uniqueLocations.Add(documentLocation))
{
references.Add(new SourceReferenceItem(definitionItem, documentLocation));
}
}
return new SourceReferenceItem(definitionItem, documentLocation);
}
public static readonly SymbolDisplayFormat s_definitionDisplayFormat =
private static readonly SymbolDisplayFormat s_definitionDisplayFormat =
new SymbolDisplayFormat(
typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameOnly,
genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters,
......
using System;
using System.Collections.Immutable;
using System.Windows;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor;
using Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.QuickInfo;
using Microsoft.CodeAnalysis.Editor.Navigation;
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.Shell.TableControl;
using Microsoft.VisualStudio.Shell.TableManager;
using Microsoft.VisualStudio.Text;
namespace Microsoft.VisualStudio.LanguageServices.Implementation
{
internal partial class StreamingFindReferencesPresenter
{
/// <summary>
/// Stores and provides access to data that is common to navigable items (whether they are
/// references or definitions).
/// </summary>
private class NavigableItemEntryData
{
private readonly StreamingFindReferencesPresenter _presenter;
private readonly INavigableItem _item;
private readonly object _boxedProjectGuid;
private readonly SourceText _sourceText;
private readonly ImmutableArray<TaggedText> _taggedParts;
private readonly bool _displayGlyph;
public NavigableItemEntryData(
StreamingFindReferencesPresenter presenter,
INavigableItem item,
Guid projectGuid,
SourceText sourceText,
ImmutableArray<TaggedText> taggedParts,
bool displayGlyph)
{
_presenter = presenter;
_item = item;
_boxedProjectGuid = projectGuid;
_sourceText = sourceText;
_taggedParts = taggedParts;
_displayGlyph = displayGlyph;
}
public object GetValue(string keyName)
{
switch (keyName)
{
case StandardTableKeyNames.DocumentName:
return _item.Document.FilePath;
case StandardTableKeyNames.Line:
return _sourceText.Lines.GetLinePosition(_item.SourceSpan.Start).Line;
case StandardTableKeyNames.Column:
return _sourceText.Lines.GetLinePosition(_item.SourceSpan.Start).Character;
case StandardTableKeyNames.ProjectName:
return _item.Document.Project.Name;
case StandardTableKeyNames.ProjectGuid:
return _boxedProjectGuid;
case StandardTableKeyNames.Text:
return _sourceText.Lines.GetLineFromPosition(_item.SourceSpan.Start).ToString().Trim();
case StandardTableKeyNames.FullText:
// When we support classified lines, change this to:
// return GetEllisionBufferAroundReference();
return _sourceText.Lines.GetLineFromPosition(_item.SourceSpan.Start).ToString().Trim();
case StandardTableKeyNames2.TextInlines:
return _taggedParts.ToTextBlock(_presenter._typeMap).Inlines;
case StandardTableKeyNames2.DefinitionIcon:
return _displayGlyph ? (object)_item.Glyph.GetImageMoniker() : null;
}
return null;
}
private FrameworkElement GetEllisionBufferAroundReference()
{
var snapshotSpan = GetSnapshotSpanAroundReference();
var content = new ElisionBufferDeferredContent(
snapshotSpan,
_presenter._projectionBufferFactoryService,
_presenter._editorOptionsFactoryService,
_presenter._textEditorFactoryService);
return content.Create();
}
private SnapshotSpan GetSnapshotSpanAroundReference()
{
var snapshot = GetTextSnapshot();
var lines = _sourceText.Lines;
var lineNumber = lines.GetLineFromPosition(_item.SourceSpan.Start).LineNumber;
var firstLineNumber = Math.Max(0, lineNumber - 2);
var lastLineNumber = Math.Min(lines.Count - 1, lineNumber + 2);
return new SnapshotSpan(snapshot,
Span.FromBounds(lines[firstLineNumber].Start, lines[lastLineNumber].End));
}
private ITextSnapshot GetTextSnapshot()
{
// Get the existing editor snapshot (if this is already open in an editor),
// otherwise create a new snapshot that we can display.
return _sourceText.FindCorrespondingEditorTextSnapshot() ?? CreateSnapshot();
}
private ITextSnapshot CreateSnapshot()
{
var contentTypeService = _item.Document.GetLanguageService<IContentTypeLanguageService>();
var contentType = contentTypeService.GetDefaultContentType();
var textBuffer = _presenter._textBufferFactoryService.CreateTextBuffer(_sourceText.ToString(), contentType);
return textBuffer.CurrentSnapshot;
}
}
}
}
\ No newline at end of file
using Microsoft.CodeAnalysis.Editor.Navigation;
using System;
using System.Collections.Immutable;
using System.Windows;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor;
using Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.QuickInfo;
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.FindReferences;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.Shell.TableControl;
using Microsoft.VisualStudio.Shell.TableManager;
using Microsoft.VisualStudio.Text;
namespace Microsoft.VisualStudio.LanguageServices.Implementation
{
......@@ -7,19 +18,31 @@ internal partial class StreamingFindReferencesPresenter
{
private class ReferenceEntry
{
private readonly StreamingFindReferencesPresenter _presenter;
private readonly RoslynDefinitionBucket _definitionBucket;
private readonly SourceReferenceItem _sourceReferenceItem;
private readonly INavigableItem _referenceItem;
private readonly NavigableItemEntryData _entryData;
private readonly object _boxedProjectGuid;
private readonly SourceText _sourceText;
private readonly ImmutableArray<TaggedText> _taggedParts;
public ReferenceEntry(
StreamingFindReferencesPresenter presenter,
RoslynDefinitionBucket definitionBucket,
INavigableItem referenceItem,
NavigableItemEntryData entryData)
SourceReferenceItem sourceReferenceItem,
Guid projectGuid,
SourceText sourceText,
ImmutableArray<TaggedText> taggedParts)
{
_presenter = presenter;
_definitionBucket = definitionBucket;
_referenceItem = referenceItem;
_entryData = entryData;
_sourceReferenceItem = sourceReferenceItem;
_boxedProjectGuid = projectGuid;
_sourceText = sourceText;
_taggedParts = taggedParts;
}
public bool TryGetValue(string keyName, out object content)
......@@ -28,17 +51,85 @@ public bool TryGetValue(string keyName, out object content)
return content != null;
}
private DocumentLocation Location => _sourceReferenceItem.Location;
private Document Document => Location.Document;
private TextSpan SourceSpan => Location.SourceSpan;
private object GetValue(string keyName)
{
// Return data specific to a reference.
switch (keyName)
{
case StandardTableKeyNames.DocumentName:
return Document.FilePath;
case StandardTableKeyNames.Line:
return _sourceText.Lines.GetLinePosition(SourceSpan.Start).Line;
case StandardTableKeyNames.Column:
return _sourceText.Lines.GetLinePosition(SourceSpan.Start).Character;
case StandardTableKeyNames.ProjectName:
return Location.Document.Project.Name;
case StandardTableKeyNames.ProjectGuid:
return _boxedProjectGuid;
case StandardTableKeyNames.Text:
return _sourceText.Lines.GetLineFromPosition(SourceSpan.Start).ToString().Trim();
case StandardTableKeyNames.FullText:
// When we support classified lines, change this to:
// return GetEllisionBufferAroundReference();
return _sourceText.Lines.GetLineFromPosition(SourceSpan.Start).ToString().Trim();
case StandardTableKeyNames2.TextInlines:
return _taggedParts.ToTextBlock(_presenter._typeMap).Inlines;
//case StandardTableKeyNames2.DefinitionIcon:
// return _displayGlyph ? (object)_item.Glyph.GetImageMoniker() : null;
case StandardTableKeyNames2.Definition:
return _definitionBucket;
}
// Then fall back to the data that's common to references and definitions.
return _entryData.GetValue(keyName);
return null;
}
private FrameworkElement GetEllisionBufferAroundReference()
{
var snapshotSpan = GetSnapshotSpanAroundReference();
var content = new ElisionBufferDeferredContent(
snapshotSpan,
_presenter._projectionBufferFactoryService,
_presenter._editorOptionsFactoryService,
_presenter._textEditorFactoryService);
return content.Create();
}
private SnapshotSpan GetSnapshotSpanAroundReference()
{
var snapshot = GetTextSnapshot();
var lines = _sourceText.Lines;
var lineNumber = lines.GetLineFromPosition(SourceSpan.Start).LineNumber;
var firstLineNumber = Math.Max(0, lineNumber - 2);
var lastLineNumber = Math.Min(lines.Count - 1, lineNumber + 2);
return new SnapshotSpan(snapshot,
Span.FromBounds(lines[firstLineNumber].Start, lines[lastLineNumber].End));
}
private ITextSnapshot GetTextSnapshot()
{
// Get the existing editor snapshot (if this is already open in an editor),
// otherwise create a new snapshot that we can display.
return _sourceText.FindCorrespondingEditorTextSnapshot() ?? CreateSnapshot();
}
private ITextSnapshot CreateSnapshot()
{
var contentTypeService = Document.GetLanguageService<IContentTypeLanguageService>();
var contentType = contentTypeService.GetDefaultContentType();
var textBuffer = _presenter._textBufferFactoryService.CreateTextBuffer(_sourceText.ToString(), contentType);
return textBuffer.CurrentSnapshot;
}
}
}
......
using Microsoft.CodeAnalysis.Editor.Navigation;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Editor.Navigation;
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.FindReferences;
using Microsoft.VisualStudio.Shell.FindAllReferences;
using Microsoft.VisualStudio.Shell.TableControl;
using Microsoft.VisualStudio.Shell.TableManager;
namespace Microsoft.VisualStudio.LanguageServices.Implementation
{
......@@ -7,21 +12,21 @@ internal partial class StreamingFindReferencesPresenter
{
private class RoslynDefinitionBucket : DefinitionBucket
{
private readonly StreamingFindReferencesPresenter _presenter;
private readonly TableDataSourceFindReferencesContext _context;
private readonly INavigableItem _definitionItem;
private readonly NavigableItemEntryData _entryData;
private readonly DefinitionItem _definitionItem;
public RoslynDefinitionBucket(
StreamingFindReferencesPresenter presenter,
TableDataSourceFindReferencesContext context,
INavigableItem definitionItem,
NavigableItemEntryData entryData)
DefinitionItem definitionItem)
: base(name: "",
sourceTypeIdentifier: context.SourceTypeIdentifier,
identifier: context.Identifier)
{
_presenter = presenter;
_context = context;
_definitionItem = definitionItem;
_entryData = entryData;
}
public override bool TryGetValue(string key, out object content)
......@@ -32,10 +37,20 @@ public override bool TryGetValue(string key, out object content)
private object GetValue(string key)
{
// Return data specific to a definition.
switch (key)
{
case StandardTableKeyNames.Text:
case StandardTableKeyNames.FullText:
return _definitionItem.DisplayParts.JoinText();
case StandardTableKeyNames2.TextInlines:
return _definitionItem.DisplayParts.ToTextBlock(_presenter._typeMap).Inlines;
case StandardTableKeyNames2.DefinitionIcon:
return _definitionItem.Tags.GetGlyph().GetImageMoniker();
}
// Then fall back to the data that's common to references and definitions.
return _entryData.GetValue(key);
return null;
}
}
}
......
......@@ -10,6 +10,7 @@
using Microsoft.CodeAnalysis.Editor;
using Microsoft.CodeAnalysis.Editor.Navigation;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.FindReferences;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem;
......@@ -41,8 +42,8 @@ private class TableDataSourceFindReferencesContext :
/// bucket for it. The first time we hear about a definition we'll make a single task
/// and then always return that for all future references found.
/// </summary>
private readonly Dictionary<INavigableItem, Task<RoslynDefinitionBucket>> _definitionToBucketTask =
new Dictionary<INavigableItem, Task<RoslynDefinitionBucket>>();
private readonly Dictionary<DefinitionItem, RoslynDefinitionBucket> _definitionToBucket =
new Dictionary<DefinitionItem, RoslynDefinitionBucket>();
private ImmutableList<ReferenceEntry> _referenceEntries = ImmutableList<ReferenceEntry>.Empty;
private TableEntriesSnapshot _lastSnapshot;
......@@ -124,7 +125,7 @@ public override void OnCompleted()
}
}
public async override void OnReferenceFound(INavigableItem definition, INavigableItem reference)
public async override void OnReferenceFound(SourceReferenceItem reference)
{
try
{
......@@ -136,7 +137,7 @@ public async override void OnReferenceFound(INavigableItem definition, INavigabl
// know so that it doesn't verify results until this completes.
using (var token = _presenter._asyncListener.BeginAsyncOperation(nameof(OnReferenceFound)))
{
await OnReferenceFoundAsync(definition, reference).ConfigureAwait(false);
await OnReferenceFoundAsync(reference).ConfigureAwait(false);
}
}
catch (Exception e) when (FatalError.ReportWithoutCrashUnlessCanceled(e))
......@@ -144,25 +145,28 @@ public async override void OnReferenceFound(INavigableItem definition, INavigabl
}
}
private async Task OnReferenceFoundAsync(
INavigableItem definition, INavigableItem referenceItem)
private async Task OnReferenceFoundAsync(SourceReferenceItem referenceItem)
{
var cancellationToken = _cancellationTokenSource.Token;
cancellationToken.ThrowIfCancellationRequested();
// First find the bucket corresponding to our definition. If we can't find/create
// one, then don't do anything for this reference.
var definitionBucket = await GetOrCreateDefinitionBucketAsync(
definition, cancellationToken).ConfigureAwait(false);
var definitionBucket = GetOrCreateDefinitionBucket(referenceItem.Definition);
if (definitionBucket == null)
{
return;
}
// Now make the underlying data object for the reference.
var entryData = await this.TryCreateNavigableItemEntryData(
referenceItem, isDefinition: false, cancellationToken: cancellationToken).ConfigureAwait(false);
var referenceEntry = new ReferenceEntry(definitionBucket, referenceItem, entryData);
//var entryData = await this.TryCreateNavigableItemEntryData(
// referenceItem, isDefinition: false, cancellationToken: cancellationToken).ConfigureAwait(false);
var referenceEntry = await this.CreateReferenceEntryAsync(
definitionBucket, referenceItem, cancellationToken).ConfigureAwait(false);
if (referenceEntry == null)
{
return;
}
lock (_gate)
{
......@@ -175,10 +179,11 @@ public async override void OnReferenceFound(INavigableItem definition, INavigabl
NotifySinksOfChangedVersion();
}
private async Task<NavigableItemEntryData> TryCreateNavigableItemEntryData(
INavigableItem item, bool isDefinition, CancellationToken cancellationToken)
private async Task<ReferenceEntry> CreateReferenceEntryAsync(
RoslynDefinitionBucket definitionBucket, SourceReferenceItem referenceItem, CancellationToken cancellationToken)
{
var document = item.Document;
var location = referenceItem.Location;
var document = location.Document;
// The FAR system needs to know the guid for the project that a def/reference is
// from. So we only support this for documents from a VSWorkspace.
......@@ -194,35 +199,27 @@ public async override void OnReferenceFound(INavigableItem definition, INavigabl
return null;
}
var taggedText = await GetTaggedTextAsync(document, item, isDefinition, cancellationToken).ConfigureAwait(false);
var taggedText = await GetTaggedTextForReferenceAsync(document, referenceItem, cancellationToken).ConfigureAwait(false);
var sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
return new NavigableItemEntryData(
_presenter, item, projectGuid.Value, sourceText,
taggedText, displayGlyph: isDefinition);
}
private Task<ImmutableArray<TaggedText>> GetTaggedTextAsync(
Document document, INavigableItem item, bool isDefinition, CancellationToken cancellationToken)
{
return isDefinition
? GetTaggedTextForDefinitionAsync(item)
: GetTaggedTextForReferenceAsync(document, item, cancellationToken);
return new ReferenceEntry(
_presenter, definitionBucket, referenceItem,
projectGuid.Value, sourceText, taggedText);
}
private Task<ImmutableArray<TaggedText>> GetTaggedTextForDefinitionAsync(
INavigableItem item)
DefinitionItem item)
{
return Task.FromResult(item.DisplayTaggedParts);
return Task.FromResult(item.DisplayParts);
}
private async Task<ImmutableArray<TaggedText>> GetTaggedTextForReferenceAsync(
Document document, INavigableItem item, CancellationToken cancellationToken)
Document document, SourceReferenceItem item, CancellationToken cancellationToken)
{
var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
var sourceText = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);
var referenceSpan = item.SourceSpan;
var referenceSpan = item.Location.SourceSpan;
var sourceLine = sourceText.Lines.GetLineFromPosition(referenceSpan.Start);
var firstNonWhitespacePosition = sourceLine.GetFirstNonWhitespacePosition().Value;
......@@ -235,33 +232,18 @@ public async override void OnReferenceFound(INavigableItem definition, INavigabl
return classifiedLineParts.ToTaggedText();
}
private Task<RoslynDefinitionBucket> GetOrCreateDefinitionBucketAsync(
INavigableItem definition, CancellationToken cancellationToken)
private RoslynDefinitionBucket GetOrCreateDefinitionBucket(DefinitionItem definition)
{
lock (_gate)
{
Task<RoslynDefinitionBucket> bucketTask;
if (!_definitionToBucketTask.TryGetValue(definition, out bucketTask))
RoslynDefinitionBucket bucket;
if (!_definitionToBucket.TryGetValue(definition, out bucket))
{
bucketTask = CreateDefinitionBucketAsync(definition, cancellationToken);
_definitionToBucketTask.Add(definition, bucketTask);
bucket = new RoslynDefinitionBucket(_presenter, this, definition);
}
return bucketTask;
}
return bucket;
}
private async Task<RoslynDefinitionBucket> CreateDefinitionBucketAsync(
INavigableItem definitionItem, CancellationToken cancellationToken)
{
var entryData = await TryCreateNavigableItemEntryData(
definitionItem, isDefinition: true, cancellationToken: cancellationToken).ConfigureAwait(false);
if (entryData == null)
{
return null;
}
return new RoslynDefinitionBucket(this, definitionItem, entryData);
}
private void NotifySinksOfChangedVersion()
......
......@@ -27,7 +27,6 @@
<ItemGroup Label="Build Items">
<Compile Include="Implementation\StreamingFindReferencesPresenter.cs" />
<Compile Include="Implementation\StreamingFindReferencesPresenter.RoslynDefinitionBucket.cs" />
<Compile Include="Implementation\StreamingFindReferencesPresenter.EntryData.cs" />
<Compile Include="Implementation\StreamingFindReferencesPresenter.TableDataSourceFindReferencesContext.cs" />
<Compile Include="Implementation\StreamingFindReferencesPresenter.Subscription.cs" />
<Compile Include="Implementation\StreamingFindReferencesPresenter.TableEntriesSnapshot.cs" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册