Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make SelectedDeclarationProvider argument-aware #5740

Merged
merged 10 commits into from Apr 24, 2021
Expand Up @@ -71,7 +71,8 @@ private bool IsAssignedByRefArgument(Declaration enclosingProcedure, IdentifierR
return false;
}

var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argExpression, enclosingProcedure);
var argument = argExpression.GetAncestor<VBAParser.ArgumentContext>();
var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argument, enclosingProcedure);

// note: not recursive, by design.
return parameter != null
Expand Down
Expand Up @@ -142,7 +142,8 @@ private static bool IsPotentiallyAssignedByRefArgument(QualifiedModuleName modul
return false;
}

var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argExpression, module);
var argument = argExpression.GetAncestor<VBAParser.ArgumentContext>();
var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argument, module);

if (parameter == null)
{
Expand Down
Expand Up @@ -114,7 +114,7 @@ private static bool TryFindParameterIndex(ParameterDeclaration parameter, IParam

private static bool ParameterAtIndexIsNotUsed(IParameterizedDeclaration declaration, int parameterIndex)
{
var parameter = declaration.Parameters.ElementAtOrDefault(parameterIndex);
var parameter = declaration?.Parameters.ElementAtOrDefault(parameterIndex);
return parameter != null
&& !parameter.References.Any();
}
Expand Down
Expand Up @@ -88,7 +88,8 @@ private static bool IsUsageAsAssignedToByRefArgument(IdentifierReference referen
return false;
}

var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argExpression, reference.QualifiedModuleName);
var argument = argExpression.GetAncestor<VBAParser.ArgumentContext>();
var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argument, reference.QualifiedModuleName);

if (parameter == null)
{
Expand Down
Expand Up @@ -155,7 +155,8 @@ private static bool IsAssignedByRefArgument(Declaration enclosingProcedure, Iden
return false;
}

var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argExpression, enclosingProcedure);
var argument = argExpression.GetAncestor<VBAParser.ArgumentContext>();
var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argument, enclosingProcedure);

// note: not recursive, by design.
return parameter != null
Expand Down
Expand Up @@ -69,7 +69,8 @@ private static bool IsAssignedByRefArgument(Declaration enclosingProcedure, Iden
return false;
}

var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argExpression, enclosingProcedure);
var argument = argExpression.GetAncestor<VBAParser.ArgumentContext>();
var parameter = finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(argument, enclosingProcedure);

// note: not recursive, by design.
return parameter != null
Expand Down
16 changes: 9 additions & 7 deletions Rubberduck.Core/AppMenu.cs
Expand Up @@ -2,6 +2,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using NLog;
using Rubberduck.Parsing;
using Rubberduck.Parsing.VBA;
Expand Down Expand Up @@ -75,26 +77,26 @@ private void InitializeRubberduckMenus()
_logger.Error(exception);
}
}
EvaluateCanExecute(_parser.State);
EvaluateCanExecuteAsync(_parser.State, CancellationToken.None).Wait();
}

public void OnSelectedDeclarationChange(object sender, DeclarationChangedEventArgs e)
public async void OnSelectedDeclarationChange(object sender, DeclarationChangedEventArgs e)
{
EvaluateCanExecute(_parser.State);
await EvaluateCanExecuteAsync(_parser.State, CancellationToken.None);
}

private void OnParserStateChanged(object sender, EventArgs e)
private async void OnParserStateChanged(object sender, EventArgs e)
{
EvaluateCanExecute(_parser.State);
await EvaluateCanExecuteAsync(_parser.State, CancellationToken.None);
}

public void EvaluateCanExecute(RubberduckParserState state)
public async Task EvaluateCanExecuteAsync(RubberduckParserState state, CancellationToken token)
{
foreach (var menu in _menus)
{
try
{
menu.EvaluateCanExecute(state);
await menu.EvaluateCanExecuteAsync(state, token);
}
catch (Exception exception)
{
Expand Down
@@ -1,5 +1,6 @@
using Rubberduck.Parsing.Grammar;
using Rubberduck.Resources;
using Tokens = Rubberduck.Resources.Tokens;

namespace Rubberduck.Refactorings.ExtractMethod
{
Expand Down
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 @@ -2,6 +2,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using NLog;
using Rubberduck.Parsing.UIContext;
using Rubberduck.Parsing.VBA;
Expand Down Expand Up @@ -140,37 +142,45 @@ private ICommandBarControl InitializeChildControl(ICommandMenuItem item)

if (item.Command != null)
{
child.Click += child_Click;
child.Click += Child_Click;
}
return child;
}

public void EvaluateCanExecute(RubberduckParserState state)
public async Task EvaluateCanExecuteAsync(RubberduckParserState state, CancellationToken token)
{
foreach (var kvp in _items.Where(kv => kv.Key != null && kv.Value != null && !kv.Value.IsWrappingNullReference))
var usableMenuItems = _items.Where(kv => kv.Key != null && kv.Value != null && !kv.Value.IsWrappingNullReference);
foreach (var kvp in usableMenuItems)
{
token.ThrowIfCancellationRequested();
var commandItem = kvp.Key;
var canExecute = false;
try
{
canExecute = commandItem.EvaluateCanExecute(state);

canExecute = await Task.Run(() => commandItem.EvaluateCanExecute(state), token);
}
catch (Exception e)
{
Logger.Error(e, $"{commandItem?.GetType().Name ?? nameof(ICommandMenuItem)}.EvaluateCanExecute(RubberduckParserState) threw an exception.");
Logger.Error(e,
$"{commandItem?.GetType().Name ?? nameof(ICommandMenuItem)}.EvaluateCanExecute(RubberduckParserState) threw an exception.");
}

token.ThrowIfCancellationRequested();
try
{
kvp.Value.IsEnabled = canExecute;
if (commandItem?.HiddenWhenDisabled ?? false)
_uiDispatcher.InvokeAsync(() =>
{
kvp.Value.IsVisible = canExecute;
}
kvp.Value.IsEnabled = canExecute;
if (commandItem?.HiddenWhenDisabled ?? false)
{
kvp.Value.IsVisible = canExecute;
}
});
}
catch (COMException exception)
catch (Exception exception)
{
Logger.Error(exception,$"COMException while trying to set IsEnabled and IsVisible on {commandItem?.GetType().Name ?? nameof(ICommandMenuItem)}");
Logger.Error(exception,
$"Setting IsEnabled and IsVisible on {commandItem?.GetType().Name ?? nameof(ICommandMenuItem)} threw an exception.");
}
}
}
Expand Down Expand Up @@ -231,7 +241,7 @@ private void RemoveChildren()
{
if (!button.IsWrappingNullReference)
{
button.Click -= child_Click;
button.Click -= Child_Click;
}
button.Delete();
button.Dispose();
Expand All @@ -244,7 +254,7 @@ private void RemoveChildren()
_items.Clear();
}

private void child_Click(object sender, CommandBarButtonClickEventArgs e)
private void Child_Click(object sender, CommandBarButtonClickEventArgs e)
{
ICommandMenuItem item;
try
Expand Down