Skip to content

Commit 9185e67

Browse files
committed
Refactor split of existing code vs new code ops
Moved residual new content generation/insertion out of refactoring logic operating on existing content.
1 parent 8b59aa5 commit 9185e67

21 files changed

+274
-204
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using Rubberduck.Parsing.Symbols;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
6+
namespace Rubberduck.Refactorings.CreateUDTMember
7+
{
8+
public class CreateUDTMemberModel : IRefactoringModel
9+
{
10+
private Dictionary<Declaration, List<(VariableDeclaration prototype, string UDTMemberIdentifier)>> _targets { get; } = new Dictionary<Declaration, List<(VariableDeclaration, string)>>();
11+
12+
public CreateUDTMemberModel()
13+
{ }
14+
15+
public CreateUDTMemberModel(Declaration userDefinedType, IEnumerable<(VariableDeclaration prototype, string UserDefinedTypeMemberIdentifier)> conversionModels)
16+
{
17+
foreach ((VariableDeclaration prototype, string UDTMemberIdentifier) in conversionModels)
18+
{
19+
AssignPrototypeToUserDefinedType(userDefinedType, prototype, UDTMemberIdentifier);
20+
}
21+
}
22+
23+
public IReadOnlyCollection<Declaration> UserDefinedTypeTargets => _targets.Keys;
24+
25+
public IEnumerable<(VariableDeclaration prototype, string userDefinedTypeMemberIdentifier)> this[Declaration udt]
26+
=> _targets[udt].Select(pr => (pr.prototype, pr.UDTMemberIdentifier));
27+
28+
private void AssignPrototypeToUserDefinedType(Declaration udt, VariableDeclaration prototype, string udtMemberIdentifierName = null)
29+
{
30+
if (!udt.DeclarationType.HasFlag(DeclarationType.UserDefinedType))
31+
{
32+
throw new ArgumentException();
33+
}
34+
35+
if (!(_targets.TryGetValue(udt, out var memberPrototypes)))
36+
{
37+
_targets.Add(udt, new List<(VariableDeclaration, string)>());
38+
}
39+
else
40+
{
41+
var hasDuplicateMemberNames = memberPrototypes
42+
.Select(pr => pr.UDTMemberIdentifier?.ToUpperInvariant() ?? pr.prototype.IdentifierName)
43+
.GroupBy(uc => uc).Any(g => g.Count() > 1);
44+
45+
if (hasDuplicateMemberNames)
46+
{
47+
throw new ArgumentException();
48+
}
49+
}
50+
51+
_targets[udt].Add((prototype, udtMemberIdentifierName ?? prototype.IdentifierName));
52+
}
53+
}
54+
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,21 @@
66
using System;
77
using System.Collections.Generic;
88
using System.Linq;
9-
namespace Rubberduck.Refactorings.DeclareFieldsAsUDTMembers
9+
namespace Rubberduck.Refactorings.CreateUDTMember
1010
{
11-
public class DeclareFieldsAsUDTMembersRefactoringAction : CodeOnlyRefactoringActionBase<DeclareFieldsAsUDTMembersModel>
11+
public class CreateUDTMemberRefactoringAction : CodeOnlyRefactoringActionBase<CreateUDTMemberModel>
1212
{
1313
private readonly IDeclarationFinderProvider _declarationFinderProvider;
1414
private readonly ICodeBuilder _codeBuilder;
1515

16-
public DeclareFieldsAsUDTMembersRefactoringAction(IDeclarationFinderProvider declarationFinderProvider,IRewritingManager rewritingManager, ICodeBuilder codeBuilder)
16+
public CreateUDTMemberRefactoringAction(IDeclarationFinderProvider declarationFinderProvider,IRewritingManager rewritingManager, ICodeBuilder codeBuilder)
1717
: base(rewritingManager)
1818
{
1919
_declarationFinderProvider = declarationFinderProvider;
2020
_codeBuilder = codeBuilder;
2121
}
2222

23-
public override void Refactor(DeclareFieldsAsUDTMembersModel model, IRewriteSession rewriteSession)
23+
public override void Refactor(CreateUDTMemberModel model, IRewriteSession rewriteSession)
2424
{
2525
if (model.UserDefinedTypeTargets.Any( udt => !(udt.Context is VBAParser.UdtDeclarationContext)))
2626
{

Rubberduck.Refactorings/DeclareFieldsAsUDTMembers/DeclareFieldsAsUDTMembersModel.cs

Lines changed: 0 additions & 46 deletions
This file was deleted.

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldModelFactory.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,15 @@ public class EncapsulateFieldModelFactory : IEncapsulateFieldModelFactory
1919
private readonly IEncapsulateFieldUseBackingUDTMemberModelFactory _useBackingUDTMemberModelFactory;
2020
private readonly IEncapsulateFieldUseBackingFieldModelFactory _useBackingFieldModelFactory;
2121
private readonly IEncapsulateFieldCandidateCollectionFactory _fieldCandidateCollectionFactory;
22-
private readonly IEncapsulateFieldRequestFactory _requestFactory;
2322

2423
public EncapsulateFieldModelFactory(
2524
IEncapsulateFieldUseBackingUDTMemberModelFactory encapsulateFieldUseBackingUDTMemberModelFactory,
2625
IEncapsulateFieldUseBackingFieldModelFactory encapsulateFieldUseBackingFieldModelFactory,
27-
IEncapsulateFieldCandidateCollectionFactory encapsulateFieldCandidateCollectionFactory,
28-
IEncapsulateFieldRequestFactory encapsulateFieldRequestFactory)
26+
IEncapsulateFieldCandidateCollectionFactory encapsulateFieldCandidateCollectionFactory)
2927
{
3028
_useBackingUDTMemberModelFactory = encapsulateFieldUseBackingUDTMemberModelFactory as IEncapsulateFieldUseBackingUDTMemberModelFactory;
3129
_useBackingFieldModelFactory = encapsulateFieldUseBackingFieldModelFactory;
3230
_fieldCandidateCollectionFactory = encapsulateFieldCandidateCollectionFactory;
33-
_requestFactory = encapsulateFieldRequestFactory;
3431
}
3532

3633
public EncapsulateFieldModel Create(Declaration target)
@@ -42,12 +39,11 @@ public EncapsulateFieldModel Create(Declaration target)
4239

4340
var fieldCandidates = _fieldCandidateCollectionFactory.Create(targetField.QualifiedModuleName);
4441

45-
var encapsulationRequest = _requestFactory.Create(targetField);
46-
var requests = new List<EncapsulateFieldRequest>() { encapsulationRequest };
42+
var fieldEncapsulationModels = new List<FieldEncapsulationModel>() { new FieldEncapsulationModel(targetField) };
4743

48-
var useBackingFieldModel = _useBackingFieldModelFactory.Create(fieldCandidates, requests);
44+
var useBackingFieldModel = _useBackingFieldModelFactory.Create(fieldCandidates, fieldEncapsulationModels);
4945

50-
var useBackingUDTMemberModel = _useBackingUDTMemberModelFactory.Create(fieldCandidates, requests);
46+
var useBackingUDTMemberModel = _useBackingUDTMemberModelFactory.Create(fieldCandidates, fieldEncapsulationModels);
5147

5248
var initialStrategy = useBackingUDTMemberModel.ObjectStateUDTField.IsExistingDeclaration
5349
? EncapsulateFieldStrategy.ConvertFieldsToUDTMembers

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldRefactoringAction.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@ public class EncapsulateFieldRefactoringAction : IRefactoringAction<EncapsulateF
88
{
99
private readonly EncapsulateFieldUseBackingFieldRefactoringAction _useBackingField;
1010
private readonly EncapsulateFieldUseBackingUDTMemberRefactoringAction _useBackingUDTMember;
11+
private readonly INewContentAggregatorFactory _newContentAggregatorFactory;
1112

1213
public EncapsulateFieldRefactoringAction(
1314
EncapsulateFieldUseBackingFieldRefactoringAction encapsulateFieldUseBackingField,
14-
EncapsulateFieldUseBackingUDTMemberRefactoringAction encapsulateFieldUseUDTMember)
15+
EncapsulateFieldUseBackingUDTMemberRefactoringAction encapsulateFieldUseUDTMember,
16+
INewContentAggregatorFactory newContentAggregatorFactory)
1517
{
1618
_useBackingField = encapsulateFieldUseBackingField;
1719
_useBackingUDTMember = encapsulateFieldUseUDTMember;
20+
_newContentAggregatorFactory = newContentAggregatorFactory;
1821
}
1922

2023
public void Refactor(EncapsulateFieldModel model)
@@ -26,10 +29,12 @@ public void Refactor(EncapsulateFieldModel model)
2629

2730
if (model.EncapsulateFieldStrategy == EncapsulateFieldStrategy.ConvertFieldsToUDTMembers)
2831
{
32+
model.EncapsulateFieldUseBackingUDTMemberModel.NewContentAggregator = _newContentAggregatorFactory.Create();
2933
_useBackingUDTMember.Refactor(model.EncapsulateFieldUseBackingUDTMemberModel);
3034
return;
3135
}
3236

37+
model.EncapsulateFieldUseBackingFieldModel.NewContentAggregator = _newContentAggregatorFactory.Create();
3338
_useBackingField.Refactor(model.EncapsulateFieldUseBackingFieldModel);
3439
}
3540
}

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldRefactoringActionsProvider.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Rubberduck.Refactorings.DeclareFieldsAsUDTMembers;
1+
using Rubberduck.Refactorings.CreateUDTMember;
22
using Rubberduck.Refactorings.ReplaceDeclarationIdentifier;
33
using Rubberduck.Refactorings.ReplaceReferences;
44
using Rubberduck.Refactorings.ReplacePrivateUDTMemberReferences;
@@ -11,7 +11,7 @@ public interface IEncapsulateFieldRefactoringActionsProvider
1111
ICodeOnlyRefactoringAction<ReplaceReferencesModel> ReplaceReferences { get; }
1212
ICodeOnlyRefactoringAction<ReplacePrivateUDTMemberReferencesModel> ReplaceUDTMemberReferences { get; }
1313
ICodeOnlyRefactoringAction<ReplaceDeclarationIdentifierModel> ReplaceDeclarationIdentifiers { get; }
14-
ICodeOnlyRefactoringAction<DeclareFieldsAsUDTMembersModel> DeclareFieldsAsUDTMembers { get; }
14+
ICodeOnlyRefactoringAction<CreateUDTMemberModel> CreateUDTMember { get; }
1515
ICodeOnlyRefactoringAction<EncapsulateFieldInsertNewCodeModel> EncapsulateFieldInsertNewCode { get; }
1616
}
1717

@@ -20,20 +20,20 @@ public class EncapsulateFieldRefactoringActionsProvider : IEncapsulateFieldRefac
2020
private readonly ReplaceReferencesRefactoringAction _replaceReferences;
2121
private readonly ReplaceDeclarationIdentifierRefactoringAction _replaceDeclarationIdentifiers;
2222
private readonly ReplacePrivateUDTMemberReferencesRefactoringAction _replaceUDTMemberReferencesRefactoringAction;
23-
private readonly DeclareFieldsAsUDTMembersRefactoringAction _declareFieldsAsUDTMembersRefactoringAction;
23+
private readonly CreateUDTMemberRefactoringAction _createUDTMemberRefactoringAction;
2424
private readonly EncapsulateFieldInsertNewCodeRefactoringAction _encapsulateFieldInsertNewCodeRefactoringAction;
2525

2626
public EncapsulateFieldRefactoringActionsProvider(
2727
ReplaceReferencesRefactoringAction replaceReferencesRefactoringAction,
2828
ReplacePrivateUDTMemberReferencesRefactoringAction replaceUDTMemberReferencesRefactoringAction,
2929
ReplaceDeclarationIdentifierRefactoringAction replaceDeclarationIdentifierRefactoringAction,
30-
DeclareFieldsAsUDTMembersRefactoringAction declareFieldsAsUDTMembersRefactoringAction,
30+
CreateUDTMemberRefactoringAction createUDTMemberRefactoringActionRefactoringAction,
3131
EncapsulateFieldInsertNewCodeRefactoringAction encapsulateFieldInsertNewCodeRefactoringAction)
3232
{
3333
_replaceReferences = replaceReferencesRefactoringAction;
3434
_replaceUDTMemberReferencesRefactoringAction = replaceUDTMemberReferencesRefactoringAction;
3535
_replaceDeclarationIdentifiers = replaceDeclarationIdentifierRefactoringAction;
36-
_declareFieldsAsUDTMembersRefactoringAction = declareFieldsAsUDTMembersRefactoringAction;
36+
_createUDTMemberRefactoringAction = createUDTMemberRefactoringActionRefactoringAction;
3737
_encapsulateFieldInsertNewCodeRefactoringAction = encapsulateFieldInsertNewCodeRefactoringAction;
3838
}
3939

@@ -46,8 +46,8 @@ public ICodeOnlyRefactoringAction<ReplaceDeclarationIdentifierModel> ReplaceDecl
4646
public ICodeOnlyRefactoringAction<ReplacePrivateUDTMemberReferencesModel> ReplaceUDTMemberReferences
4747
=> _replaceUDTMemberReferencesRefactoringAction;
4848

49-
public ICodeOnlyRefactoringAction<DeclareFieldsAsUDTMembersModel> DeclareFieldsAsUDTMembers
50-
=> _declareFieldsAsUDTMembersRefactoringAction;
49+
public ICodeOnlyRefactoringAction<CreateUDTMemberModel> CreateUDTMember
50+
=> _createUDTMemberRefactoringAction;
5151

5252
public ICodeOnlyRefactoringAction<EncapsulateFieldInsertNewCodeModel> EncapsulateFieldInsertNewCode
5353
=> _encapsulateFieldInsertNewCodeRefactoringAction;

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldRequest/EncapsulateFieldRequest.cs

Lines changed: 0 additions & 40 deletions
This file was deleted.

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldRequest/EncapsulateFieldRequestFactory.cs

Lines changed: 0 additions & 17 deletions
This file was deleted.

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldUseBackingField/EncapsulateFieldUseBackingFieldModelFactory.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ public interface IEncapsulateFieldUseBackingFieldModelFactory
1111
/// Creates an <c>EncapsulateFieldUseBackingFieldModel</c> used by the <c>EncapsulateFieldUseBackingFieldRefactoringAction</c>.
1212
/// </summary>
1313
/// <param name="clientTarget">Optional: <c>UserDefinedType</c> Field to include the Encapsulated Field(s)</param>
14-
EncapsulateFieldUseBackingFieldModel Create(IEnumerable<EncapsulateFieldRequest> requests);
14+
EncapsulateFieldUseBackingFieldModel Create(IEnumerable<FieldEncapsulationModel> requests);
1515

1616
/// <summary>
1717
/// Creates an <c>EncapsulateFieldUseBackingFieldModel</c> based upon collection of
1818
/// <c>IEncapsulateFieldCandidate</c> instances created by <c>EncapsulateFieldCandidateCollectionFactory</c>.
1919
/// This function is intended for exclusive use by <c>EncapsulateFieldModelFactory</c>
2020
/// </summary>
21-
EncapsulateFieldUseBackingFieldModel Create(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates, IEnumerable<EncapsulateFieldRequest> requests);
21+
EncapsulateFieldUseBackingFieldModel Create(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates, IEnumerable<FieldEncapsulationModel> requests);
2222
}
2323

2424
public class EncapsulateFieldUseBackingFieldModelFactory : IEncapsulateFieldUseBackingFieldModelFactory
@@ -34,7 +34,7 @@ public EncapsulateFieldUseBackingFieldModelFactory(
3434
_conflictFinderFactory = encapsulateFieldConflictFinderFactory;
3535
}
3636

37-
public EncapsulateFieldUseBackingFieldModel Create(IEnumerable<EncapsulateFieldRequest> requests)
37+
public EncapsulateFieldUseBackingFieldModel Create(IEnumerable<FieldEncapsulationModel> requests)
3838
{
3939
if (!requests.Any())
4040
{
@@ -45,14 +45,19 @@ public EncapsulateFieldUseBackingFieldModel Create(IEnumerable<EncapsulateFieldR
4545
return Create(fieldCandidates, requests);
4646
}
4747

48-
public EncapsulateFieldUseBackingFieldModel Create(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates, IEnumerable<EncapsulateFieldRequest> requests)
48+
public EncapsulateFieldUseBackingFieldModel Create(IReadOnlyCollection<IEncapsulateFieldCandidate> candidates, IEnumerable<FieldEncapsulationModel> requests)
4949
{
5050
var fieldCandidates = candidates.ToList();
5151

5252
foreach (var request in requests)
5353
{
5454
var candidate = fieldCandidates.Single(c => c.Declaration.Equals(request.Declaration));
55-
request.ApplyRequest(candidate);
55+
candidate.EncapsulateFlag = true;
56+
candidate.IsReadOnly = request.IsReadOnly;
57+
if (request.PropertyIdentifier != null)
58+
{
59+
candidate.PropertyIdentifier = request.PropertyIdentifier;
60+
}
5661
}
5762

5863
var conflictsFinder = _conflictFinderFactory.CreateEncapsulateFieldUseBackingFieldConflictFinder(fieldCandidates);

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldUseBackingField/EncapsulateFieldUseBackingFieldRefactoringAction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ private void ReplaceEncapsulatedFieldReferences(IEnumerable<IEncapsulateFieldCan
128128
? field.Declaration.IsArray ? field.BackingIdentifier : field.PropertyIdentifier
129129
: field.PropertyIdentifier;
130130

131-
model.AssignFieldReferenceReplacementExpression(idRef, replacementExpression);
131+
model.AssignReferenceReplacementExpression(idRef, replacementExpression);
132132
}
133133
}
134134

0 commit comments

Comments
 (0)