Skip to content

Commit 0df8107

Browse files
committed
Introduced dynamic object for custom properties of inspection results
1 parent 537d6a5 commit 0df8107

File tree

12 files changed

+109
-54
lines changed

12 files changed

+109
-54
lines changed

RetailCoder.VBE/UI/Inspections/AggregateInspectionResult.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
32
using Antlr4.Runtime;
43
using Rubberduck.Parsing.Inspections.Abstract;
54
using Rubberduck.Parsing.Inspections.Resources;
@@ -29,16 +28,16 @@ public AggregateInspectionResult(IInspectionResult firstResult, int count)
2928

3029
public ParserRuleContext Context => _result.Context;
3130

32-
public IDictionary<string, string> Properties => throw new NotImplementedException();
31+
public dynamic Properties => throw new NotImplementedException();
3332

3433
public int CompareTo(IInspectionResult other)
3534
{
3635
if (other == this)
3736
{
3837
return 0;
3938
}
40-
var aggregated = other as AggregateInspectionResult;
41-
if (aggregated == null)
39+
40+
if (!(other is AggregateInspectionResult aggregated))
4241
{
4342
return -1;
4443
}

Rubberduck.Inspections/Abstract/InspectionResultBase.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
using System.Collections.Generic;
2-
using System.IO;
1+
using System.IO;
32
using Antlr4.Runtime;
43
using Rubberduck.Common;
4+
using Rubberduck.Parsing.Inspections;
55
using Rubberduck.Parsing.Inspections.Abstract;
66
using Rubberduck.Parsing.Inspections.Resources;
77
using Rubberduck.Parsing.Symbols;
@@ -20,7 +20,7 @@ protected InspectionResultBase(IInspection inspection,
2020
Declaration target,
2121
QualifiedSelection qualifiedSelection,
2222
QualifiedMemberName? qualifiedMemberName,
23-
Dictionary<string, string> properties)
23+
dynamic properties)
2424
{
2525
Inspection = inspection;
2626
Description = description?.Capitalize();
@@ -29,7 +29,7 @@ protected InspectionResultBase(IInspection inspection,
2929
Target = target;
3030
QualifiedSelection = qualifiedSelection;
3131
QualifiedMemberName = qualifiedMemberName;
32-
Properties = properties ?? new Dictionary<string, string>();
32+
Properties = properties ?? new PropertyBag();
3333
}
3434

3535
public IInspection Inspection { get; }
@@ -38,7 +38,7 @@ protected InspectionResultBase(IInspection inspection,
3838
public QualifiedMemberName? QualifiedMemberName { get; }
3939
public ParserRuleContext Context { get; }
4040
public Declaration Target { get; }
41-
public IDictionary<string, string> Properties { get; }
41+
public dynamic Properties { get; }
4242

4343
/// <summary>
4444
/// Gets the information needed to select the target instruction in the VBE.

Rubberduck.Inspections/Concrete/FunctionReturnValueNotUsedInspection.cs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Rubberduck.Inspections.Abstract;
66
using Rubberduck.Inspections.Results;
77
using Rubberduck.Parsing.Grammar;
8+
using Rubberduck.Parsing.Inspections;
89
using Rubberduck.Parsing.Inspections.Abstract;
910
using Rubberduck.Parsing.Inspections.Resources;
1011
using Rubberduck.Parsing.Symbols;
@@ -40,21 +41,19 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
4041
private IEnumerable<IInspectionResult> GetInterfaceMemberIssues(IEnumerable<Declaration> interfaceMembers)
4142
{
4243
return from interfaceMember in interfaceMembers
43-
let implementationMembers =
44-
UserDeclarations.FindInterfaceImplementationMembers(interfaceMember.IdentifierName).ToList()
45-
where interfaceMember.DeclarationType == DeclarationType.Function &&
46-
!IsReturnValueUsed(interfaceMember) &&
47-
implementationMembers.All(member => !IsReturnValueUsed(member))
48-
let implementationMemberIssues =
49-
implementationMembers.Select(
50-
implementationMember =>
51-
Tuple.Create(implementationMember.Context,
52-
new QualifiedSelection(implementationMember.QualifiedName.QualifiedModuleName,
53-
implementationMember.Selection), implementationMember))
54-
select
55-
new DeclarationInspectionResult(this,
56-
string.Format(InspectionsUI.FunctionReturnValueNotUsedInspectionResultFormat, interfaceMember.IdentifierName),
57-
interfaceMember, properties: new Dictionary<string, string> { { "DisableFixes", nameof(QuickFixes.ConvertToProcedureQuickFix) } });
44+
let implementationMembers =
45+
UserDeclarations.FindInterfaceImplementationMembers(interfaceMember.IdentifierName).ToList()
46+
where interfaceMember.DeclarationType == DeclarationType.Function &&
47+
!IsReturnValueUsed(interfaceMember) &&
48+
implementationMembers.All(member => !IsReturnValueUsed(member))
49+
let implementationMemberIssues =
50+
implementationMembers.Select(
51+
implementationMember =>
52+
Tuple.Create(implementationMember.Context,
53+
new QualifiedSelection(implementationMember.QualifiedName.QualifiedModuleName,
54+
implementationMember.Selection), implementationMember))
55+
select CreateInspectionResult(this, interfaceMember);
56+
5857
}
5958

6059
private IEnumerable<IInspectionResult> GetNonInterfaceIssues(IEnumerable<Declaration> nonInterfaceFunctions)
@@ -149,5 +148,16 @@ private bool IsSet(IdentifierReference usage)
149148

150149
return setStmt != null && setStmt == usage.Context;
151150
}
151+
152+
private DeclarationInspectionResult CreateInspectionResult(IInspection inspection, Declaration interfaceMember)
153+
{
154+
dynamic properties = new PropertyBag();
155+
properties.DisableFixes = nameof(QuickFixes.ConvertToProcedureQuickFix);
156+
157+
return new DeclarationInspectionResult(inspection,
158+
string.Format(InspectionsUI.FunctionReturnValueNotUsedInspectionResultFormat,
159+
interfaceMember.IdentifierName),
160+
interfaceMember, properties: properties);
161+
}
152162
}
153163
}

Rubberduck.Inspections/Concrete/UseMeaningfulNameInspection.cs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Rubberduck.Common;
55
using Rubberduck.Inspections.Abstract;
66
using Rubberduck.Inspections.Results;
7+
using Rubberduck.Parsing.Inspections;
78
using Rubberduck.Parsing.Inspections.Abstract;
89
using Rubberduck.Parsing.Inspections.Resources;
910
using Rubberduck.Parsing.Symbols;
@@ -51,15 +52,26 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
5152
!whitelistedNames.Contains(declaration.IdentifierName) &&
5253
!VariableNameValidator.IsMeaningfulName(declaration.IdentifierName));
5354

54-
return (from issue in issues
55-
let props = issue.DeclarationType.HasFlag(DeclarationType.Module) ||
56-
issue.DeclarationType.HasFlag(DeclarationType.Project)
57-
? new Dictionary<string, string> {{"DisableFixes", "IgnoreOnceQuickFix"}} : null
58-
select new DeclarationInspectionResult(this,
59-
string.Format(InspectionsUI.IdentifierNameInspectionResultFormat,
60-
RubberduckUI.ResourceManager.GetString("DeclarationType_" + issue.DeclarationType,
61-
CultureInfo.CurrentUICulture), issue.IdentifierName), issue, properties: props))
55+
return (from issue in issues select CreateInspectionResult(this, issue))
6256
.ToList();
6357
}
58+
59+
private static DeclarationInspectionResult CreateInspectionResult(IInspection inspection, Declaration issue)
60+
{
61+
dynamic properties = null;
62+
63+
if (issue.DeclarationType.HasFlag(DeclarationType.Module) ||
64+
issue.DeclarationType.HasFlag(DeclarationType.Project))
65+
{
66+
properties = new PropertyBag();
67+
properties.DisableFixes = "IgnoreOnceQuickFix";
68+
}
69+
70+
return new DeclarationInspectionResult(inspection,
71+
string.Format(InspectionsUI.IdentifierNameInspectionResultFormat,
72+
RubberduckUI.ResourceManager.GetString("DeclarationType_" + issue.DeclarationType,
73+
CultureInfo.CurrentUICulture), issue.IdentifierName),
74+
issue, properties: properties);
75+
}
6476
}
6577
}

Rubberduck.Inspections/QuickFixProvider.cs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Diagnostics;
44
using System.Linq;
5+
using Microsoft.CSharp.RuntimeBinder;
56
using Rubberduck.Parsing.Inspections.Abstract;
67
using Rubberduck.Parsing.VBA;
78
using Rubberduck.VBEditor;
@@ -40,15 +41,25 @@ public IEnumerable<IQuickFix> QuickFixes(IInspectionResult result)
4041
}
4142

4243
return _quickFixes[result.Inspection.GetType()].Where(fix =>
43-
{
44-
if (!result.Properties.TryGetValue("DisableFixes", out var value))
4544
{
46-
return true;
47-
}
45+
string value;
46+
try
47+
{
48+
value = result.Properties.DisableFixes;
49+
}
50+
catch (RuntimeBinderException)
51+
{
52+
return true;
53+
}
54+
55+
if (value == null)
56+
{
57+
return true;
58+
}
4859

49-
return !value.Split(',').Contains(fix.GetType().Name);
50-
})
51-
.OrderBy(fix => fix.SupportedInspections.Count); // most specific fixes first; keeps "ignore once" last
60+
return !value.Split(',').Contains(fix.GetType().Name);
61+
})
62+
.OrderBy(fix => fix.SupportedInspections.Count); // most specific fixes first; keeps "ignore once" last
5263
}
5364

5465
private bool CanFix(IQuickFix fix, IInspectionResult result)

Rubberduck.Inspections/Results/DeclarationInspectionResult.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Collections.Generic;
2-
using Rubberduck.Inspections.Abstract;
1+
using Rubberduck.Inspections.Abstract;
32
using Rubberduck.Parsing;
43
using Rubberduck.Parsing.Inspections.Abstract;
54
using Rubberduck.Parsing.Symbols;
@@ -9,15 +8,15 @@ namespace Rubberduck.Inspections.Results
98
{
109
internal class DeclarationInspectionResult : InspectionResultBase
1110
{
12-
public DeclarationInspectionResult(IInspection inspection, string description, Declaration target, QualifiedContext context = null, Dictionary<string, string> properties = null) :
11+
public DeclarationInspectionResult(IInspection inspection, string description, Declaration target, QualifiedContext context = null, dynamic properties = null) :
1312
base(inspection,
1413
description,
1514
context == null ? target.QualifiedName.QualifiedModuleName : context.ModuleName,
1615
context == null ? target.Context : context.Context,
1716
target,
1817
target.QualifiedSelection,
1918
GetQualifiedMemberName(target),
20-
properties)
19+
(object)properties)
2120
{
2221
}
2322

Rubberduck.Inspections/Results/IdentifierReferenceInspectionResult.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Collections.Generic;
2-
using System.Linq;
1+
using System.Linq;
32
using Rubberduck.Inspections.Abstract;
43
using Rubberduck.Parsing;
54
using Rubberduck.Parsing.Inspections.Abstract;
@@ -11,15 +10,15 @@ namespace Rubberduck.Inspections.Results
1110
{
1211
internal class IdentifierReferenceInspectionResult : InspectionResultBase
1312
{
14-
public IdentifierReferenceInspectionResult(IInspection inspection, string description, RubberduckParserState state, IdentifierReference reference, Dictionary<string, string> properties = null) :
13+
public IdentifierReferenceInspectionResult(IInspection inspection, string description, RubberduckParserState state, IdentifierReference reference, dynamic properties = null) :
1514
base(inspection,
1615
description,
1716
reference.QualifiedModuleName,
1817
reference.Context,
1918
reference.Declaration,
2019
new QualifiedSelection(reference.QualifiedModuleName, reference.Context.GetSelection()),
2120
GetQualifiedMemberName(state, reference),
22-
properties)
21+
(object)properties)
2322
{
2423
}
2524

Rubberduck.Inspections/Results/QualifiedContextInspectionResult.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Collections.Generic;
2-
using Rubberduck.Inspections.Abstract;
1+
using Rubberduck.Inspections.Abstract;
32
using Rubberduck.Parsing;
43
using Rubberduck.Parsing.Inspections.Abstract;
54
using Rubberduck.VBEditor;
@@ -8,15 +7,15 @@ namespace Rubberduck.Inspections.Results
87
{
98
internal class QualifiedContextInspectionResult : InspectionResultBase
109
{
11-
public QualifiedContextInspectionResult(IInspection inspection, string description, QualifiedContext context, Dictionary<string, string> properties = null) :
10+
public QualifiedContextInspectionResult(IInspection inspection, string description, QualifiedContext context, dynamic properties = null) :
1211
base(inspection,
1312
description,
1413
context.ModuleName,
1514
context.Context,
1615
null,
1716
new QualifiedSelection(context.ModuleName, context.Context.GetSelection()),
1817
context.MemberName,
19-
properties)
18+
(object)properties)
2019
{
2120
}
2221
}

Rubberduck.Parsing/Inspections/Abstract/IInspectionResult.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
32
using Antlr4.Runtime;
43
using Rubberduck.Parsing.Symbols;
54
using Rubberduck.VBEditor;
@@ -14,6 +13,6 @@ public interface IInspectionResult : IComparable<IInspectionResult>, IComparable
1413
IInspection Inspection { get; }
1514
Declaration Target { get; }
1615
ParserRuleContext Context { get; }
17-
IDictionary<string, string> Properties { get; }
16+
dynamic Properties { get; }
1817
}
1918
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System.Collections.Generic;
2+
using System.Dynamic;
3+
4+
namespace Rubberduck.Parsing.Inspections
5+
{
6+
public class PropertyBag : DynamicObject
7+
{
8+
readonly Dictionary<string, object> _properties = new Dictionary<string, object>();
9+
10+
public override bool TryGetMember(GetMemberBinder binder, out object result)
11+
{
12+
return _properties.TryGetValue(binder.Name, out result);
13+
}
14+
15+
public override bool TrySetMember(SetMemberBinder binder, object value)
16+
{
17+
_properties[binder.Name] = value;
18+
return true;
19+
}
20+
21+
public override IEnumerable<string> GetDynamicMemberNames()
22+
{
23+
return _properties.Keys;
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)