提交 69e069ba 编写于 作者: C CyrusNajmabadi

Remove the synchrounous FindRefs codepaths for C# and VB.

The synchronous API still exists for TS to use until they
move over to the entirely async api.
上级 4f7b313c
......@@ -108,7 +108,6 @@
<Compile Include="EventHookup\IHACK_EventHookupDismissalOnBufferChangePreventerService.cs" />
<Compile Include="ExtractInterface\ExtractInterfaceCommandHandler.cs" />
<Compile Include="ExtractMethod\ExtractMethodCommandHandler.cs" />
<Compile Include="FindReferences\CSharpFindReferencesService.cs" />
<Compile Include="FindUsages\CSharpFindUsagesService.cs" />
<Compile Include="Formatting\CSharpEditorFormattingService.cs" />
<Compile Include="Formatting\Indentation\CSharpIndentationService.cs" />
......
// 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.Collections.Generic;
using System.Composition;
using Microsoft.CodeAnalysis.Editor.FindReferences;
using Microsoft.CodeAnalysis.Editor.Host;
using Microsoft.CodeAnalysis.Host.Mef;
namespace Microsoft.CodeAnalysis.Editor.CSharp.FindReferences
{
[ExportLanguageService(typeof(IFindReferencesService), LanguageNames.CSharp), Shared]
internal class CSharpFindReferencesService : AbstractFindReferencesService
{
[ImportingConstructor]
public CSharpFindReferencesService(
[ImportMany] IEnumerable<IDefinitionsAndReferencesPresenter> referencedSymbolsPresenters,
[ImportMany] IEnumerable<INavigableItemsPresenter> navigableItemsPresenters)
: base(referencedSymbolsPresenters, navigableItemsPresenters)
{
}
}
}
\ No newline at end of file
......@@ -398,7 +398,6 @@
<Compile Include="Implementation\EndConstructGeneration\IEndConstructGenerationService.cs" />
<Compile Include="Implementation\ExtractInterface\AbstractExtractInterfaceCommandHandler.cs" />
<Compile Include="Implementation\ExtractMethod\AbstractExtractMethodCommandHandler.cs" />
<Compile Include="FindReferences\AbstractFindReferencesService.cs" />
<Compile Include="FindReferences\FindReferencesCommandHandler.cs" />
<Compile Include="FindReferences\IFindReferencesService.cs" />
<Compile Include="Implementation\ForegroundNotification\ForegroundNotificationService.cs" />
......
// 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.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Editor.FindUsages;
using Microsoft.CodeAnalysis.Editor.Host;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.FindSymbols;
using Microsoft.CodeAnalysis.FindUsages;
using Microsoft.CodeAnalysis.Navigation;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.Editor.FindReferences
{
internal abstract partial class AbstractFindReferencesService :
ForegroundThreadAffinitizedObject, IFindReferencesService
{
private readonly IEnumerable<IDefinitionsAndReferencesPresenter> _referenceSymbolPresenters;
private readonly IEnumerable<INavigableItemsPresenter> _navigableItemPresenters;
protected AbstractFindReferencesService(
IEnumerable<IDefinitionsAndReferencesPresenter> referenceSymbolPresenters,
IEnumerable<INavigableItemsPresenter> navigableItemPresenters)
{
_referenceSymbolPresenters = referenceSymbolPresenters;
_navigableItemPresenters = navigableItemPresenters;
}
private async Task<Tuple<IEnumerable<ReferencedSymbol>, Solution>> FindReferencedSymbolsAsync(
Document document, int position, IWaitContext waitContext)
{
var cancellationToken = waitContext.CancellationToken;
var symbolAndProject = await FindUsagesHelpers.GetRelevantSymbolAndProjectAtPositionAsync(
document, position, cancellationToken).ConfigureAwait(false);
if (symbolAndProject == null)
{
return null;
}
var symbol = symbolAndProject?.symbol;
var project = symbolAndProject?.project;
var displayName = FindUsagesHelpers.GetDisplayName(symbol);
waitContext.Message = string.Format(
EditorFeaturesResources.Finding_references_of_0, displayName);
var result = await SymbolFinder.FindReferencesAsync(symbol, project.Solution, cancellationToken).ConfigureAwait(false);
return Tuple.Create(result, project.Solution);
}
public bool TryFindReferences(Document document, int position, IWaitContext waitContext)
{
var cancellationToken = waitContext.CancellationToken;
var result = this.FindReferencedSymbolsAsync(document, position, waitContext).WaitAndGetResult(cancellationToken);
return TryDisplayReferences(result, cancellationToken);
}
private bool TryDisplayReferences(IEnumerable<INavigableItem> result)
{
if (result != null && result.Any())
{
var title = result.First().DisplayTaggedParts.JoinText();
foreach (var presenter in _navigableItemPresenters)
{
presenter.DisplayResult(title, result);
return true;
}
}
return false;
}
private bool TryDisplayReferences(
Tuple<IEnumerable<ReferencedSymbol>, Solution> result,
CancellationToken cancellationToken)
{
if (result != null && result.Item1 != null)
{
var solution = result.Item2;
var factory = solution.Workspace.Services.GetService<IDefinitionsAndReferencesFactory>();
var definitionsAndReferences = factory.CreateDefinitionsAndReferences(
solution, result.Item1, includeHiddenLocations: false, cancellationToken: cancellationToken);
foreach (var presenter in _referenceSymbolPresenters)
{
presenter.DisplayResult(definitionsAndReferences);
return true;
}
}
return false;
}
}
}
\ No newline at end of file
......@@ -74,15 +74,12 @@ public void ExecuteCommand(FindReferencesCommandArgs args, Action nextHandler)
private bool TryExecuteCommand(int caretPosition, Document document)
{
var streamingService = document.GetLanguageService<IFindUsagesService>();
var synchronousService = document.GetLanguageService<IFindReferencesService>();
var streamingPresenter = GetStreamingPresenter();
// See if we're running on a host that can provide streaming results.
// We'll both need a FAR service that can stream results to us, and
// a presenter that can accept streamed results.
var streamingEnabled = document.Project.Solution.Workspace.Options.GetOption(FeatureOnOffOptions.StreamingFindReferences, document.Project.Language);
if (streamingEnabled && streamingService != null && streamingPresenter != null)
if (streamingService != null && streamingPresenter != null)
{
StreamingFindReferences(document, caretPosition, streamingService, streamingPresenter);
return true;
......@@ -92,6 +89,7 @@ private bool TryExecuteCommand(int caretPosition, Document document)
// or the host has no way to present results in a streaming manner.
// Fall back to the old non-streaming approach to finding and presenting
// results.
var synchronousService = document.GetLanguageService<IFindReferencesService>();
if (synchronousService != null)
{
FindReferences(document, synchronousService, caretPosition);
......
......@@ -90,10 +90,6 @@ internal static class FeatureOnOffOptions
public static readonly PerLanguageOption<bool> RefactoringVerification = new PerLanguageOption<bool>(
nameof(FeatureOnOffOptions), nameof(RefactoringVerification), defaultValue: false);
[ExportOption]
public static readonly PerLanguageOption<bool> StreamingFindReferences = new PerLanguageOption<bool>(
nameof(FeatureOnOffOptions), nameof(StreamingFindReferences), defaultValue: true);
[ExportOption]
public static readonly PerLanguageOption<bool> StreamingGoToImplementation = new PerLanguageOption<bool>(
nameof(FeatureOnOffOptions), nameof(StreamingGoToImplementation), defaultValue: true);
......
......@@ -91,7 +91,6 @@
<Compile Include="EndConstructGeneration\VisualBasicEndConstructGenerationService.vb" />
<Compile Include="ExtractInterface\ExtractInterfaceCommandHandler.vb" />
<Compile Include="ExtractMethod\ExtractMethodCommandHandler.vb" />
<Compile Include="FindReferences\VisualBasicFindReferencesService.vb" />
<Compile Include="FindUsages\VisualBasicFindUsagesService.vb" />
<Compile Include="Formatting\Indentation\SmartTokenFormatter.vb" />
<Compile Include="Formatting\Indentation\SmartTokenFormatterCommandHandler.vb" />
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.Composition
Imports Microsoft.CodeAnalysis.Editor.FindReferences
Imports Microsoft.CodeAnalysis.Editor.Host
Imports Microsoft.CodeAnalysis.Host.Mef
Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.FindReferences
<ExportLanguageService(GetType(IFindReferencesService), LanguageNames.VisualBasic), [Shared]>
Friend Class VisualBasicFindReferencesService
Inherits AbstractFindReferencesService
<ImportingConstructor>
Protected Sub New(<ImportMany> referencedSymbolsPresenters As IEnumerable(Of IDefinitionsAndReferencesPresenter),
<ImportMany> navigableItemsPresenters As IEnumerable(Of INavigableItemsPresenter))
MyBase.New(referencedSymbolsPresenters, navigableItemsPresenters)
End Sub
End Class
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.
先完成此消息的编辑!
想要评论请 注册