diff --git a/Rubberduck.Core/UI/SelectionChangeService.cs b/Rubberduck.Core/UI/SelectionChangeService.cs index 3e15f475ef..cb25628731 100644 --- a/Rubberduck.Core/UI/SelectionChangeService.cs +++ b/Rubberduck.Core/UI/SelectionChangeService.cs @@ -40,6 +40,7 @@ private void OnVbeSelectionChanged(object sender, EventArgs e) { Task.Run(() => { + var selectedDeclaration = _selectedDeclarationProvider.SelectedDeclaration(); var eventArgs = new DeclarationChangedEventArgs(_vbe, selectedDeclaration); DispatchSelectedDeclaration(eventArgs); diff --git a/Rubberduck.Parsing/VBA/DeclarationCaching/DeclarationFinder.cs b/Rubberduck.Parsing/VBA/DeclarationCaching/DeclarationFinder.cs index bb1cc114fd..ba4c637069 100644 --- a/Rubberduck.Parsing/VBA/DeclarationCaching/DeclarationFinder.cs +++ b/Rubberduck.Parsing/VBA/DeclarationCaching/DeclarationFinder.cs @@ -640,14 +640,13 @@ public ParameterDeclaration FindParameterOfNonDefaultMemberFromSimpleArgumentNot { // argument is positional: work out its index var argumentList = argumentExpression.GetAncestor(); - var arguments = argumentList.GetDescendents().ToArray(); + var arguments = argumentList.children.Where(t => (t is VBAParser.ArgumentContext)).ToArray(); var parameterIndex = arguments - .Select((arg, index) => arg.GetDescendent() == argumentExpression ? (arg, index) : (null, -1)) - .SingleOrDefault(item => item.arg != null).index; + .Select((arg, index) => (arg: arg as ParserRuleContext, index)) + .SingleOrDefault(item => item.arg.ContainsTokenIndex(argumentExpression.Start.TokenIndex)).index; parameter = parameters - .OrderBy(p => p.Selection) .Select((param, index) => (param, index)) .SingleOrDefault(item => item.index == parameterIndex).param; } diff --git a/Rubberduck.Parsing/VBA/SelectedDeclarationProvider.cs b/Rubberduck.Parsing/VBA/SelectedDeclarationProvider.cs index d459e1ee05..162580cbf9 100644 --- a/Rubberduck.Parsing/VBA/SelectedDeclarationProvider.cs +++ b/Rubberduck.Parsing/VBA/SelectedDeclarationProvider.cs @@ -84,6 +84,12 @@ public Declaration SelectedDeclaration(QualifiedSelection qualifiedSelection) return candidateViaConstantDeclaration; } + var candidateViaArgumentCallSite = SelectedDeclarationViaArgument(qualifiedSelection, finder); + if (candidateViaArgumentCallSite != null) + { + return candidateViaArgumentCallSite; + } + var candidateViaContainingMember = SelectedMember(qualifiedSelection); if (candidateViaContainingMember != null) { @@ -93,6 +99,21 @@ public Declaration SelectedDeclaration(QualifiedSelection qualifiedSelection) return SelectedModule(qualifiedSelection); } + private static ParameterDeclaration SelectedDeclarationViaArgument(QualifiedSelection qualifiedSelection, DeclarationFinder finder) + { + var members = finder.Members(qualifiedSelection.QualifiedName).Where(m => m.DeclarationType.HasFlag(DeclarationType.Procedure)); + var enclosingProcedure = members.SingleOrDefault(m => m.Context.GetSelection().Contains(qualifiedSelection.Selection)); + var context = enclosingProcedure?.Context.GetDescendents() + .FirstOrDefault(m => m.GetSelection().ContainsFirstCharacter(qualifiedSelection.Selection)); + + if (context != null) + { + return finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(context, enclosingProcedure); + } + + return null; + } + private static Declaration SelectedDeclarationViaReference(QualifiedSelection qualifiedSelection, DeclarationFinder finder) { var referencesInModule = finder.IdentifierReferences(qualifiedSelection.QualifiedName);