Skip to content

Commit d2189da

Browse files
authored
Merge pull request #5556 from BZngr/CodeBuilder_ChangeDefaultRHSParam
CodeBuilder - Provide 'casing friendly' default property RHS parameter name
2 parents df01e8a + 70edc91 commit d2189da

22 files changed

+183
-229
lines changed

Rubberduck.Refactorings/Common/CodeBuilder.cs

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Rubberduck.Parsing.Grammar;
1+
using Rubberduck.Common;
2+
using Rubberduck.Parsing.Grammar;
23
using Rubberduck.Parsing.Symbols;
34
using System;
45
using System.Collections.Generic;
@@ -11,19 +12,13 @@ public interface ICodeBuilder
1112
/// <summary>
1213
/// Returns ModuleBodyElementDeclaration signature with an ImprovedArgument list
1314
/// </summary>
14-
/// <param name="declaration"></param>
15-
/// <returns></returns>
1615
string ImprovedFullMemberSignature(ModuleBodyElementDeclaration declaration);
1716

1817
/// <summary>
1918
/// Returns a ModuleBodyElementDeclaration block
2019
/// with an ImprovedArgument List
2120
/// </summary>
22-
/// <param name="declaration"></param>
2321
/// <param name="content">Main body content/logic of the member</param>
24-
/// <param name="accessibility"></param>
25-
/// <param name="newIdentifier"></param>
26-
/// <returns></returns>
2722
string BuildMemberBlockFromPrototype(ModuleBodyElementDeclaration declaration,
2823
string content = null,
2924
string accessibility = null,
@@ -34,19 +29,14 @@ string BuildMemberBlockFromPrototype(ModuleBodyElementDeclaration declaration,
3429
/// 1. Explicitly declares Property Let\Set value parameter as ByVal
3530
/// 2. Ensures UserDefined Type parameters are declared either explicitly or implicitly as ByRef
3631
/// </summary>
37-
/// <param name="declaration"></param>
38-
/// <returns></returns>
3932
string ImprovedArgumentList(ModuleBodyElementDeclaration declaration);
4033

4134
/// <summary>
4235
/// Generates a Property Get codeblock based on the prototype declaration
4336
/// </summary>
4437
/// <param name="prototype">VariableDeclaration or UserDefinedTypeMember</param>
45-
/// <param name="propertyIdentifier"></param>
46-
/// <param name="accessibility"></param>
4738
/// <param name="content">Member body content. Formatting is the responsibility of the caller</param>
48-
/// <param name="parameterIdentifier">Defaults to 'value' unless otherwise specified</param>
49-
/// <returns></returns>
39+
/// <param name="parameterIdentifier">Defaults to '<paramref name="propertyIdentifier"/>Value' unless otherwise specified</param>
5040
bool TryBuildPropertyGetCodeBlock(Declaration prototype,
5141
string propertyIdentifier,
5242
out string codeBlock,
@@ -57,11 +47,8 @@ bool TryBuildPropertyGetCodeBlock(Declaration prototype,
5747
/// Generates a Property Let codeblock based on the prototype declaration
5848
/// </summary>
5949
/// <param name="prototype">VariableDeclaration or UserDefinedTypeMember</param>
60-
/// <param name="propertyIdentifier"></param>
61-
/// <param name="accessibility"></param>
62-
/// <param name="content">Membmer body content. Formatting is the responsibility of the caller</param>
63-
/// <param name="parameterIdentifier">Defaults to 'value' unless otherwise specified</param>
64-
/// <returns></returns>
50+
/// <param name="content">Member body content. Formatting is the responsibility of the caller</param>
51+
/// <param name="parameterIdentifier">Defaults to '<paramref name="propertyIdentifier"/>Value' unless otherwise specified</param>
6552
bool TryBuildPropertyLetCodeBlock(Declaration prototype,
6653
string propertyIdentifier,
6754
out string codeBlock,
@@ -73,21 +60,26 @@ bool TryBuildPropertyLetCodeBlock(Declaration prototype,
7360
/// Generates a Property Set codeblock based on the prototype declaration
7461
/// </summary>
7562
/// <param name="prototype">VariableDeclaration or UserDefinedTypeMember</param>
76-
/// <param name="propertyIdentifier"></param>
77-
/// <param name="accessibility"></param>
78-
/// <param name="content">Membmer body content. Formatting is the responsibility of the caller</param>
79-
/// <param name="parameterIdentifier">Defaults to 'value' unless otherwise specified</param>
80-
/// <returns></returns>
63+
/// <param name="content">Member body content. Formatting is the responsibility of the caller</param>
64+
/// <param name="parameterIdentifier">Defaults to '<paramref name="propertyIdentifier"/>Value' unless otherwise specified</param>
8165
bool TryBuildPropertySetCodeBlock(Declaration prototype,
8266
string propertyIdentifier,
8367
out string codeBlock,
8468
string accessibility = null,
8569
string content = null,
8670
string parameterIdentifier = null);
71+
/// <summary>
72+
/// Generates a default RHS property parameter IdentifierName
73+
/// </summary>
74+
/// <param name="propertyIdentifier">Let/Set Property IdentifierName</param>
75+
string BuildPropertyRhsParameterName(string propertyIdentifier);
8776
}
8877

8978
public class CodeBuilder : ICodeBuilder
9079
{
80+
public string BuildPropertyRhsParameterName(string propertyIdentifier)
81+
=> string.Format(Resources.Refactorings.Refactorings.CodeBuilder_DefaultPropertyRHSParamFormat, propertyIdentifier.ToLowerCaseFirstLetter());
82+
9183
public string BuildMemberBlockFromPrototype(ModuleBodyElementDeclaration declaration,
9284
string content = null,
9385
string accessibility = null,
@@ -127,7 +119,7 @@ private bool TryBuildPropertyBlockFromTarget<T>(T prototype, DeclarationType let
127119
return false;
128120
}
129121

130-
var propertyValueParam = parameterIdentifier ?? Resources.RubberduckUI.EncapsulateField_DefaultPropertyParameter;
122+
var propertyValueParam = parameterIdentifier ?? BuildPropertyRhsParameterName(propertyIdentifier);
131123

132124
var asType = prototype.IsArray
133125
? $"{Tokens.Variant}"

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldElementsBuilder.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using Rubberduck.Parsing.Symbols;
33
using Rubberduck.Parsing.VBA;
44
using Rubberduck.Refactorings.Common;
5-
using Rubberduck.Refactorings.EncapsulateField.Extensions;
65
using Rubberduck.VBEditor;
76
using System;
87
using System.Collections.Generic;
@@ -16,12 +15,14 @@ public class EncapsulateFieldElementsBuilder
1615
private readonly IDeclarationFinderProvider _declarationFinderProvider;
1716
private QualifiedModuleName _targetQMN;
1817
private string _defaultObjectStateUDTTypeName;
18+
private ICodeBuilder _codeBuilder;
1919

2020
public EncapsulateFieldElementsBuilder(IDeclarationFinderProvider declarationFinderProvider, QualifiedModuleName targetQMN)
2121
{
2222
_declarationFinderProvider = declarationFinderProvider;
2323
_targetQMN = targetQMN;
2424
_defaultObjectStateUDTTypeName = $"T{_targetQMN.ComponentName}";
25+
_codeBuilder = new CodeBuilder();
2526
CreateRefactoringElements();
2627
}
2728

@@ -110,7 +111,7 @@ private IEncapsulateFieldCandidate CreateCandidate(Declaration target, IValidate
110111
if (target.IsUserDefinedType())
111112
{
112113
var udtValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedType);
113-
var udtField = new UserDefinedTypeCandidate(target, udtValidator) as IUserDefinedTypeCandidate;
114+
var udtField = new UserDefinedTypeCandidate(target, udtValidator, _codeBuilder.BuildPropertyRhsParameterName) as IUserDefinedTypeCandidate;
114115

115116
(Declaration udtDeclaration, IEnumerable<Declaration> udtMembers) = GetUDTAndMembersForField(udtField);
116117

@@ -125,7 +126,7 @@ private IEncapsulateFieldCandidate CreateCandidate(Declaration target, IValidate
125126
{
126127
udtMemberValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedTypeMemberArray);
127128
}
128-
var candidateUDTMember = new UserDefinedTypeMemberCandidate(CreateCandidate(udtMemberDeclaration, udtMemberValidator), udtField) as IUserDefinedTypeMemberCandidate;
129+
var candidateUDTMember = new UserDefinedTypeMemberCandidate(CreateCandidate(udtMemberDeclaration, udtMemberValidator), udtField, _codeBuilder.BuildPropertyRhsParameterName) as IUserDefinedTypeMemberCandidate;
129130

130131
udtField.AddMember(candidateUDTMember);
131132
}
@@ -141,10 +142,10 @@ private IEncapsulateFieldCandidate CreateCandidate(Declaration target, IValidate
141142
}
142143
else if (target.IsArray)
143144
{
144-
return new ArrayCandidate(target, validator);
145+
return new ArrayCandidate(target, validator, _codeBuilder.BuildPropertyRhsParameterName);
145146
}
146147

147-
var candidate = new EncapsulateFieldCandidate(target, validator);
148+
var candidate = new EncapsulateFieldCandidate(target, validator, _codeBuilder.BuildPropertyRhsParameterName);
148149
return candidate;
149150
}
150151

Rubberduck.Refactorings/EncapsulateField/FieldCandidates/ArrayCandidate.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Antlr4.Runtime;
2-
using Rubberduck.Parsing;
1+
using Rubberduck.Parsing;
32
using Rubberduck.Parsing.Grammar;
43
using Rubberduck.Parsing.Symbols;
54
using Rubberduck.Resources;
@@ -17,8 +16,8 @@ public interface IArrayCandidate : IEncapsulateFieldCandidate
1716
public class ArrayCandidate : EncapsulateFieldCandidate, IArrayCandidate
1817
{
1918
private string _subscripts;
20-
public ArrayCandidate(Declaration declaration, IValidateVBAIdentifiers validator)
21-
:base(declaration, validator)
19+
public ArrayCandidate(Declaration declaration, IValidateVBAIdentifiers validator, Func<string,string> parameterNameBuilder)
20+
:base(declaration, validator, parameterNameBuilder)
2221
{
2322
ImplementLet = false;
2423
ImplementSet = false;

Rubberduck.Refactorings/EncapsulateField/FieldCandidates/ConvertToUDTMemberCandidate.cs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
32
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
6-
using Antlr4.Runtime;
73
using Rubberduck.Common;
8-
using Rubberduck.Parsing.Grammar;
94
using Rubberduck.Parsing.Symbols;
105
using Rubberduck.VBEditor;
116

@@ -90,11 +85,7 @@ public bool IsReadOnly
9085
get => _wrapped.IsReadOnly;
9186
}
9287

93-
public string ParameterName
94-
{
95-
set => _wrapped.ParameterName = value;
96-
get => _wrapped.ParameterName;
97-
}
88+
public string ParameterName => _wrapped.ParameterName;
9889

9990
public IValidateVBAIdentifiers NameValidator
10091
{

Rubberduck.Refactorings/EncapsulateField/FieldCandidates/EncapsulateFieldCandidate.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,7 @@
33
using Rubberduck.Parsing.Symbols;
44
using Rubberduck.Refactorings.Common;
55
using Rubberduck.Refactorings.EncapsulateField.Extensions;
6-
using Rubberduck.Resources;
76
using Rubberduck.VBEditor;
8-
using Rubberduck.VBEditor.SafeComWrappers;
97
using System;
108
using System.Collections.Generic;
119

@@ -31,7 +29,7 @@ public interface IEncapsulateFieldCandidate : IEncapsulateFieldRefactoringElemen
3129
bool ImplementLet { get; }
3230
bool ImplementSet { get; }
3331
bool IsReadOnly { set; get; }
34-
string ParameterName { set; get; }
32+
string ParameterName { get; }
3533
IValidateVBAIdentifiers NameValidator { set; get; }
3634
IEncapsulateFieldConflictFinder ConflictFinder { set; get; }
3735
bool TryValidateEncapsulationAttributes(out string errorMessage);
@@ -47,11 +45,13 @@ public class EncapsulateFieldCandidate : IEncapsulateFieldCandidate
4745
protected int _hashCode;
4846
private string _identifierName;
4947
protected EncapsulationIdentifiers _fieldAndProperty;
48+
private Func<string, string> _parameterNameBuilder;
5049

51-
public EncapsulateFieldCandidate(Declaration declaration, IValidateVBAIdentifiers identifierValidator)
50+
public EncapsulateFieldCandidate(Declaration declaration, IValidateVBAIdentifiers identifierValidator, Func<string, string> parameterNameBuilder)
5251
{
5352
_target = declaration;
5453
NameValidator = identifierValidator;
54+
_parameterNameBuilder = parameterNameBuilder;
5555

5656
_fieldAndProperty = new EncapsulationIdentifiers(declaration.IdentifierName, identifierValidator);
5757
IdentifierName = declaration.IdentifierName;
@@ -164,8 +164,6 @@ public string PropertyIdentifier
164164
_fieldAndProperty.Property = value;
165165

166166
TryRestoreNewFieldNameAsOriginalFieldIdentifierName();
167-
168-
EncapsulateFieldValidationsProvider.AssignNoConflictParameter(this);
169167
}
170168
}
171169

@@ -204,7 +202,7 @@ public string IdentifierName
204202

205203
public virtual string ReferenceQualifier { set; get; }
206204

207-
public string ParameterName { set; get; } = RubberduckUI.EncapsulateField_DefaultPropertyParameter;
205+
public string ParameterName => _parameterNameBuilder(PropertyIdentifier);
208206

209207
private bool _implLet;
210208
public bool ImplementLet { get => !IsReadOnly && _implLet; set => _implLet = value; }

Rubberduck.Refactorings/EncapsulateField/FieldCandidates/EncapsulationIdentifiers.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
1-
using Rubberduck.Parsing.Symbols;
2-
using Rubberduck.Parsing.VBA.Extensions;
3-
using Rubberduck.Common;
1+
using Rubberduck.Common;
42
using System.Collections.Generic;
53
using Rubberduck.Refactorings.EncapsulateField.Extensions;
6-
using System;
7-
using Rubberduck.Resources;
84

95
namespace Rubberduck.Refactorings.EncapsulateField
106
{
117
public class EncapsulationIdentifiers
128
{
13-
private static string DEFAULT_WRITE_PARAMETER = RubberduckUI.EncapsulateField_DefaultPropertyParameter;
14-
159
private KeyValuePair<string, string> _fieldAndProperty;
1610
private string _targetIdentifier;
17-
private string _setLetParameter;
1811

1912
public EncapsulationIdentifiers(string field, IValidateVBAIdentifiers identifierValidator)
2013
{
@@ -42,7 +35,6 @@ public EncapsulationIdentifiers(string field, IValidateVBAIdentifiers identifier
4235
}
4336

4437
_fieldAndProperty = new KeyValuePair<string, string>(DefaultNewFieldName, DefaultPropertyName);
45-
_setLetParameter = DEFAULT_WRITE_PARAMETER;
4638
}
4739

4840
public string TargetFieldName => _targetIdentifier;
@@ -68,7 +60,5 @@ public string Property
6860
_fieldAndProperty = new KeyValuePair<string, string>(_fieldAndProperty.Key, value);
6961
}
7062
}
71-
72-
public string SetLetParameter => DEFAULT_WRITE_PARAMETER;
7363
}
7464
}

Rubberduck.Refactorings/EncapsulateField/FieldCandidates/UserDefinedTypeCandidate.cs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
using Antlr4.Runtime;
2-
using Rubberduck.Common;
3-
using Rubberduck.Parsing;
4-
using Rubberduck.Parsing.Grammar;
1+
using Rubberduck.Parsing.Grammar;
52
using Rubberduck.Parsing.Symbols;
63
using Rubberduck.Refactorings.Common;
74
using System;
85
using System.Collections.Generic;
9-
using System.Linq;
106

117
namespace Rubberduck.Refactorings.EncapsulateField
128
{
@@ -21,8 +17,8 @@ public interface IUserDefinedTypeCandidate : IEncapsulateFieldCandidate
2117

2218
public class UserDefinedTypeCandidate : EncapsulateFieldCandidate, IUserDefinedTypeCandidate
2319
{
24-
public UserDefinedTypeCandidate(Declaration declaration, IValidateVBAIdentifiers identifierValidator)
25-
: base(declaration, identifierValidator)
20+
public UserDefinedTypeCandidate(Declaration declaration, IValidateVBAIdentifiers identifierValidator, Func<string,string> parameterNameBuilder)
21+
: base(declaration, identifierValidator, parameterNameBuilder)
2622
{
2723
}
2824

Rubberduck.Refactorings/EncapsulateField/FieldCandidates/UserDefinedTypeMemberCandidate.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
using Antlr4.Runtime;
2-
using Rubberduck.Parsing;
1+
using Rubberduck.Parsing;
32
using Rubberduck.Parsing.Grammar;
43
using Rubberduck.Parsing.Symbols;
5-
using Rubberduck.Refactorings.EncapsulateField.Extensions;
64
using Rubberduck.VBEditor;
5+
using System;
76
using System.Collections.Generic;
8-
using System.Diagnostics;
97
using System.Linq;
108

119
namespace Rubberduck.Refactorings.EncapsulateField
@@ -22,9 +20,11 @@ public class UserDefinedTypeMemberCandidate : IUserDefinedTypeMemberCandidate
2220
{
2321
private int _hashCode;
2422
private readonly string _uniqueID;
25-
public UserDefinedTypeMemberCandidate(IEncapsulateFieldCandidate candidate, IUserDefinedTypeCandidate udtField)
23+
private Func<string, string> _parameterNameBuilder;
24+
public UserDefinedTypeMemberCandidate(IEncapsulateFieldCandidate candidate, IUserDefinedTypeCandidate udtField, Func<string,string> parameterNameBuilder)
2625
{
2726
_wrappedCandidate = candidate;
27+
_parameterNameBuilder = parameterNameBuilder;
2828
UDTField = udtField;
2929
PropertyIdentifier = IdentifierName;
3030
BackingIdentifier = IdentifierName;
@@ -203,11 +203,7 @@ public QualifiedModuleName QualifiedModuleName
203203

204204
public string PropertyAsTypeName => _wrappedCandidate.PropertyAsTypeName;
205205

206-
public string ParameterName
207-
{
208-
set => _wrappedCandidate.ParameterName = value;
209-
get => _wrappedCandidate.ParameterName;
210-
}
206+
public string ParameterName => _parameterNameBuilder(PropertyIdentifier);
211207

212208
public bool ImplementLet => _wrappedCandidate.ImplementLet;
213209

Rubberduck.Refactorings/EncapsulateField/Validations/EncapsulateFieldConflictFinderBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ protected virtual IEncapsulateFieldCandidate AssignNoConflictIdentifier(IEncapsu
8787
isConflictingIdentifier = HasConflictingIdentifierIgnoreEncapsulationFlag(candidate, declarationType, out _);
8888
}
8989

90-
return EncapsulateFieldValidationsProvider.AssignNoConflictParameter(candidate);
90+
return candidate;
9191
}
9292

9393
public bool IsConflictingProposedIdentifier(string fieldName, IEncapsulateFieldCandidate candidate, DeclarationType declarationType)

Rubberduck.Refactorings/EncapsulateField/Validations/EncapsulateFieldValidationsProvider.cs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,6 @@ private void LoadUDTMemberCandidates(IUserDefinedTypeCandidate udtCandidate)
8282
public static IValidateVBAIdentifiers NameOnlyValidator(NameValidators validatorType)
8383
=> _nameOnlyValidators[validatorType];
8484

85-
public static IEncapsulateFieldCandidate AssignNoConflictParameter(IEncapsulateFieldCandidate candidate)
86-
{
87-
candidate.ParameterName = RubberduckUI.EncapsulateField_DefaultPropertyParameter;
88-
89-
var guard = 0;
90-
while (guard++ < 10 && (candidate.BackingIdentifier.IsEquivalentVBAIdentifierTo(candidate.ParameterName)
91-
|| candidate.PropertyIdentifier.IsEquivalentVBAIdentifierTo(candidate.ParameterName)))
92-
{
93-
candidate.ParameterName = candidate.ParameterName.IncrementEncapsulationIdentifier();
94-
}
95-
return candidate;
96-
}
97-
9885
public static IObjectStateUDT AssignNoConflictIdentifiers(IObjectStateUDT stateUDT, IDeclarationFinderProvider declarationFinderProvider)
9986
{
10087
var members = declarationFinderProvider.DeclarationFinder.Members(stateUDT.QualifiedModuleName);

0 commit comments

Comments
 (0)