Skip to content

Commit 1fb243e

Browse files
authored
Merge branch 'next' into SavingModuleReferences
2 parents 5f86fa8 + 127ad15 commit 1fb243e

File tree

8 files changed

+201
-156
lines changed

8 files changed

+201
-156
lines changed

RetailCoder.VBE/Refactorings/EncapsulateField/EncapsulateFieldPresenter.cs

Lines changed: 30 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using System.Linq;
22
using System.Windows.Forms;
33
using Antlr4.Runtime;
4+
using Rubberduck.Parsing;
45
using Rubberduck.Parsing.Grammar;
6+
using Rubberduck.Parsing.Symbols;
57

68
namespace Rubberduck.Refactorings.EncapsulateField
79
{
@@ -21,42 +23,20 @@ public EncapsulateFieldPresenter(IEncapsulateFieldDialog view, EncapsulateFieldM
2123
_model = model;
2224
}
2325

24-
private static readonly string[] PrimitiveTypes =
25-
{
26-
Tokens.Boolean,
27-
Tokens.Byte,
28-
Tokens.Date,
29-
Tokens.Decimal,
30-
Tokens.Double,
31-
Tokens.Long,
32-
Tokens.LongLong,
33-
Tokens.LongPtr,
34-
Tokens.Integer,
35-
Tokens.Single,
36-
Tokens.String,
37-
Tokens.StrPtr
38-
};
39-
4026
public EncapsulateFieldModel Show()
4127
{
4228
if (_model.TargetDeclaration == null) { return null; }
4329

4430
_view.TargetDeclaration = _model.TargetDeclaration;
4531
_view.NewPropertyName = _model.TargetDeclaration.IdentifierName;
4632

33+
var isVariant = _model.TargetDeclaration.AsTypeName.Equals(Tokens.Variant);
34+
var isValueType = !isVariant && (SymbolList.ValueTypes.Contains(_model.TargetDeclaration.AsTypeName) ||
35+
_model.TargetDeclaration.DeclarationType == DeclarationType.Enumeration);
36+
4737
if (_model.TargetDeclaration.References.Any(r => r.IsAssignment))
4838
{
49-
if (PrimitiveTypes.Contains(_model.TargetDeclaration.AsTypeName))
50-
{
51-
_view.MustImplementLetSetterType = true;
52-
_view.CanImplementSetSetterType = false;
53-
}
54-
else if (_model.TargetDeclaration.AsTypeName != Tokens.Variant)
55-
{
56-
_view.MustImplementSetSetterType = true;
57-
_view.CanImplementLetSetterType = false;
58-
}
59-
else
39+
if (isVariant)
6040
{
6141
RuleContext node = _model.TargetDeclaration.References.First(r => r.IsAssignment).Context;
6242
while (!(node is VBAParser.LetStmtContext) && !(node is VBAParser.SetStmtContext))
@@ -66,25 +46,36 @@ public EncapsulateFieldModel Show()
6646

6747
if (node is VBAParser.LetStmtContext)
6848
{
69-
_view.MustImplementLetSetterType = true;
70-
_view.CanImplementSetSetterType = false;
49+
_view.CanImplementLetSetterType = true;
7150
}
7251
else
7352
{
74-
_view.MustImplementSetSetterType = true;
75-
_view.CanImplementLetSetterType = false;
76-
}
53+
_view.CanImplementSetSetterType = true;
54+
}
55+
}
56+
else if (isValueType)
57+
{
58+
_view.CanImplementLetSetterType = true;
59+
}
60+
else
61+
{
62+
_view.CanImplementSetSetterType = true;
7763
}
7864
}
7965
else
8066
{
81-
if (PrimitiveTypes.Contains(_model.TargetDeclaration.AsTypeName))
67+
if (isValueType)
68+
{
69+
_view.CanImplementLetSetterType = true;
70+
}
71+
else if (!isVariant)
8272
{
83-
_view.CanImplementSetSetterType = false;
73+
_view.CanImplementSetSetterType = true;
8474
}
85-
else if (_model.TargetDeclaration.AsTypeName != Tokens.Variant)
75+
else
8676
{
87-
_view.CanImplementLetSetterType = false;
77+
_view.CanImplementLetSetterType = true;
78+
_view.CanImplementSetSetterType = true;
8879
}
8980
}
9081

@@ -94,9 +85,9 @@ public EncapsulateFieldModel Show()
9485
}
9586

9687
_model.PropertyName = _view.NewPropertyName;
97-
_model.ImplementLetSetterType = _view.MustImplementLetSetterType;
98-
_model.ImplementSetSetterType = _view.MustImplementSetSetterType;
99-
_model.CanImplementLet = _view.CanImplementLetSetterType;
88+
_model.ImplementLetSetterType = _view.CanImplementLetSetterType;
89+
_model.ImplementSetSetterType = _view.CanImplementSetSetterType;
90+
_model.CanImplementLet = !_view.MustImplementSetSetterType;
10091

10192
_model.ParameterName = _view.ParameterName;
10293
return _model;

RetailCoder.VBE/Refactorings/EncapsulateField/EncapsulateFieldRefactoring.cs

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ private void AddProperty()
7979
var module = _model.TargetDeclaration.QualifiedName.QualifiedModuleName.Component.CodeModule;
8080
SetFieldToPrivate(module);
8181

82-
module.InsertLines(module.CountOfDeclarationLines + 1, GetPropertyText());
82+
module.InsertLines(module.CountOfDeclarationLines + 1, Environment.NewLine + GetPropertyText());
8383
}
8484

8585
private void UpdateReferences()
@@ -207,30 +207,17 @@ private string RemoveExtraComma(string str, int numParams, int indexRemoved)
207207

208208
private string GetPropertyText()
209209
{
210-
var getterText = string.Join(Environment.NewLine,
211-
string.Format(Environment.NewLine + "Public Property Get {0}() As {1}", _model.PropertyName,
212-
_model.TargetDeclaration.AsTypeName),
213-
string.Format(" {0}{1} = {2}", !_model.CanImplementLet || _model.ImplementSetSetterType ? "Set " : string.Empty, _model.PropertyName, _model.TargetDeclaration.IdentifierName),
214-
"End Property" + Environment.NewLine);
215-
216-
var letterText = string.Join(Environment.NewLine,
217-
string.Format(Environment.NewLine + "Public Property Let {0}(ByVal {1} As {2})",
218-
_model.PropertyName, _model.ParameterName, _model.TargetDeclaration.AsTypeName),
219-
string.Format(" {0} = {1}", _model.TargetDeclaration.IdentifierName, _model.ParameterName),
220-
"End Property" + Environment.NewLine);
221-
222-
var setterText = string.Join(Environment.NewLine,
223-
string.Format(Environment.NewLine + "Public Property Set {0}(ByVal {1} As {2})",
224-
_model.PropertyName, _model.ParameterName, _model.TargetDeclaration.AsTypeName),
225-
string.Format(" Set {0} = {1}", _model.TargetDeclaration.IdentifierName, _model.ParameterName),
226-
"End Property" + Environment.NewLine);
227-
228-
var propertyText = string.Join(string.Empty,
229-
getterText,
230-
(_model.ImplementLetSetterType ? letterText : string.Empty),
231-
(_model.ImplementSetSetterType ? setterText : string.Empty)).TrimEnd() + Environment.NewLine;
232-
233-
var propertyTextLines = propertyText.Split(new[] {Environment.NewLine}, StringSplitOptions.None);
210+
var generator = new PropertyGenerator
211+
{
212+
PropertyName = _model.PropertyName,
213+
AsTypeName = _model.TargetDeclaration.AsTypeName,
214+
BackingField = _model.TargetDeclaration.IdentifierName,
215+
ParameterName = _model.ParameterName,
216+
GenerateSetter = _model.ImplementSetSetterType,
217+
GenerateLetter = _model.ImplementLetSetterType
218+
};
219+
220+
var propertyTextLines = generator.AllPropertyCode.Split(new[] { Environment.NewLine }, StringSplitOptions.None);
234221
return string.Join(Environment.NewLine, _indenter.Indent(propertyTextLines, true));
235222
}
236223
}

RetailCoder.VBE/Refactorings/EncapsulateField/IEncapsulateFieldDialog.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ public interface IEncapsulateFieldDialog :IDialogView
1010
string NewPropertyName { get; set; }
1111
bool CanImplementLetSetterType { get; set; }
1212
bool CanImplementSetSetterType { get; set; }
13-
14-
bool MustImplementLetSetterType { get; set; }
15-
bool MustImplementSetSetterType { get; set; }
13+
bool LetSetterSelected { get; }
14+
bool SetSetterSelected { get; }
15+
bool MustImplementLetSetterType { get; }
16+
bool MustImplementSetSetterType { get; }
1617

1718
string ParameterName { get; set; }
1819
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
using System;
2+
3+
namespace Rubberduck.Refactorings.EncapsulateField
4+
{
5+
public class PropertyGenerator
6+
{
7+
public string PropertyName { get; set; }
8+
public string BackingField { get; set; }
9+
public string AsTypeName { get; set; }
10+
public string ParameterName { get; set; }
11+
public bool GenerateLetter { get; set; }
12+
public bool GenerateSetter { get; set; }
13+
14+
public string AllPropertyCode
15+
{
16+
get
17+
{
18+
return GetterCode +
19+
(GenerateLetter ? LetterCode : string.Empty) +
20+
(GenerateSetter ? SetterCode : string.Empty);
21+
}
22+
}
23+
24+
public string GetterCode
25+
{
26+
get
27+
{
28+
if (GenerateSetter && GenerateLetter)
29+
{
30+
return string.Join(Environment.NewLine,
31+
string.Format("Public Property Get {0}() As {1}", PropertyName, AsTypeName),
32+
string.Format(" If IsObject({0}) Then", BackingField),
33+
string.Format(" Set {0} = {1}", PropertyName, BackingField),
34+
" Else",
35+
string.Format(" {0} = {1}", PropertyName, BackingField),
36+
" End If",
37+
"End Property",
38+
Environment.NewLine);
39+
}
40+
41+
return string.Join(Environment.NewLine,
42+
string.Format("Public Property Get {0}() As {1}", PropertyName, AsTypeName),
43+
string.Format(" {0}{1} = {2}", GenerateSetter ? "Set " : string.Empty, PropertyName, BackingField),
44+
"End Property",
45+
Environment.NewLine);
46+
}
47+
}
48+
49+
public string SetterCode
50+
{
51+
get
52+
{
53+
if (!GenerateSetter)
54+
{
55+
return string.Empty;
56+
}
57+
return string.Join(Environment.NewLine,
58+
string.Format("Public Property Set {0}(ByVal {1} As {2})", PropertyName, ParameterName, AsTypeName),
59+
string.Format(" Set {0} = {1}", BackingField, ParameterName),
60+
"End Property",
61+
Environment.NewLine);
62+
}
63+
}
64+
65+
public string LetterCode
66+
{
67+
get
68+
{
69+
if (!GenerateLetter)
70+
{
71+
return string.Empty;
72+
}
73+
return string.Join(Environment.NewLine,
74+
string.Format("Public Property Let {0}(ByVal {1} As {2})", PropertyName, ParameterName, AsTypeName),
75+
string.Format(" {0} = {1}", BackingField, ParameterName),
76+
"End Property",
77+
Environment.NewLine);
78+
}
79+
}
80+
}
81+
}

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@
413413
<Compile Include="Inspections\VariableNameValidator.cs" />
414414
<Compile Include="Navigation\CodeExplorer\ICodeExplorerDeclarationViewModel.cs" />
415415
<Compile Include="Navigation\Folders\FolderHelper.cs" />
416+
<Compile Include="Refactorings\EncapsulateField\PropertyGenerator.cs" />
416417
<Compile Include="Refactorings\ExtractMethod\ExtractedMethod.cs" />
417418
<Compile Include="Refactorings\ExtractMethod\ExtractMethodParameterClassification.cs" />
418419
<Compile Include="Refactorings\ExtractMethod\ExtractMethodSelectionValidation.cs" />

0 commit comments

Comments
 (0)