Skip to content

Commit

Permalink
Make 'Find all References' argument-aware too
Browse files Browse the repository at this point in the history
  • Loading branch information
retailcoder committed Apr 22, 2021
1 parent 0ca3f6f commit 46452a1
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 25 deletions.
Expand Up @@ -19,11 +19,11 @@ public class CodeExplorerFindAllReferencesCommand : CodeExplorerCommandBase
};

private readonly RubberduckParserState _state;
private readonly FindAllReferencesService _finder;
private readonly FindAllReferencesAction _finder;

public CodeExplorerFindAllReferencesCommand(
RubberduckParserState state,
FindAllReferencesService finder,
FindAllReferencesAction finder,
IVbeEvents vbeEvents)
: base(vbeEvents)
{
Expand Down
Expand Up @@ -18,23 +18,23 @@ public class FindAllReferencesCommand : ComCommandBase
private readonly IDeclarationFinderProvider _declarationFinderProvider;
private readonly ISelectedDeclarationProvider _selectedDeclarationProvider;
private readonly IVBE _vbe;
private readonly FindAllReferencesService _finder;
private readonly FindAllReferencesAction _service;

public FindAllReferencesCommand(
IParserStatusProvider parserStatusProvider,
IDeclarationFinderProvider declarationFinderProvider,
ISelectedDeclarationProvider selectedDeclarationProvider,
IVBE vbe,
ISearchResultsWindowViewModel viewModel,
FindAllReferencesService finder,
FindAllReferencesAction finder,
IVbeEvents vbeEvents)
: base(vbeEvents)
{
_parserStatusProvider = parserStatusProvider;
_declarationFinderProvider = declarationFinderProvider;
_selectedDeclarationProvider = selectedDeclarationProvider;
_vbe = vbe;
_finder = finder;
_service = finder;

AddToCanExecuteEvaluation(SpecialEvaluateCanExecute);
}
Expand Down Expand Up @@ -77,7 +77,7 @@ protected override void OnExecute(object parameter)
return;
}

_finder.FindAllReferences(declaration);
_service.FindAllReferences(declaration);
}

private Declaration FindTarget(object parameter)
Expand Down
Expand Up @@ -125,9 +125,9 @@ private static string TypeName(Declaration declaration, bool multipleControls, s
return RubberduckUI.ContextMultipleControlsSelection;
}

var friendlyTypeName = declaration.AsTypeName.Equals("IDispatch", System.StringComparison.InvariantCultureIgnoreCase)
var friendlyTypeName = "IDispatch".Equals(declaration.AsTypeName, System.StringComparison.InvariantCultureIgnoreCase)
? "Object"
: declaration.AsTypeName;
: declaration.AsTypeName ?? string.Empty;

var typeName = declaration.IsArray
? $"{friendlyTypeName}()"
Expand Down
Expand Up @@ -64,7 +64,10 @@ private void OnSelectionChange(object sender, DeclarationChangedEventArgs e)
caption = e.FallbackCaption;
}

var refCount = e.Declaration?.References.Count() ?? 0;
var refCount = (e.Declaration?.References.Count() ?? 0)
+ ((e.Declaration is ParameterDeclaration parameter)
? parameter.ArgumentReferences.Count()
: 0);
var description = e.Declaration?.DescriptionString ?? string.Empty;
//& renders the next character as if it was an accelerator.
SetContextSelectionCaption(caption?.Replace("&", "&&"), refCount, description);
Expand Down
Expand Up @@ -12,7 +12,7 @@

namespace Rubberduck.UI.Controls
{
public class FindAllReferencesService : IDisposable
public class FindAllReferencesAction : IDisposable
{
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
private readonly INavigateCommand _navigateCommand;
Expand All @@ -22,7 +22,7 @@ public class FindAllReferencesService : IDisposable
private readonly SearchResultPresenterInstanceManager _presenterService;
private readonly IUiDispatcher _uiDispatcher;

public FindAllReferencesService(
public FindAllReferencesAction(
INavigateCommand navigateCommand,
IMessageBox messageBox,
RubberduckParserState state,
Expand Down Expand Up @@ -92,7 +92,21 @@ public void FindAllReferences(Declaration declaration, ReferenceInfo reference)
return;
}

var usages = _state.DeclarationFinder.FindAllReferenceUsesInProject(project, reference, out var referenceProject);
var usages = _state.DeclarationFinder.FindAllReferenceUsesInProject(project, reference, out var referenceProject)
.Select(usage =>
new SearchResultItem(usage.ParentNonScoping,
new NavigateCodeEventArgs(usage.QualifiedModuleName, usage.Selection),
GetModuleLine(usage.QualifiedModuleName, usage.Selection.StartLine)))
.ToList();

if (declaration is ParameterDeclaration parameter)
{
usages.AddRange(parameter.ArgumentReferences.Select(usage =>
new SearchResultItem(usage.ParentNonScoping,
new NavigateCodeEventArgs(usage.QualifiedModuleName, usage.Selection),
GetModuleLine(usage.QualifiedModuleName, usage.Selection.StartLine))));
}

if (!usages.Any())
{
_messageBox.NotifyWarn(string.Format(RubberduckUI.AllReferences_NoneFoundReference, referenceProject.IdentifierName), RubberduckUI.Rubberduck);
Expand Down Expand Up @@ -130,13 +144,8 @@ private string GetModuleLine(QualifiedModuleName module, int line)
}
}

private SearchResultsViewModel CreateViewModel(ProjectDeclaration project, ProjectDeclaration reference, IEnumerable<IdentifierReference> usages)
private SearchResultsViewModel CreateViewModel(ProjectDeclaration project, ProjectDeclaration reference, IEnumerable<SearchResultItem> results)
{
var results = usages.Select(usage =>
new SearchResultItem(usage.ParentNonScoping,
new NavigateCodeEventArgs(usage.QualifiedModuleName, usage.Selection),
GetModuleLine(usage.QualifiedModuleName, usage.Selection.StartLine)));

var viewModel = new SearchResultsViewModel(_navigateCommand,
string.Format(RubberduckUI.SearchResults_AllReferencesTabFormat, reference.IdentifierName), project, results);

Expand All @@ -152,7 +161,14 @@ private SearchResultsViewModel CreateViewModel(Declaration declaration)
new SearchResultItem(
reference.ParentNonScoping,
new NavigateCodeEventArgs(reference.QualifiedModuleName, reference.Selection),
GetModuleLine(reference.QualifiedModuleName, reference.Selection.StartLine)));
GetModuleLine(reference.QualifiedModuleName, reference.Selection.StartLine)))
.Concat((declaration is ParameterDeclaration parameter)
? parameter.ArgumentReferences.Select(argument =>
new SearchResultItem(
argument.ParentNonScoping,
new NavigateCodeEventArgs(argument.QualifiedModuleName, argument.Selection),
GetModuleLine(argument.QualifiedModuleName, argument.Selection.StartLine)))
: Enumerable.Empty<SearchResultItem>());

var accessor = declaration.DeclarationType.HasFlag(DeclarationType.PropertyGet) ? "(get)"
: declaration.DeclarationType.HasFlag(DeclarationType.PropertyLet) ? "(let)"
Expand Down
Expand Up @@ -1591,12 +1591,10 @@ public bool IsReferenceUsedInProject(ProjectDeclaration project, ReferenceInfo r
}

referenceProject = GetProjectDeclarationForReference(reference);

if (!_referencesByProjectId.TryGetValue(referenceProject.ProjectId, out var directReferences))
{
return output;
}

output.AddRange(directReferences);

var projectId = referenceProject.ProjectId;
Expand Down
8 changes: 4 additions & 4 deletions RubberduckTests/Commands/FindAllReferencesTests.cs
Expand Up @@ -525,11 +525,11 @@ private static SearchResultsWindowViewModel ArrangeSearchResultsWindowViewModel(
return new SearchResultsWindowViewModel();
}

private static FindAllReferencesService ArrangeFindAllReferencesService(RubberduckParserState state,
private static FindAllReferencesAction ArrangeFindAllReferencesService(RubberduckParserState state,
ISearchResultsWindowViewModel viewModel, INavigateCommand navigateCommand = null, IMessageBox messageBox = null,
SearchResultPresenterInstanceManager presenterService = null, IUiDispatcher uiDispatcher = null)
{
return new FindAllReferencesService(
return new FindAllReferencesAction(
navigateCommand ?? new Mock<INavigateCommand>().Object,
messageBox ?? new Mock<IMessageBox>().Object,
state,
Expand All @@ -547,13 +547,13 @@ private static SearchResultsWindowViewModel ArrangeSearchResultsWindowViewModel(
}

private static FindAllReferencesCommand ArrangeFindAllReferencesCommand(RubberduckParserState state,
Mock<IVBE> vbe, ISearchResultsWindowViewModel viewModel, FindAllReferencesService finder)
Mock<IVBE> vbe, ISearchResultsWindowViewModel viewModel, FindAllReferencesAction finder)
{
return ArrangeFindAllReferencesCommand(state, vbe, viewModel, finder, MockVbeEvents.CreateMockVbeEvents(vbe));
}

private static FindAllReferencesCommand ArrangeFindAllReferencesCommand(RubberduckParserState state,
Mock<IVBE> vbe, ISearchResultsWindowViewModel viewModel, FindAllReferencesService finder,
Mock<IVBE> vbe, ISearchResultsWindowViewModel viewModel, FindAllReferencesAction finder,
Mock<IVbeEvents> vbeEvents)
{
var selectionService = new SelectionService(vbe.Object, state.ProjectsProvider);
Expand Down

0 comments on commit 46452a1

Please sign in to comment.