Skip to content

Commit 3dcec89

Browse files
committed
made VariableNameValidator static
1 parent 96a16ad commit 3dcec89

File tree

4 files changed

+52
-103
lines changed

4 files changed

+52
-103
lines changed

RetailCoder.VBE/Inspections/QuickFixes/AssignedByValParameterMakeLocalCopyQuickFix.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ private string ComputeSuggestedName()
8181

8282
private bool VariableNameIsValid(string variableName)
8383
{
84-
var validator = new VariableNameValidator(variableName);
85-
return validator.IsValidName()
84+
return VariableNameValidator.IsValidName(variableName)
8685
&& !_forbiddenNames.Any(name => name.Equals(variableName, System.StringComparison.InvariantCultureIgnoreCase));
8786
}
8887

RetailCoder.VBE/Inspections/UseMeaningfulNameInspection.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,11 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
5151
!IgnoreDeclarationTypes.Contains(declaration.ParentDeclaration.DeclarationType) &&
5252
!handlers.Contains(declaration.ParentDeclaration)) &&
5353
!whitelistedNames.Contains(declaration.IdentifierName) &&
54-
IsBadIdentifier(declaration.IdentifierName))
54+
!VariableNameValidator.IsMeaningfulName(declaration.IdentifierName))
5555
.Select(issue => new IdentifierNameInspectionResult(this, issue, State, _messageBox, _settings))
5656
.ToList();
5757

5858
return issues;
5959
}
60-
61-
private static bool IsBadIdentifier(string identifier)
62-
{
63-
var validator = new VariableNameValidator(identifier);
64-
return !validator.IsMeaningfulName();
65-
}
6660
}
6761
}
Lines changed: 41 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,115 +1,80 @@
11
using System.Globalization;
22
using Rubberduck.Parsing.Grammar;
33
using System;
4+
using System.Collections.Generic;
45
using System.Linq;
5-
using System.Text.RegularExpressions;
66

77
namespace Rubberduck.Inspections
88
{
9-
public class VariableNameValidator
9+
public static class VariableNameValidator
1010
{
11-
public VariableNameValidator() { }
12-
public VariableNameValidator(string identifier) { _identifier = identifier; }
11+
private static readonly string Vowels = "aeiouyàâäéèêëïîöôùûü";
12+
private static readonly int MinVariableNameLength = 3;
1313

14-
private const string AllVowels = "aeiouyàâäéèêëïîöôùûü";
15-
private const int MinVariableNameLength = 3;
16-
17-
/**** Meaningful Name Characteristics ************/
18-
19-
private bool HasVowels
14+
private static bool HasVowel(string name)
2015
{
21-
get
22-
{
23-
return _identifier.Any(character => AllVowels.Any(vowel =>
24-
string.Compare(vowel.ToString(CultureInfo.InvariantCulture),
25-
character.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase) == 0));
26-
}
16+
return name.Any(character => Vowels.Any(vowel =>
17+
string.Compare(vowel.ToString(CultureInfo.InvariantCulture),
18+
character.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase) == 0));
2719
}
2820

29-
private bool HasConsonants
21+
private static bool HasConsonant(string name)
3022
{
31-
get
32-
{
33-
return !_identifier.All(character => AllVowels.Any(vowel =>
34-
string.Compare(vowel.ToString(CultureInfo.InvariantCulture),
35-
character.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase) == 0));
36-
}
23+
return !name.All(character => Vowels.Any(vowel =>
24+
string.Compare(vowel.ToString(CultureInfo.InvariantCulture),
25+
character.ToString(CultureInfo.InvariantCulture), StringComparison.OrdinalIgnoreCase) == 0));
3726
}
3827

39-
private bool IsSingleRepeatedLetter
28+
private static bool IsRepeatedCharacter(string name)
4029
{
41-
get
42-
{
43-
var firstLetter = _identifier.First().ToString(CultureInfo.InvariantCulture);
44-
return _identifier.All(a => string.Compare(a.ToString(CultureInfo.InvariantCulture), firstLetter,
45-
StringComparison.OrdinalIgnoreCase) == 0);
46-
}
30+
var firstLetter = name.First().ToString(CultureInfo.InvariantCulture);
31+
return name.All(a => string.Compare(a.ToString(CultureInfo.InvariantCulture), firstLetter,
32+
StringComparison.OrdinalIgnoreCase) == 0);
4733
}
4834

49-
private bool IsTooShort { get { return _identifier.Length < MinVariableNameLength; } }
50-
private bool EndsWithNumber { get { return char.IsDigit(_identifier.Last()); } }
51-
52-
/**** Invalid Name Characteristics ************/
53-
public bool StartsWithNumber { get { return FirstLetterIsDigit(); } }
54-
55-
public bool IsReservedName
35+
private static bool IsUnderMinLength(string name)
5636
{
57-
get
58-
{
59-
var tokenValues = typeof(Tokens).GetFields().Select(item => item.GetValue(null)).Cast<string>().Select(item => item);
60-
return tokenValues.Contains(_identifier, StringComparer.InvariantCultureIgnoreCase);
61-
}
37+
return name.Length < MinVariableNameLength;
6238
}
6339

64-
public bool ContainsSpecialCharacters { get { return UsesSpecialCharacters(); } }
65-
66-
private string _identifier;
67-
public string Identifier
40+
private static bool EndsWithDigit(string name)
6841
{
69-
get { return _identifier; }
70-
set { _identifier = value; }
71-
}
42+
return char.IsDigit(name.Last());
43+
}
7244

73-
public bool IsValidName()
45+
public static bool StartsWithDigit(string name)
7446
{
75-
return !string.IsNullOrEmpty(_identifier)
76-
&& !StartsWithNumber
77-
&& !IsReservedName
78-
&& !ContainsSpecialCharacters;
47+
return !char.IsLetter(name.First());
7948
}
8049

81-
public bool IsMeaningfulName()
50+
private static readonly IEnumerable<string> ReservedNames =
51+
typeof (Tokens).GetFields().Select(item => item.GetValue(null).ToString()).ToArray();
52+
53+
public static bool IsReservedIdentifier(string name)
8254
{
83-
return HasVowels
84-
&& HasConsonants
85-
&& !IsSingleRepeatedLetter
86-
&& !IsTooShort
87-
&& !EndsWithNumber;
55+
return ReservedNames.Contains(name, StringComparer.InvariantCultureIgnoreCase);
8856
}
8957

90-
public bool IsFoundIn(string input)
58+
public static bool HasSpecialCharacters(string name)
9159
{
92-
const string noAdjacentLettersNumbersOrUnderscores = "([^0-9a-zA-Z_])";
93-
94-
Regex rgxSurroundedBySpacesOrEndsTheString = new Regex("(\\s)" + _identifier.ToUpper() + "(\\s|\\z)");
95-
96-
Regex rgxNoAdjacentLettersNumbersOrUnderscores = new Regex(noAdjacentLettersNumbersOrUnderscores + _identifier.ToUpper() + noAdjacentLettersNumbersOrUnderscores);
97-
98-
Regex rgxStartsTheString = new Regex("^" + _identifier.ToUpper() + noAdjacentLettersNumbersOrUnderscores);
99-
100-
return rgxSurroundedBySpacesOrEndsTheString.IsMatch(input.ToUpper())
101-
|| rgxNoAdjacentLettersNumbersOrUnderscores.IsMatch(input.ToUpper())
102-
|| rgxStartsTheString.IsMatch(input.ToUpper());
60+
return name.Any(c => !char.IsLetterOrDigit(c) && c != '_');
10361
}
10462

105-
private bool FirstLetterIsDigit()
63+
public static bool IsValidName(string name)
10664
{
107-
return !char.IsLetter(_identifier.FirstOrDefault());
65+
return !string.IsNullOrEmpty(name)
66+
&& !StartsWithDigit(name)
67+
&& !IsReservedIdentifier(name)
68+
&& !HasSpecialCharacters(name);
10869
}
10970

110-
private bool UsesSpecialCharacters()
71+
public static bool IsMeaningfulName(string name)
11172
{
112-
return _identifier.Any(c => !char.IsLetterOrDigit(c) && c != '_');
73+
return HasVowel(name)
74+
&& HasConsonant(name)
75+
&& !IsRepeatedCharacter(name)
76+
&& !IsUnderMinLength(name)
77+
&& !EndsWithDigit(name);
11378
}
11479
}
11580
}

RetailCoder.VBE/UI/Refactorings/AssignedByValParameterQuickFixDialog.cs

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,12 @@ namespace Rubberduck.UI.Refactorings
88
{
99
public partial class AssignedByValParameterQuickFixDialog : Form, IAssignedByValParameterQuickFixDialog
1010
{
11-
private readonly string _identifierName;
1211
private readonly IEnumerable<string> _forbiddenNames;
1312

1413
internal AssignedByValParameterQuickFixDialog(string identifierName, string declarationType, IEnumerable<string> forbiddenNames)
1514
{
1615
InitializeComponent();
1716
InitializeCaptions(identifierName, declarationType);
18-
_identifierName = identifierName;
1917
_forbiddenNames = forbiddenNames;
2018
}
2119

@@ -51,33 +49,27 @@ public string NewName
5149

5250
private string GetVariableNameFeedback()
5351
{
54-
var validator = new VariableNameValidator(NewName);
55-
5652
if (string.IsNullOrEmpty(NewName))
5753
{
5854
return string.Empty;
5955
}
60-
if (validator.StartsWithNumber)
56+
if (_forbiddenNames.Any(name => name.Equals(NewName, StringComparison.OrdinalIgnoreCase)))
57+
{
58+
return string.Format(RubberduckUI.AssignedByValDialog_NewNameAlreadyUsedFormat, NewName);
59+
}
60+
if (VariableNameValidator.StartsWithDigit(NewName))
6161
{
6262
return RubberduckUI.AssignedByValDialog_DoesNotStartWithLetter;
6363
}
64-
if (validator.ContainsSpecialCharacters)
64+
if (VariableNameValidator.HasSpecialCharacters(NewName))
6565
{
6666
return RubberduckUI.AssignedByValDialog_InvalidCharacters;
6767
}
68-
if (validator.IsReservedName)
68+
if (VariableNameValidator.IsReservedIdentifier(NewName))
6969
{
7070
return string.Format(RubberduckUI.AssignedByValDialog_ReservedKeywordFormat, NewName);
7171
}
72-
if (NewName.Equals(_identifierName, StringComparison.OrdinalIgnoreCase))
73-
{
74-
return string.Format(RubberduckUI.AssignedByValDialog_IsByValIdentifierFormat, NewName);
75-
}
76-
if (_forbiddenNames.Any(name => name.Equals(NewName, StringComparison.OrdinalIgnoreCase)))
77-
{
78-
return string.Format(RubberduckUI.AssignedByValDialog_NewNameAlreadyUsedFormat, NewName);
79-
}
80-
if (!validator.IsMeaningfulName())
72+
if (!VariableNameValidator.IsMeaningfulName(NewName))
8173
{
8274
return string.Format(RubberduckUI.AssignedByValDialog_QuestionableEntryFormat, NewName);
8375
}
@@ -86,8 +78,7 @@ private string GetVariableNameFeedback()
8678

8779
private void SetControlsProperties()
8880
{
89-
var validator = new VariableNameValidator(NewName);
90-
var isValid = validator.IsValidName() && !_forbiddenNames.Any(name => name.Equals(NewName, StringComparison.OrdinalIgnoreCase));
81+
var isValid = VariableNameValidator.IsValidName(NewName) && !_forbiddenNames.Any(name => name.Equals(NewName, StringComparison.OrdinalIgnoreCase));
9182
OkButton.Visible = isValid;
9283
OkButton.Enabled = isValid;
9384
InvalidNameValidationIcon.Visible = !isValid;

0 commit comments

Comments
 (0)