Skip to content

Commit d759da5

Browse files
authored
Merge pull request #2529 from comintern/next
Allow identifiers named "BF", add Hungarian notation inspection, new quickfix
2 parents 2dcf02e + faaec3d commit d759da5

20 files changed

+2078
-1540
lines changed
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Text.RegularExpressions;
6+
using System.Threading.Tasks;
7+
using Rubberduck.Inspections.Abstract;
8+
using Rubberduck.Inspections.Resources;
9+
using Rubberduck.Inspections.Results;
10+
using Rubberduck.Parsing.Symbols;
11+
using Rubberduck.Parsing.VBA;
12+
using Rubberduck.Settings;
13+
using Rubberduck.SettingsProvider;
14+
using Rubberduck.UI;
15+
16+
namespace Rubberduck.Inspections
17+
{
18+
public sealed class HungarianNotationInspection : InspectionBase
19+
{
20+
#region statics
21+
private static readonly List<string> HungarianPrefixes = new List<string>
22+
{
23+
"chk",
24+
"cbo",
25+
"cmd",
26+
"btn",
27+
"fra",
28+
"img",
29+
"lbl",
30+
"lst",
31+
"mnu",
32+
"opt",
33+
"pic",
34+
"shp",
35+
"txt",
36+
"tmr",
37+
"chk",
38+
"dlg",
39+
"drv",
40+
"frm",
41+
"grd",
42+
"obj",
43+
"rpt",
44+
"fld",
45+
"idx",
46+
"tbl",
47+
"tbd",
48+
"bas",
49+
"cls",
50+
"g",
51+
"m",
52+
"bln",
53+
"byt",
54+
"col",
55+
"dtm",
56+
"dbl",
57+
"cur",
58+
"int",
59+
"lng",
60+
"sng",
61+
"str",
62+
"udt",
63+
"vnt",
64+
"var",
65+
"pgr",
66+
"dao",
67+
"b",
68+
"by",
69+
"c",
70+
"chr",
71+
"i",
72+
"l",
73+
"s",
74+
"o",
75+
"n",
76+
"dt",
77+
"dat",
78+
"a",
79+
"arr"
80+
};
81+
82+
private static readonly Regex HungarianIdentifierRegex = new Regex(string.Format("^({0})[A-Z0-9].*$", string.Join("|", HungarianPrefixes)));
83+
84+
private static readonly List<DeclarationType> TargetDeclarationTypes = new List<DeclarationType>
85+
{
86+
DeclarationType.Parameter,
87+
DeclarationType.Constant,
88+
DeclarationType.Control,
89+
DeclarationType.ClassModule,
90+
DeclarationType.Member,
91+
DeclarationType.Module,
92+
DeclarationType.ProceduralModule,
93+
DeclarationType.UserForm,
94+
DeclarationType.UserDefinedType,
95+
DeclarationType.UserDefinedTypeMember,
96+
DeclarationType.Variable
97+
};
98+
99+
#endregion
100+
101+
private readonly IMessageBox _messageBox;
102+
private readonly IPersistanceService<CodeInspectionSettings> _settings;
103+
104+
public HungarianNotationInspection(IMessageBox messageBox, RubberduckParserState state, IPersistanceService<CodeInspectionSettings> settings)
105+
: base(state, CodeInspectionSeverity.Suggestion)
106+
{
107+
_messageBox = messageBox;
108+
_settings = settings;
109+
}
110+
111+
public override string Description
112+
{
113+
get { return InspectionsUI.HungarianNotationInspectionName; }
114+
}
115+
116+
public override CodeInspectionType InspectionType
117+
{
118+
get { return CodeInspectionType.MaintainabilityAndReadabilityIssues; }
119+
}
120+
121+
public override IEnumerable<InspectionResultBase> GetInspectionResults()
122+
{
123+
var settings = _settings.Load(new CodeInspectionSettings()) ?? new CodeInspectionSettings();
124+
var whitelistedNames = settings.WhitelistedIdentifiers.Select(s => s.Identifier).ToList();
125+
126+
var hungarians = UserDeclarations
127+
.Where(declaration => !whitelistedNames.Contains(declaration.IdentifierName) &&
128+
TargetDeclarationTypes.Contains(declaration.DeclarationType) &&
129+
HungarianIdentifierRegex.IsMatch(declaration.IdentifierName))
130+
.Select(issue => new IdentifierNameInspectionResult(this, issue, State, _messageBox, _settings))
131+
.ToList();
132+
return hungarians;
133+
}
134+
}
135+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using Antlr4.Runtime;
7+
using Rubberduck.Inspections.Abstract;
8+
using Rubberduck.Inspections.Resources;
9+
using Rubberduck.Parsing.Symbols;
10+
using Rubberduck.Settings;
11+
using Rubberduck.SettingsProvider;
12+
using Rubberduck.VBEditor;
13+
14+
namespace Rubberduck.Inspections.QuickFixes
15+
{
16+
public class AddIdentifierToWhiteListQuickFix : QuickFixBase
17+
{
18+
private readonly IPersistanceService<CodeInspectionSettings> _settings;
19+
private readonly Declaration _target;
20+
21+
public AddIdentifierToWhiteListQuickFix(ParserRuleContext context, QualifiedSelection selection, Declaration target, IPersistanceService<CodeInspectionSettings> settings)
22+
: base(context, selection, InspectionsUI.WhiteListIdentifierQuickFix)
23+
{
24+
_settings = settings;
25+
_target = target;
26+
}
27+
28+
public override void Fix()
29+
{
30+
var inspectionSettings = _settings.Load(new CodeInspectionSettings()) ?? new CodeInspectionSettings();
31+
var whitelist = inspectionSettings.WhitelistedIdentifiers;
32+
inspectionSettings.WhitelistedIdentifiers =
33+
whitelist.Concat(new[] { new WhitelistedIdentifierSetting(_target.IdentifierName) }).ToArray();
34+
_settings.Save(inspectionSettings);
35+
}
36+
}
37+
}

RetailCoder.VBE/Inspections/Resources/InspectionsUI.Designer.cs

Lines changed: 37 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

RetailCoder.VBE/Inspections/Resources/InspectionsUI.de.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ Falls der Parameter 'null' sein kann, bitte dieses Auftreten ignorieren. 'null'
317317
<data name="ProcedureShouldBeFunctionInspectionQuickFix" xml:space="preserve">
318318
<value>Implementiere als Funktion und passe die Aufrufe an</value>
319319
</data>
320-
<data name="UseMeaningfulNameInspectionResultFormat" xml:space="preserve">
320+
<data name="IdentifierNameInspectionResultFormat" xml:space="preserve">
321321
<value>Übelege die Umbenennung {0} '{1}'</value>
322322
</data>
323323
<data name="UseMeaningfulNameInspectionMeta" xml:space="preserve">

RetailCoder.VBE/Inspections/Resources/InspectionsUI.fr.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@
313313
<data name="ProcedureShouldBeFunctionInspectionQuickFix" xml:space="preserve">
314314
<value>Implémenter comme une fonction, et mettre à jour les appels</value>
315315
</data>
316-
<data name="UseMeaningfulNameInspectionResultFormat" xml:space="preserve">
316+
<data name="IdentifierNameInspectionResultFormat" xml:space="preserve">
317317
<value>Considérez renommer {0} '{1}'</value>
318318
</data>
319319
<data name="UseMeaningfulNameInspectionMeta" xml:space="preserve">

RetailCoder.VBE/Inspections/Resources/InspectionsUI.resx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ If the parameter can be null, ignore this inspection result; passing a null valu
317317
<data name="ProcedureShouldBeFunctionInspectionQuickFix" xml:space="preserve">
318318
<value>Implement as function and update usages.</value>
319319
</data>
320-
<data name="UseMeaningfulNameInspectionResultFormat" xml:space="preserve">
320+
<data name="IdentifierNameInspectionResultFormat" xml:space="preserve">
321321
<value>Consider renaming {0} '{1}'</value>
322322
</data>
323323
<data name="UseMeaningfulNameInspectionMeta" xml:space="preserve">
@@ -606,4 +606,13 @@ If the parameter can be null, ignore this inspection result; passing a null valu
606606
<value>{0} ({1} results)</value>
607607
<comment>{0} inpection description, {1} result count</comment>
608608
</data>
609+
<data name="HungarianNotationInspectionMeta" xml:space="preserve">
610+
<value>Hungarian notation makes code less readable, and is redundant when strongly typed variables and meaningful names are used.</value>
611+
</data>
612+
<data name="HungarianNotationInspectionName" xml:space="preserve">
613+
<value>Variable uses Hungarian notation.</value>
614+
</data>
615+
<data name="WhiteListIdentifierQuickFix" xml:space="preserve">
616+
<value>Add to whitelist</value>
617+
</data>
609618
</root>

RetailCoder.VBE/Inspections/Results/UseMeaningfulNameInspectionResult.cs renamed to RetailCoder.VBE/Inspections/Results/IdentifierNameInspectionResult.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,32 @@
55
using Rubberduck.Inspections.Resources;
66
using Rubberduck.Parsing.Symbols;
77
using Rubberduck.Parsing.VBA;
8+
using Rubberduck.Settings;
9+
using Rubberduck.SettingsProvider;
810
using Rubberduck.UI;
911

1012
namespace Rubberduck.Inspections.Results
1113
{
12-
public class UseMeaningfulNameInspectionResult : InspectionResultBase
14+
public class IdentifierNameInspectionResult : InspectionResultBase
1315
{
1416
private readonly IEnumerable<QuickFixBase> _quickFixes;
1517

16-
public UseMeaningfulNameInspectionResult(IInspection inspection, Declaration target, RubberduckParserState parserState, IMessageBox messageBox)
18+
public IdentifierNameInspectionResult(IInspection inspection, Declaration target, RubberduckParserState parserState, IMessageBox messageBox, IPersistanceService<CodeInspectionSettings> settings)
1719
: base(inspection, target)
1820
{
1921
_quickFixes = new QuickFixBase[]
2022
{
2123
new RenameDeclarationQuickFix(target.Context, target.QualifiedSelection, target, parserState, messageBox),
22-
new IgnoreOnceQuickFix(Context, QualifiedSelection, Inspection.AnnotationName),
24+
new IgnoreOnceQuickFix(Context, target.QualifiedSelection, Inspection.AnnotationName),
25+
new AddIdentifierToWhiteListQuickFix(Context, target.QualifiedSelection, target, settings)
2326
};
2427
}
2528

2629
public override IEnumerable<QuickFixBase> QuickFixes { get { return _quickFixes; } }
2730

2831
public override string Description
2932
{
30-
get { return string.Format(InspectionsUI.UseMeaningfulNameInspectionResultFormat, RubberduckUI.ResourceManager.GetString("DeclarationType_" + Target.DeclarationType, UI.Settings.Settings.Culture), Target.IdentifierName).Captialize(); }
33+
get { return string.Format(InspectionsUI.IdentifierNameInspectionResultFormat, RubberduckUI.ResourceManager.GetString("DeclarationType_" + Target.DeclarationType, UI.Settings.Settings.Culture), Target.IdentifierName).Captialize(); }
3134
}
3235

3336
public override NavigateCodeEventArgs GetNavigationArgs()

RetailCoder.VBE/Inspections/UseMeaningfulNameInspection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
3939
char.IsDigit(declaration.IdentifierName.Last()) ||
4040
!declaration.IdentifierName.Any(c =>
4141
"aeiouy".Any(a => string.Compare(a.ToString(), c.ToString(), StringComparison.OrdinalIgnoreCase) == 0))))
42-
.Select(issue => new UseMeaningfulNameInspectionResult(this, issue, State, _messageBox))
42+
.Select(issue => new IdentifierNameInspectionResult(this, issue, State, _messageBox, _settings))
4343
.ToList();
4444

4545
return issues;

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,9 @@
365365
<Compile Include="Common\WinAPI\WM.cs" />
366366
<Compile Include="Common\WindowsOperatingSystem.cs" />
367367
<Compile Include="Common\UndocumentedAttribute.cs" />
368+
<Compile Include="Inspections\HungarianNotationInspection.cs" />
368369
<Compile Include="Inspections\ImplicitDefaultMemberAssignmentInspection.cs" />
370+
<Compile Include="Inspections\QuickFixes\AddIdentifierToWhiteListQuickFix.cs" />
369371
<Compile Include="Inspections\Resources\InspectionsUI.Designer.cs">
370372
<AutoGen>True</AutoGen>
371373
<DesignTime>True</DesignTime>
@@ -542,7 +544,7 @@
542544
<Compile Include="Inspections\Results\ProcedureCanBeWrittenAsFunctionInspectionResult.cs" />
543545
<Compile Include="Inspections\Results\UntypedFunctionUsageInspectionResult.cs" />
544546
<Compile Include="Inspections\UseMeaningfulNameInspection.cs" />
545-
<Compile Include="Inspections\Results\UseMeaningfulNameInspectionResult.cs" />
547+
<Compile Include="Inspections\Results\IdentifierNameInspectionResult.cs" />
546548
<Compile Include="Inspections\WriteOnlyPropertyInspection.cs" />
547549
<Compile Include="Inspections\UntypedFunctionUsageInspection.cs" />
548550
<Compile Include="Navigation\CodeExplorer\CodeExplorerCustomFolderViewModel.cs" />

0 commit comments

Comments
 (0)