Skip to content

Commit 5574017

Browse files
committed
Merge remote-tracking branch 'upstream/next' into Issue5109_Consolidate_copy_command_logic
2 parents be14f14 + 2ccff5a commit 5574017

File tree

126 files changed

+4629
-2260
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

126 files changed

+4629
-2260
lines changed

Rubberduck.CodeAnalysis/Inspections/Concrete/ObsoleteGlobalInspection.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Linq;
33
using Rubberduck.Common;
44
using Rubberduck.Inspections.Abstract;
5+
using Rubberduck.Inspections.Inspections.Extensions;
56
using Rubberduck.Inspections.Results;
67
using Rubberduck.Parsing.Inspections.Abstract;
78
using Rubberduck.Resources.Inspections;

Rubberduck.CodeAnalysis/Inspections/Concrete/ParameterCanBeByValInspection.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.Linq;
5-
using Rubberduck.Common;
65
using Rubberduck.Inspections.Abstract;
76
using Rubberduck.Inspections.Results;
87
using Rubberduck.Parsing;
@@ -12,7 +11,6 @@
1211
using Rubberduck.Parsing.Symbols;
1312
using Rubberduck.Parsing.VBA;
1413
using Rubberduck.Parsing.VBA.Extensions;
15-
using Rubberduck.Inspections.Inspections.Extensions;
1614

1715
namespace Rubberduck.Inspections.Concrete
1816
{
@@ -61,8 +59,8 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
6159
parametersThatCanBeChangedToBePassedByVal.AddRange(InterFaceMembersThatCanBeChangedToBePassedByVal(interfaceDeclarationMembers));
6260

6361
var eventMembers = State.DeclarationFinder.UserDeclarations(DeclarationType.Event).ToList();
64-
var formEventHandlerScopeDeclarations = State.FindFormEventHandlers();
65-
var eventHandlerScopeDeclarations = State.DeclarationFinder.FindEventHandlers().Concat(parameters.FindUserEventHandlers());
62+
var formEventHandlerScopeDeclarations = State.DeclarationFinder.FindFormEventHandlers();
63+
var eventHandlerScopeDeclarations = State.DeclarationFinder.FindEventHandlers();
6664
var eventScopeDeclarations = eventMembers
6765
.Concat(formEventHandlerScopeDeclarations)
6866
.Concat(eventHandlerScopeDeclarations)
@@ -157,11 +155,8 @@ private IEnumerable<ParameterDeclaration> EventMembersThatCanBeChangedToBePassed
157155

158156
var parameterCanBeChangedToBeByVal = eventParameters.Select(parameter => parameter.IsByRef).ToList();
159157

160-
//todo: Find a better way to find the handlers.
161158
var eventHandlers = State.DeclarationFinder
162-
.AllUserDeclarations
163-
.FindHandlersForEvent(memberDeclaration)
164-
.Select(s => s.Item2)
159+
.FindEventHandlers(memberDeclaration)
165160
.ToList();
166161

167162
foreach (var eventHandler in eventHandlers.OfType<IParameterizedDeclaration>())

Rubberduck.CodeAnalysis/Inspections/Concrete/ProcedureCanBeWrittenAsFunctionInspection.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System.Collections.Generic;
22
using System.Linq;
33
using Antlr4.Runtime;
4-
using Rubberduck.Common;
54
using Rubberduck.Inspections.Abstract;
65
using Rubberduck.Inspections.Results;
76
using Rubberduck.Parsing;
@@ -11,7 +10,6 @@
1110
using Rubberduck.Parsing.Symbols;
1211
using Rubberduck.Parsing.VBA;
1312
using Rubberduck.VBEditor;
14-
using Rubberduck.Inspections.Inspections.Extensions;
1513

1614
namespace Rubberduck.Inspections.Concrete
1715
{
@@ -71,21 +69,20 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
7169
return Listener.Contexts
7270
.Where(context => context.Context.Parent is VBAParser.SubStmtContext
7371
&& HasArgumentReferencesWithIsAssignmentFlagged(context))
74-
.Select(context => GetSubStmtParentDeclaration(context))
72+
.Select(GetSubStmtParentDeclaration)
7573
.Where(decl => decl != null &&
7674
!ignored.Contains(decl) &&
7775
userDeclarations.Where(item => item.IsWithEvents)
78-
.All(withEvents => userDeclarations.FindEventProcedures(withEvents) == null) &&
76+
.All(withEvents => !State.DeclarationFinder.FindHandlersForWithEventsField(withEvents).Any()) &&
7977
!builtinHandlers.Contains(decl))
8078
.Select(result => new DeclarationInspectionResult(this,
8179
string.Format(InspectionResults.ProcedureCanBeWrittenAsFunctionInspection, result.IdentifierName),
8280
result));
8381

8482
bool HasArgumentReferencesWithIsAssignmentFlagged(QualifiedContext<ParserRuleContext> context)
8583
{
86-
return contextLookup.TryGetValue(context.Context.GetChild<VBAParser.ArgContext>(), out Declaration decl)
87-
? decl.References.Any(rf => rf.IsAssignment)
88-
: false;
84+
return contextLookup.TryGetValue(context.Context.GetChild<VBAParser.ArgContext>(), out Declaration decl)
85+
&& decl.References.Any(rf => rf.IsAssignment);
8986
}
9087

9188
Declaration GetSubStmtParentDeclaration(QualifiedContext<ParserRuleContext> context)

Rubberduck.CodeAnalysis/Inspections/Concrete/ProcedureNotUsedInspection.cs

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22
using System.Linq;
33
using Rubberduck.Common;
44
using Rubberduck.Inspections.Abstract;
5+
using Rubberduck.Inspections.Inspections.Extensions;
56
using Rubberduck.Inspections.Results;
67
using Rubberduck.Parsing.Inspections.Abstract;
78
using Rubberduck.Resources.Inspections;
89
using Rubberduck.Parsing.Symbols;
910
using Rubberduck.Parsing.VBA;
11+
using Rubberduck.Parsing.VBA.Extensions;
1012
using Rubberduck.VBEditor.SafeComWrappers;
1113

1214
namespace Rubberduck.Inspections.Concrete
@@ -58,40 +60,19 @@ public ProcedureNotUsedInspection(RubberduckParserState state) : base(state) { }
5860

5961
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
6062
{
61-
var declarations = UserDeclarations.ToList();
62-
6363
var classes = State.DeclarationFinder.UserDeclarations(DeclarationType.ClassModule)
6464
.Concat(State.DeclarationFinder.UserDeclarations(DeclarationType.Document))
6565
.ToList();
6666
var modules = State.DeclarationFinder.UserDeclarations(DeclarationType.ProceduralModule).ToList();
6767

68-
var handlers = State.DeclarationFinder.UserDeclarations(DeclarationType.Control)
69-
.SelectMany(control => declarations.FindEventHandlers(control)).ToList();
68+
var handlers = State.DeclarationFinder.FindEventHandlers().ToHashSet();
7069

71-
var builtInHandlers = State.DeclarationFinder.FindEventHandlers();
72-
handlers.AddRange(builtInHandlers);
70+
var interfaceMembers = State.DeclarationFinder.FindAllInterfaceMembers().ToHashSet();
71+
var implementingMembers = State.DeclarationFinder.FindAllInterfaceImplementingMembers().ToHashSet();
7372

74-
var withEventFields = State.DeclarationFinder.UserDeclarations(DeclarationType.Variable).Where(item => item.IsWithEvents).ToList();
75-
var withHanders = withEventFields
76-
.SelectMany(field => State.DeclarationFinder.FindHandlersForWithEventsField(field))
73+
var items = State.AllUserDeclarations
74+
.Where(item => !IsIgnoredDeclaration(item, interfaceMembers, implementingMembers, handlers, classes, modules))
7775
.ToList();
78-
79-
handlers.AddRange(withHanders);
80-
81-
var forms = State.DeclarationFinder.UserDeclarations(DeclarationType.ClassModule)
82-
.Where(item => item.QualifiedName.QualifiedModuleName.ComponentType == ComponentType.UserForm)
83-
.ToList();
84-
85-
if (forms.Any())
86-
{
87-
handlers.AddRange(forms.SelectMany(form => State.FindFormEventHandlers(form)));
88-
}
89-
90-
var interfaceMembers = State.DeclarationFinder.FindAllInterfaceMembers().ToList();
91-
var implementingMembers = State.DeclarationFinder.FindAllInterfaceImplementingMembers().ToList();
92-
93-
var items = declarations
94-
.Where(item => !IsIgnoredDeclaration(item, interfaceMembers, implementingMembers, handlers, classes, modules)).ToList();
9576
var issues = items.Select(issue => new DeclarationInspectionResult(this,
9677
string.Format(InspectionResults.IdentifierNotUsedInspection, issue.DeclarationType.ToLocalizedString(), issue.IdentifierName),
9778
issue));
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.Globalization;
2+
using Rubberduck.Parsing.Symbols;
3+
using Rubberduck.Resources;
4+
5+
namespace Rubberduck.Inspections.Inspections.Extensions
6+
{
7+
public static class DeclarationTypeExtensions
8+
{
9+
public static string ToLocalizedString(this DeclarationType type)
10+
{
11+
return RubberduckUI.ResourceManager.GetString("DeclarationType_" + type, CultureInfo.CurrentUICulture);
12+
}
13+
}
14+
}

Rubberduck.CodeAnalysis/QuickFixes/ExpandBangNotationQuickFix.cs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
using System.Linq;
1+
using System.Collections.Generic;
2+
using System.Linq;
23
using Antlr4.Runtime;
34
using Rubberduck.Inspections.Abstract;
45
using Rubberduck.Inspections.Concrete;
56
using Rubberduck.Parsing.Grammar;
67
using Rubberduck.Parsing.Inspections.Abstract;
78
using Rubberduck.Parsing.Rewriter;
9+
using Rubberduck.Parsing.Symbols;
810
using Rubberduck.Parsing.VBA;
911
using Rubberduck.Parsing.VBA.DeclarationCaching;
1012
using Rubberduck.VBEditor;
@@ -59,10 +61,34 @@ private void InsertDefaultMember(VBAParser.DictionaryAccessContext dictionaryAcc
5961
private string DefaultMemberAccessCode(QualifiedSelection selection, DeclarationFinder finder)
6062
{
6163
var defaultMemberAccesses = finder.IdentifierReferences(selection);
62-
var defaultMemberNames = defaultMemberAccesses.Select(reference => reference.Declaration.IdentifierName);
64+
var defaultMemberNames = defaultMemberAccesses
65+
.Select(DefaultMemberName)
66+
.Select(declarationName => IsNotLegalIdentifierName(declarationName)
67+
? $"[{declarationName}]"
68+
: declarationName);
6369
return $".{string.Join("().", defaultMemberNames)}";
6470
}
6571

72+
private static string DefaultMemberName(IdentifierReference defaultMemberReference)
73+
{
74+
var defaultMemberMemberName = defaultMemberReference.Declaration.QualifiedName;
75+
var fullDefaultMemberName = $"{defaultMemberMemberName.QualifiedModuleName.ProjectName}.{defaultMemberMemberName.QualifiedModuleName.ComponentName}.{defaultMemberMemberName.MemberName}";
76+
77+
if (DefaultMemberOverrides.TryGetValue(fullDefaultMemberName, out var defaultMemberOverride))
78+
{
79+
return defaultMemberOverride;
80+
}
81+
82+
return defaultMemberMemberName.MemberName;
83+
}
84+
85+
private bool IsNotLegalIdentifierName(string declarationName)
86+
{
87+
return string.IsNullOrEmpty(declarationName)
88+
|| NonIdentifierCharacters.Any(character => declarationName.Contains(character))
89+
|| AdditionalNonFirstIdentifierCharacters.Contains(declarationName[0]); ;
90+
}
91+
6692
public override string Description(IInspectionResult result)
6793
{
6894
return Resources.Inspections.QuickFixes.ExpandBangNotationQuickFix;
@@ -71,5 +97,14 @@ public override string Description(IInspectionResult result)
7197
public override bool CanFixInProcedure => true;
7298
public override bool CanFixInModule => true;
7399
public override bool CanFixInProject => true;
100+
101+
private string NonIdentifierCharacters = "[](){}\r\n\t.,'\"\\ |!@#$%^&*-+:=; ";
102+
private string AdditionalNonFirstIdentifierCharacters = "0123456789_";
103+
104+
private static readonly Dictionary<string, string> DefaultMemberOverrides = new Dictionary<string, string>
105+
{
106+
["Excel.Range._Default"] = "Item"
107+
};
108+
74109
}
75110
}

Rubberduck.CodeAnalysis/QuickFixes/ExpandDefaultMemberQuickFix.cs

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
using System.Linq;
1+
using System.Collections.Generic;
2+
using System.Linq;
23
using Antlr4.Runtime;
34
using Rubberduck.Inspections.Abstract;
45
using Rubberduck.Inspections.Concrete;
6+
using Rubberduck.Parsing.Grammar;
57
using Rubberduck.Parsing.Inspections.Abstract;
68
using Rubberduck.Parsing.Rewriter;
79
using Rubberduck.Parsing.Symbols;
@@ -54,10 +56,74 @@ private void InsertDefaultMember(ParserRuleContext lExpressionContext, Qualified
5456
private string DefaultMemberAccessCode(QualifiedSelection selection, DeclarationFinder finder)
5557
{
5658
var defaultMemberAccesses = finder.IdentifierReferences(selection).Where(reference => reference.DefaultMemberRecursionDepth > 0);
57-
var defaultMemberNames = defaultMemberAccesses.Select(reference => reference.Declaration.IdentifierName);
59+
var defaultMemberNames = defaultMemberAccesses.Select(DefaultMemberName)
60+
.Select(declarationName => IsNotLegalIdentifierName(declarationName)
61+
? $"[{declarationName}]"
62+
: declarationName);
5863
return $".{string.Join("().", defaultMemberNames)}";
5964
}
6065

66+
private bool IsNotLegalIdentifierName(string declarationName)
67+
{
68+
return string.IsNullOrEmpty(declarationName)
69+
|| NonIdentifierCharacters.Any(character => declarationName.Contains(character))
70+
|| AdditionalNonFirstIdentifierCharacters.Contains(declarationName[0]); ;
71+
}
72+
73+
private static string DefaultMemberName(IdentifierReference defaultMemberReference)
74+
{
75+
var defaultMemberMemberName = defaultMemberReference.Declaration.QualifiedName;
76+
var fullDefaultMemberName = $"{defaultMemberMemberName.QualifiedModuleName.ProjectName}.{defaultMemberMemberName.QualifiedModuleName.ComponentName}.{defaultMemberMemberName.MemberName}";
77+
78+
if (DefaultMemberBaseOverrides.TryGetValue(fullDefaultMemberName, out var baseOverride))
79+
{
80+
if (DefaultMemberArgumentNumberOverrides.TryGetValue(fullDefaultMemberName, out var argumentNumberOverrides))
81+
{
82+
var numberOfArguments = NumberOfArguments(defaultMemberReference);
83+
if (argumentNumberOverrides.TryGetValue(numberOfArguments, out var numberOfArgumentsOverride))
84+
{
85+
return numberOfArgumentsOverride;
86+
}
87+
}
88+
89+
return baseOverride;
90+
}
91+
92+
return defaultMemberMemberName.MemberName;
93+
}
94+
95+
private static int NumberOfArguments(IdentifierReference defaultMemberReference)
96+
{
97+
if (defaultMemberReference.IsNonIndexedDefaultMemberAccess)
98+
{
99+
return 0;
100+
}
101+
102+
var argumentList = ArgumentList(defaultMemberReference);
103+
if (argumentList == null)
104+
{
105+
return -1;
106+
}
107+
108+
var arguments = argumentList.argument();
109+
110+
return arguments?.Length ?? 0;
111+
}
112+
113+
private static VBAParser.ArgumentListContext ArgumentList(IdentifierReference indexedDefaultMemberReference)
114+
{
115+
var defaultMemberReferenceContextWithArguments = indexedDefaultMemberReference.Context.Parent;
116+
switch (defaultMemberReferenceContextWithArguments)
117+
{
118+
case VBAParser.IndexExprContext indexExpression:
119+
return indexExpression.argumentList();
120+
case VBAParser.WhitespaceIndexExprContext whiteSpaceIndexExpression:
121+
return whiteSpaceIndexExpression.argumentList();
122+
default:
123+
return null;
124+
}
125+
}
126+
61127
public override string Description(IInspectionResult result)
62128
{
63129
return Resources.Inspections.QuickFixes.ExpandDefaultMemberQuickFix;
@@ -66,5 +132,18 @@ public override string Description(IInspectionResult result)
66132
public override bool CanFixInProcedure => true;
67133
public override bool CanFixInModule => true;
68134
public override bool CanFixInProject => true;
135+
136+
private string NonIdentifierCharacters = "[](){}\r\n\t.,'\"\\ |!@#$%^&*-+:=; ";
137+
private string AdditionalNonFirstIdentifierCharacters = "0123456789_";
138+
139+
private static readonly Dictionary<string, string> DefaultMemberBaseOverrides = new Dictionary<string, string>
140+
{
141+
["Excel.Range._Default"] = "Item"
142+
};
143+
144+
private static readonly Dictionary<string, Dictionary<int, string>> DefaultMemberArgumentNumberOverrides = new Dictionary<string, Dictionary<int, string>>
145+
{
146+
["Excel.Range._Default"] = new Dictionary<int, string>{[0] = "Value"}
147+
};
69148
}
70149
}

Rubberduck.CodeAnalysis/QuickFixes/PassParameterByValueQuickFix.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Linq;
2-
using Rubberduck.Common;
32
using Rubberduck.Inspections.Abstract;
43
using Rubberduck.Inspections.Concrete;
54
using Rubberduck.Parsing.Grammar;
@@ -52,12 +51,14 @@ private void FixMethods(Declaration target, IRewriteSession rewriteSession)
5251
return; // should only happen if the parse results are stale; prevents a crash in that case
5352
}
5453

55-
//FIXME: Make this use the DeclarationFinder.
5654
var members = target.ParentDeclaration.DeclarationType == DeclarationType.Event
57-
? _state.AllUserDeclarations.FindHandlersForEvent(target.ParentDeclaration)
58-
.Select(s => s.Item2)
55+
? _state.DeclarationFinder
56+
.FindEventHandlers(target.ParentDeclaration)
5957
.ToList()
60-
: _state.DeclarationFinder.FindInterfaceImplementationMembers(target.ParentDeclaration).Cast<Declaration>().ToList();
58+
: _state.DeclarationFinder
59+
.FindInterfaceImplementationMembers(target.ParentDeclaration)
60+
.Cast<Declaration>()
61+
.ToList();
6162

6263
foreach (var member in members)
6364
{

0 commit comments

Comments
 (0)