Skip to content

Commit 830a349

Browse files
committed
Found failing scenario...added test and resolution
1 parent 28cfd6b commit 830a349

File tree

8 files changed

+77
-23
lines changed

8 files changed

+77
-23
lines changed

Rubberduck.Core/UI/Refactorings/EncapsulateField/EncapsulateFieldViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public IObjectStateUDT SelectedObjectStateUDT
9292
set
9393
{
9494
_selectedObjectStateUDT = value;
95-
Model.StateUDTField = _selectedObjectStateUDT;
95+
Model.ObjectStateUDTField = _selectedObjectStateUDT;
9696
SetObjectStateUDT();
9797
}
9898
}

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldModel.cs

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Diagnostics;
34
using System.Linq;
45
using Rubberduck.Parsing.Symbols;
56
using Rubberduck.Parsing.VBA;
@@ -41,7 +42,7 @@ public EncapsulateFieldModel(
4142
_objStateCandidates.Add(_newObjectStateUDT);
4243

4344
EncapsulateFieldStrategy = EncapsulateFieldStrategy.UseBackingFields;
44-
_activeObjectStateUDT = StateUDTField;
45+
_activeObjectStateUDT = ObjectStateUDTField;
4546
}
4647

4748
public QualifiedModuleName QualifiedModuleName => _targetQMN;
@@ -86,10 +87,9 @@ public List<IEncapsulateFieldCandidate> EncapsulationCandidates
8687
_convertedFields = new List<IEncapsulateFieldCandidate>();
8788
foreach (var field in _useBackingFieldCandidates)
8889
{
89-
_convertedFields.Add(new ConvertToUDTMember(field, StateUDTField));
90+
_convertedFields.Add(new ConvertToUDTMember(field, ObjectStateUDTField));
9091
}
9192
}
92-
9393
return _convertedFields;
9494
}
9595
}
@@ -114,7 +114,7 @@ public IEncapsulateFieldCandidate this[Declaration fieldDeclaration]
114114
=> EncapsulationCandidates.Where(c => c.Declaration == fieldDeclaration).Single();
115115

116116
private IObjectStateUDT _activeObjectStateUDT;
117-
public IObjectStateUDT StateUDTField
117+
public IObjectStateUDT ObjectStateUDTField
118118
{
119119
get
120120
{
@@ -143,7 +143,15 @@ public IObjectStateUDT StateUDTField
143143

144144
if (EncapsulateFieldStrategy == EncapsulateFieldStrategy.ConvertFieldsToUDTMembers)
145145
{
146-
AssignNoConflictIdentifiers();
146+
foreach (var field in EncapsulationCandidates)
147+
{
148+
if (field is IConvertToUDTMember convertedField)
149+
{
150+
convertedField.ObjectStateUDT = _activeObjectStateUDT;
151+
convertedField.ConflictFinder = _validationsProvider.ConflictDetector(EncapsulateFieldStrategy, _declarationFinderProvider);
152+
convertedField.ConflictFinder.AssignNoConflictIdentifiers(convertedField);
153+
}
154+
}
147155
}
148156
}
149157
}
@@ -166,26 +174,20 @@ private void UpdateFieldCandidatesForUseBackingFieldsStrategy()
166174
candidate.NameValidator = EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.Default);
167175
break;
168176
}
169-
AssignNoConflictIdentifiers();
177+
candidate.ConflictFinder = _validationsProvider.ConflictDetector(EncapsulateFieldStrategy, _declarationFinderProvider);
178+
candidate.ConflictFinder.AssignNoConflictIdentifiers(candidate);
170179
}
171180
}
172181

173182
private void UpdateFieldCandidatesForConvertFieldsToUDTMembersStrategy()
174183
{
175-
foreach (var candidate in EncapsulationCandidates)
184+
foreach (var candidate in EncapsulationCandidates.Cast<IConvertToUDTMember>())
176185
{
186+
candidate.ObjectStateUDT = ObjectStateUDTField;
177187
candidate.NameValidator = candidate.Declaration.IsArray
178188
? EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedTypeMemberArray)
179189
: EncapsulateFieldValidationsProvider.NameOnlyValidator(NameValidators.UserDefinedTypeMember);
180190

181-
AssignNoConflictIdentifiers();
182-
}
183-
}
184-
185-
private void AssignNoConflictIdentifiers()
186-
{
187-
foreach (var candidate in EncapsulationCandidates)
188-
{
189191
candidate.ConflictFinder = _validationsProvider.ConflictDetector(EncapsulateFieldStrategy, _declarationFinderProvider);
190192
candidate.ConflictFinder.AssignNoConflictIdentifiers(candidate);
191193
}

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldRefactoring.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ protected override EncapsulateFieldModel InitializeModel(Declaration target)
9191
if (builder.ObjectStateUDT != null)
9292
{
9393
model.EncapsulateFieldStrategy = EncapsulateFieldStrategy.ConvertFieldsToUDTMembers;
94-
model.StateUDTField = builder.ObjectStateUDT;
94+
model.ObjectStateUDTField = builder.ObjectStateUDT;
9595
}
9696

9797
return model;

Rubberduck.Refactorings/EncapsulateField/EncapsulationStrategies/ConvertFieldsToUDTMembers.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class ConvertFieldsToUDTMembers : EncapsulateFieldStrategyBase
2020
public ConvertFieldsToUDTMembers(IDeclarationFinderProvider declarationFinderProvider, EncapsulateFieldModel model, IIndenter indenter)
2121
: base(declarationFinderProvider, model, indenter)
2222
{
23-
_stateUDTField = model.StateUDTField;
23+
_stateUDTField = model.ObjectStateUDTField;
2424
}
2525

2626
protected override void ModifyFields(IEncapsulateFieldRewriteSession refactorRewriteSession)
@@ -62,9 +62,9 @@ protected override void LoadNewDeclarationBlocks()
6262
return;
6363
}
6464

65-
protected override void LoadNewPropertyBlocks(/*EncapsulateFieldModel model*/)
65+
protected override void LoadNewPropertyBlocks()
6666
{
67-
var propertyGenerationSpecs = /*model.SelectedFieldCandidates*/SelectedFields.SelectMany(f => f.PropertyAttributeSets);
67+
var propertyGenerationSpecs = SelectedFields.SelectMany(f => f.PropertyAttributeSets);
6868

6969
var generator = new PropertyGenerator();
7070
foreach (var spec in propertyGenerationSpecs)

Rubberduck.Refactorings/EncapsulateField/FieldCandidates/ConvertToUDTMemberCandidate.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public interface IConvertToUDTMember : IEncapsulateFieldCandidate
1616
{
1717
string UDTMemberDeclaration { get; }
1818
IEncapsulateFieldCandidate WrappedCandidate { get; }
19+
IObjectStateUDT ObjectStateUDT { set; get; }
1920
}
2021

2122
public class ConvertToUDTMember : IConvertToUDTMember
@@ -46,7 +47,7 @@ public virtual string UDTMemberDeclaration
4647

4748
public IEncapsulateFieldCandidate WrappedCandidate => _wrapped;
4849

49-
public IObjectStateUDT ObjectStateUDT { private set; get; }
50+
public IObjectStateUDT ObjectStateUDT { set; get; }
5051

5152
public string TargetID => _wrapped.TargetID;
5253

Rubberduck.Refactorings/EncapsulateField/ObjectStateUDT.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ public void AddMembers(IEnumerable<IConvertToUDTMember> fields)
120120
{
121121
foreach (var member in _wrappedUDT.Members)
122122
{
123-
_convertedMembers.Add(new ConvertToUDTMember(member, this));
123+
var convertedMember = new ConvertToUDTMember(member, this) { EncapsulateFlag = false };
124+
_convertedMembers.Add(convertedMember);
124125
}
125126
}
126127
_convertedMembers.AddRange(fields);

RubberduckTests/Refactoring/EncapsulateField/EncapsulateFIeldTestSupport.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public Func<EncapsulateFieldModel, EncapsulateFieldModel> SetParameters(UserInpu
7474

7575
if (stateUDT != null)
7676
{
77-
model.StateUDTField = stateUDT;
77+
model.ObjectStateUDTField = stateUDT;
7878
}
7979
}
8080
else

RubberduckTests/Refactoring/EncapsulateField/EncapsulateUsingStateUDTTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,56 @@ End Sub
657657
StringAssert.Contains($" .MyProperty = bar", referencingClassCode);
658658
}
659659

660+
[Test]
661+
[Category("Refactorings")]
662+
[Category("Encapsulate Field")]
663+
public void PrivateUDT_SelectedOtherThanObjectStateUDT()
664+
{
665+
string inputCode =
666+
$@"
667+
668+
Private Type TTest
669+
TestValue As String
670+
TestNumber As Long
671+
End Type
672+
673+
Private Type TTestModule1
674+
SomeValue As Long
675+
End Type
676+
677+
Private mTest As TTest
678+
679+
Private this As TTestModule1
680+
681+
Private the|Target As Variant
682+
683+
Public Property Get SomeValue() As Long
684+
SomeValue = this.SomeValue
685+
End Property
686+
687+
Public Property Let SomeValue(ByVal value As Long)
688+
this.SomeValue = value
689+
End Property
690+
691+
Public Sub Foo(arg As Long)
692+
SomeValue = arg * 4
693+
End Sub
694+
";
695+
696+
var userInput = new UserInputDataObject()
697+
.UserSelectsField("theTarget");
698+
699+
userInput.EncapsulateUsingUDTField("mTest");
700+
701+
var presenterAction = Support.SetParameters(userInput);
702+
703+
var actualCode = Support.RefactoredCode(inputCode.ToCodeString(), presenterAction);
704+
705+
StringAssert.DoesNotContain("TheTarget = this.TheTarget", actualCode);
706+
StringAssert.Contains("TheTarget = mTest.TheTarget", actualCode);
707+
StringAssert.Contains("TheTarget As Variant", actualCode);
708+
}
709+
660710
protected override IRefactoring TestRefactoring(IRewritingManager rewritingManager, RubberduckParserState state, IRefactoringPresenterFactory factory, ISelectionService selectionService)
661711
{
662712
return Support.SupportTestRefactoring(rewritingManager, state, factory, selectionService);

0 commit comments

Comments
 (0)