Skip to content
Merged
135 changes: 135 additions & 0 deletions RetailCoder.VBE/Inspections/HungarianNotationInspection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Rubberduck.Inspections.Abstract;
using Rubberduck.Inspections.Resources;
using Rubberduck.Inspections.Results;
using Rubberduck.Parsing.Symbols;
using Rubberduck.Parsing.VBA;
using Rubberduck.Settings;
using Rubberduck.SettingsProvider;
using Rubberduck.UI;

namespace Rubberduck.Inspections
{
public sealed class HungarianNotationInspection : InspectionBase
{
#region statics
private static readonly List<string> HungarianPrefixes = new List<string>
{
"chk",
"cbo",
"cmd",
"btn",
"fra",
"img",
"lbl",
"lst",
"mnu",
"opt",
"pic",
"shp",
"txt",
"tmr",
"chk",
"dlg",
"drv",
"frm",
"grd",
"obj",
"rpt",
"fld",
"idx",
"tbl",
"tbd",
"bas",
"cls",
"g",
"m",
"bln",
"byt",
"col",
"dtm",
"dbl",
"cur",
"int",
"lng",
"sng",
"str",
"udt",
"vnt",
"var",
"pgr",
"dao",
"b",
"by",
"c",
"chr",
"i",
"l",
"s",
"o",
"n",
"dt",
"dat",
"a",
"arr"
};

private static readonly Regex HungarianIdentifierRegex = new Regex(string.Format("^({0})[A-Z0-9].*$", string.Join("|", HungarianPrefixes)));

private static readonly List<DeclarationType> TargetDeclarationTypes = new List<DeclarationType>
{
DeclarationType.Parameter,
DeclarationType.Constant,
DeclarationType.Control,
DeclarationType.ClassModule,
DeclarationType.Member,
DeclarationType.Module,
DeclarationType.ProceduralModule,
DeclarationType.UserForm,
DeclarationType.UserDefinedType,
DeclarationType.UserDefinedTypeMember,
DeclarationType.Variable
};

#endregion

private readonly IMessageBox _messageBox;
private readonly IPersistanceService<CodeInspectionSettings> _settings;

public HungarianNotationInspection(IMessageBox messageBox, RubberduckParserState state, IPersistanceService<CodeInspectionSettings> settings)
: base(state, CodeInspectionSeverity.Suggestion)
{
_messageBox = messageBox;
_settings = settings;
}

public override string Description
{
get { return InspectionsUI.HungarianNotationInspectionName; }
}

public override CodeInspectionType InspectionType
{
get { return CodeInspectionType.MaintainabilityAndReadabilityIssues; }
}

public override IEnumerable<InspectionResultBase> GetInspectionResults()
{
var settings = _settings.Load(new CodeInspectionSettings()) ?? new CodeInspectionSettings();
var whitelistedNames = settings.WhitelistedIdentifiers.Select(s => s.Identifier).ToList();

var hungarians = UserDeclarations
.Where(declaration => !whitelistedNames.Contains(declaration.IdentifierName) &&
TargetDeclarationTypes.Contains(declaration.DeclarationType) &&
HungarianIdentifierRegex.IsMatch(declaration.IdentifierName))
.Select(issue => new IdentifierNameInspectionResult(this, issue, State, _messageBox, _settings))
.ToList();
return hungarians;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Antlr4.Runtime;
using Rubberduck.Inspections.Abstract;
using Rubberduck.Inspections.Resources;
using Rubberduck.Parsing.Symbols;
using Rubberduck.Settings;
using Rubberduck.SettingsProvider;
using Rubberduck.VBEditor;

namespace Rubberduck.Inspections.QuickFixes
{
public class AddIdentifierToWhiteListQuickFix : QuickFixBase
{
private readonly IPersistanceService<CodeInspectionSettings> _settings;
private readonly Declaration _target;

public AddIdentifierToWhiteListQuickFix(ParserRuleContext context, QualifiedSelection selection, Declaration target, IPersistanceService<CodeInspectionSettings> settings)
: base(context, selection, InspectionsUI.WhiteListIdentifierQuickFix)
{
_settings = settings;
_target = target;
}

public override void Fix()
{
var inspectionSettings = _settings.Load(new CodeInspectionSettings()) ?? new CodeInspectionSettings();
var whitelist = inspectionSettings.WhitelistedIdentifiers;
inspectionSettings.WhitelistedIdentifiers =
whitelist.Concat(new[] { new WhitelistedIdentifierSetting(_target.IdentifierName) }).ToArray();
_settings.Save(inspectionSettings);
}
}
}
47 changes: 37 additions & 10 deletions RetailCoder.VBE/Inspections/Resources/InspectionsUI.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ Falls der Parameter 'null' sein kann, bitte dieses Auftreten ignorieren. 'null'
<data name="ProcedureShouldBeFunctionInspectionQuickFix" xml:space="preserve">
<value>Implementiere als Funktion und passe die Aufrufe an</value>
</data>
<data name="UseMeaningfulNameInspectionResultFormat" xml:space="preserve">
<data name="IdentifierNameInspectionResultFormat" xml:space="preserve">
<value>Übelege die Umbenennung {0} '{1}'</value>
</data>
<data name="UseMeaningfulNameInspectionMeta" xml:space="preserve">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@
<data name="ProcedureShouldBeFunctionInspectionQuickFix" xml:space="preserve">
<value>Implémenter comme une fonction, et mettre à jour les appels</value>
</data>
<data name="UseMeaningfulNameInspectionResultFormat" xml:space="preserve">
<data name="IdentifierNameInspectionResultFormat" xml:space="preserve">
<value>Considérez renommer {0} '{1}'</value>
</data>
<data name="UseMeaningfulNameInspectionMeta" xml:space="preserve">
Expand Down
11 changes: 10 additions & 1 deletion RetailCoder.VBE/Inspections/Resources/InspectionsUI.resx
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ If the parameter can be null, ignore this inspection result; passing a null valu
<data name="ProcedureShouldBeFunctionInspectionQuickFix" xml:space="preserve">
<value>Implement as function and update usages.</value>
</data>
<data name="UseMeaningfulNameInspectionResultFormat" xml:space="preserve">
<data name="IdentifierNameInspectionResultFormat" xml:space="preserve">
<value>Consider renaming {0} '{1}'</value>
</data>
<data name="UseMeaningfulNameInspectionMeta" xml:space="preserve">
Expand Down Expand Up @@ -606,4 +606,13 @@ If the parameter can be null, ignore this inspection result; passing a null valu
<value>{0} ({1} results)</value>
<comment>{0} inpection description, {1} result count</comment>
</data>
<data name="HungarianNotationInspectionMeta" xml:space="preserve">
<value>Hungarian notation makes code less readable, and is redundant when strongly typed variables and meaningful names are used.</value>
</data>
<data name="HungarianNotationInspectionName" xml:space="preserve">
<value>Variable uses Hungarian notation.</value>
</data>
<data name="WhiteListIdentifierQuickFix" xml:space="preserve">
<value>Add to whitelist</value>
</data>
</root>
Original file line number Diff line number Diff line change
Expand Up @@ -5,29 +5,32 @@
using Rubberduck.Inspections.Resources;
using Rubberduck.Parsing.Symbols;
using Rubberduck.Parsing.VBA;
using Rubberduck.Settings;
using Rubberduck.SettingsProvider;
using Rubberduck.UI;

namespace Rubberduck.Inspections.Results
{
public class UseMeaningfulNameInspectionResult : InspectionResultBase
public class IdentifierNameInspectionResult : InspectionResultBase
{
private readonly IEnumerable<QuickFixBase> _quickFixes;

public UseMeaningfulNameInspectionResult(IInspection inspection, Declaration target, RubberduckParserState parserState, IMessageBox messageBox)
public IdentifierNameInspectionResult(IInspection inspection, Declaration target, RubberduckParserState parserState, IMessageBox messageBox, IPersistanceService<CodeInspectionSettings> settings)
: base(inspection, target)
{
_quickFixes = new QuickFixBase[]
{
new RenameDeclarationQuickFix(target.Context, target.QualifiedSelection, target, parserState, messageBox),
new IgnoreOnceQuickFix(Context, QualifiedSelection, Inspection.AnnotationName),
new IgnoreOnceQuickFix(Context, target.QualifiedSelection, Inspection.AnnotationName),
new AddIdentifierToWhiteListQuickFix(Context, target.QualifiedSelection, target, settings)
};
}

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

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

public override NavigateCodeEventArgs GetNavigationArgs()
Expand Down
2 changes: 1 addition & 1 deletion RetailCoder.VBE/Inspections/UseMeaningfulNameInspection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
char.IsDigit(declaration.IdentifierName.Last()) ||
!declaration.IdentifierName.Any(c =>
"aeiouy".Any(a => string.Compare(a.ToString(), c.ToString(), StringComparison.OrdinalIgnoreCase) == 0))))
.Select(issue => new UseMeaningfulNameInspectionResult(this, issue, State, _messageBox))
.Select(issue => new IdentifierNameInspectionResult(this, issue, State, _messageBox, _settings))
.ToList();

return issues;
Expand Down
4 changes: 3 additions & 1 deletion RetailCoder.VBE/Rubberduck.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,9 @@
<Compile Include="Common\WinAPI\WM.cs" />
<Compile Include="Common\WindowsOperatingSystem.cs" />
<Compile Include="Common\UndocumentedAttribute.cs" />
<Compile Include="Inspections\HungarianNotationInspection.cs" />
<Compile Include="Inspections\ImplicitDefaultMemberAssignmentInspection.cs" />
<Compile Include="Inspections\QuickFixes\AddIdentifierToWhiteListQuickFix.cs" />
<Compile Include="Inspections\Resources\InspectionsUI.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
Expand Down Expand Up @@ -542,7 +544,7 @@
<Compile Include="Inspections\Results\ProcedureCanBeWrittenAsFunctionInspectionResult.cs" />
<Compile Include="Inspections\Results\UntypedFunctionUsageInspectionResult.cs" />
<Compile Include="Inspections\UseMeaningfulNameInspection.cs" />
<Compile Include="Inspections\Results\UseMeaningfulNameInspectionResult.cs" />
<Compile Include="Inspections\Results\IdentifierNameInspectionResult.cs" />
<Compile Include="Inspections\WriteOnlyPropertyInspection.cs" />
<Compile Include="Inspections\UntypedFunctionUsageInspection.cs" />
<Compile Include="Navigation\CodeExplorer\CodeExplorerCustomFolderViewModel.cs" />
Expand Down
Loading