private static Declaration SelectedDeclarationViaArgument(QualifiedSelection qualifiedSelection, DeclarationFinder finder) { var members = finder.Members(qualifiedSelection.QualifiedName) .Where(m => (m.DeclarationType.HasFlag(DeclarationType.Procedure) || // includes PropertyLet and PropertySet and LibraryProcedure m.DeclarationType.HasFlag(DeclarationType.Function)) && // includes PropertyGet and LibraryFunction !m.DeclarationType.HasFlag(DeclarationType.LibraryFunction) && !m.DeclarationType.HasFlag(DeclarationType.LibraryProcedure)); var enclosingProcedure = members.SingleOrDefault(m => m.Context.GetSelection().Contains(qualifiedSelection.Selection)); if (enclosingProcedure == null) { return(null); } var allArguments = enclosingProcedure.Context.GetDescendents <VBAParser.ArgumentContext>(); var context = allArguments .Where(arg => arg.missingArgument() == null) .FirstOrDefault(m => { var isOnWhitespace = false; if (m.TryGetPrecedingContext <VBAParser.WhiteSpaceContext>(out var whitespace)) { isOnWhitespace = whitespace.GetSelection().ContainsFirstCharacter(qualifiedSelection.Selection); } return(isOnWhitespace || m.GetSelection().ContainsFirstCharacter(qualifiedSelection.Selection)); }); var skippedArg = allArguments .Where(arg => arg.missingArgument() != null) .FirstOrDefault(m => { var isOnWhitespace = false; if (m.TryGetPrecedingContext <VBAParser.WhiteSpaceContext>(out var whitespace)) { isOnWhitespace = whitespace.GetSelection().ContainsFirstCharacter(qualifiedSelection.Selection); } return(isOnWhitespace || m.GetSelection().ContainsFirstCharacter(qualifiedSelection.Selection)); }); context = context ?? skippedArg; if (context != null) { return((Declaration)finder.FindParameterOfNonDefaultMemberFromSimpleArgumentNotPassedByValExplicitly(context, enclosingProcedure) ?? finder.FindInvokedMemberFromArgumentContext(context, qualifiedSelection.QualifiedName)); // fallback to the invoked procedure declaration } return(null); }