Skip to content

Commit 05e5304

Browse files
committed
Remove aggregator dependency from top-level action
1 parent 604e692 commit 05e5304

File tree

7 files changed

+153
-104
lines changed

7 files changed

+153
-104
lines changed

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldInsertNewCode/EncapsulateFieldCodeBuilder.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public interface IEncapsulateFieldCodeBuilder
1111
(string Get, string Let, string Set) BuildPropertyBlocks(PropertyAttributeSet propertyAttributeSet);
1212
string BuildUserDefinedTypeDeclaration(IObjectStateUDT objectStateUDT, IEnumerable<IEncapsulateFieldCandidate> candidates);
1313
string BuildObjectStateFieldDeclaration(IObjectStateUDT objectStateUDT);
14+
string BuildFieldDeclaration(Declaration target, string identifier);
1415
}
1516

1617
public class EncapsulateFieldCodeBuilder : IEncapsulateFieldCodeBuilder
@@ -89,5 +90,13 @@ public string BuildObjectStateFieldDeclaration(IObjectStateUDT objectStateUDT)
8990
{
9091
return $"{Accessibility.Private} {objectStateUDT.IdentifierName} {Tokens.As} {objectStateUDT.AsTypeName}";
9192
}
93+
94+
public string BuildFieldDeclaration(Declaration target, string identifier)
95+
{
96+
var identifierExpressionSansVisibility = target.Context.GetText().Replace(target.IdentifierName, identifier);
97+
return target.IsTypeSpecified
98+
? $"{Tokens.Private} {identifierExpressionSansVisibility}"
99+
: $"{Tokens.Private} {identifierExpressionSansVisibility} {Tokens.As} {target.AsTypeName}";
100+
}
92101
}
93102
}

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldInsertNewCode/EncapsulateFieldInsertNewCodeModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,7 @@ public EncapsulateFieldInsertNewCodeModel(IEnumerable<IEncapsulateFieldCandidate
2525
public IObjectStateUDT ObjectStateUDTField { set; get; }
2626

2727
public IReadOnlyCollection<IEncapsulateFieldCandidate> SelectedFieldCandidates { get; }
28+
29+
public IEnumerable<IEncapsulateFieldCandidate> CandidatesRequiringNewBackingFields { set; get; } = Enumerable.Empty<IEncapsulateFieldCandidate>();
2830
}
2931
}

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldInsertNewCode/EncapsulateFieldInsertNewCodeRefactoringAction.cs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,35 @@ public override void Refactor(EncapsulateFieldInsertNewCodeModel model, IRewrite
3333
{
3434
if (model.CreateNewObjectStateUDT)
3535
{
36-
var objectStateFieldDeclaration = _encapsulateFieldCodeBuilder.BuildObjectStateFieldDeclaration(model.ObjectStateUDTField);
37-
model.NewContentAggregator.AddNewContent(NewContentType.DeclarationBlock, objectStateFieldDeclaration);
38-
39-
var objectStateTypeDeclarationBlock = _encapsulateFieldCodeBuilder.BuildUserDefinedTypeDeclaration(model.ObjectStateUDTField, model.SelectedFieldCandidates);
40-
model.NewContentAggregator.AddNewContent(NewContentType.UserDefinedTypeDeclaration, objectStateTypeDeclarationBlock);
36+
CreateObjectStateUDTElements(model, rewriteSession);
4137
}
4238

43-
LoadNewPropertyBlocks(model, rewriteSession);
39+
CreateBackingFields(model, rewriteSession);
40+
41+
CreatePropertyBlocks(model, rewriteSession);
4442

4543
InsertBlocks(model, rewriteSession);
44+
}
45+
46+
private void CreateObjectStateUDTElements(EncapsulateFieldInsertNewCodeModel model, IRewriteSession rewriteSession)
47+
{
48+
var objectStateFieldDeclaration = _encapsulateFieldCodeBuilder.BuildObjectStateFieldDeclaration(model.ObjectStateUDTField);
49+
model.NewContentAggregator.AddNewContent(NewContentType.DeclarationBlock, objectStateFieldDeclaration);
4650

47-
model.NewContentAggregator = null;
51+
var objectStateTypeDeclarationBlock = _encapsulateFieldCodeBuilder.BuildUserDefinedTypeDeclaration(model.ObjectStateUDTField, model.SelectedFieldCandidates);
52+
model.NewContentAggregator.AddNewContent(NewContentType.UserDefinedTypeDeclaration, objectStateTypeDeclarationBlock);
53+
}
54+
55+
private void CreateBackingFields(EncapsulateFieldInsertNewCodeModel model, IRewriteSession rewriteSession)
56+
{
57+
foreach (var field in model.CandidatesRequiringNewBackingFields)
58+
{
59+
var newFieldDeclaration = _encapsulateFieldCodeBuilder.BuildFieldDeclaration(field.Declaration, field.BackingIdentifier);
60+
model.NewContentAggregator.AddNewContent(NewContentType.DeclarationBlock, newFieldDeclaration);
61+
}
4862
}
4963

50-
private void LoadNewPropertyBlocks(EncapsulateFieldInsertNewCodeModel model, IRewriteSession rewriteSession)
64+
private void CreatePropertyBlocks(EncapsulateFieldInsertNewCodeModel model, IRewriteSession rewriteSession)
5165
{
5266
var propAttributeSets = model.SelectedFieldCandidates
5367
.SelectMany(f => _propertyAttributeSetsGenerator.GeneratePropertyAttributeSets(f)).ToList();

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldRefactoringAction.cs

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

1312
public EncapsulateFieldRefactoringAction(
1413
EncapsulateFieldUseBackingFieldRefactoringAction encapsulateFieldUseBackingField,
15-
EncapsulateFieldUseBackingUDTMemberRefactoringAction encapsulateFieldUseUDTMember,
16-
INewContentAggregatorFactory newContentAggregatorFactory)
14+
EncapsulateFieldUseBackingUDTMemberRefactoringAction encapsulateFieldUseUDTMember)
1715
{
1816
_useBackingField = encapsulateFieldUseBackingField;
1917
_useBackingUDTMember = encapsulateFieldUseUDTMember;
20-
_newContentAggregatorFactory = newContentAggregatorFactory;
2118
}
2219

2320
public void Refactor(EncapsulateFieldModel model)
@@ -29,12 +26,10 @@ public void Refactor(EncapsulateFieldModel model)
2926

3027
if (model.EncapsulateFieldStrategy == EncapsulateFieldStrategy.ConvertFieldsToUDTMembers)
3128
{
32-
model.EncapsulateFieldUseBackingUDTMemberModel.NewContentAggregator = _newContentAggregatorFactory.Create();
3329
_useBackingUDTMember.Refactor(model.EncapsulateFieldUseBackingUDTMemberModel);
3430
return;
3531
}
3632

37-
model.EncapsulateFieldUseBackingFieldModel.NewContentAggregator = _newContentAggregatorFactory.Create();
3833
_useBackingField.Refactor(model.EncapsulateFieldUseBackingFieldModel);
3934
}
4035
}

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldUseBackingField/EncapsulateFieldUseBackingFieldRefactoringAction.cs

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using Rubberduck.Common;
2-
using Rubberduck.Parsing;
1+
using Rubberduck.Parsing;
32
using Rubberduck.Parsing.Grammar;
43
using Rubberduck.Parsing.Rewriter;
54
using Rubberduck.Parsing.Symbols;
@@ -46,41 +45,27 @@ public override void Refactor(EncapsulateFieldUseBackingFieldModel model, IRewri
4645
return;
4746
}
4847

49-
if (model.NewContentAggregator is null)
50-
{
51-
model.NewContentAggregator = _newContentAggregatorFactory.Create();
52-
}
48+
var publicFieldsDeclaredInListsToReDeclareAsPrivateBackingFields
49+
= model.SelectedFieldCandidates
50+
.Where(f => f.Declaration.IsDeclaredInList()
51+
&& !f.Declaration.HasPrivateAccessibility())
52+
.ToList();
5353

54-
ModifyFields(model, rewriteSession);
54+
ModifyFields(model, publicFieldsDeclaredInListsToReDeclareAsPrivateBackingFields, rewriteSession);
5555

5656
ModifyReferences(model, rewriteSession);
5757

58-
InsertNewContent(model, rewriteSession);
58+
InsertNewContent(model, publicFieldsDeclaredInListsToReDeclareAsPrivateBackingFields, rewriteSession);
5959
}
6060

61-
private void ModifyFields(EncapsulateFieldUseBackingFieldModel model, IRewriteSession rewriteSession)
61+
private void ModifyFields(EncapsulateFieldUseBackingFieldModel model, List<IEncapsulateFieldCandidate> publicFieldsToRemove, IRewriteSession rewriteSession)
6262
{
63-
var fieldDeclarationsToDeleteAndReplace = model.SelectedFieldCandidates
64-
.Where(f => f.Declaration.IsDeclaredInList()
65-
&& !f.Declaration.HasPrivateAccessibility())
66-
.ToList();
67-
6863
var rewriter = rewriteSession.CheckOutModuleRewriter(model.QualifiedModuleName);
69-
rewriter.RemoveVariables(fieldDeclarationsToDeleteAndReplace.Select(f => f.Declaration)
64+
rewriter.RemoveVariables(publicFieldsToRemove.Select(f => f.Declaration)
7065
.Cast<VariableDeclaration>());
7166

72-
foreach (var field in fieldDeclarationsToDeleteAndReplace)
73-
{
74-
var targetIdentifier = field.Declaration.Context.GetText().Replace(field.IdentifierName, field.BackingIdentifier);
75-
var newField = field.Declaration.IsTypeSpecified
76-
? $"{Tokens.Private} {targetIdentifier}"
77-
: $"{Tokens.Private} {targetIdentifier} {Tokens.As} {field.Declaration.AsTypeName}";
78-
79-
model.NewContentAggregator.AddNewContent(NewContentType.DeclarationBlock, newField);
80-
}
81-
8267
var retainedFieldDeclarations = model.SelectedFieldCandidates
83-
.Except(fieldDeclarationsToDeleteAndReplace)
68+
.Except(publicFieldsToRemove)
8469
.ToList();
8570

8671
if (retainedFieldDeclarations.Any())
@@ -99,16 +84,20 @@ private void ModifyReferences(EncapsulateFieldUseBackingFieldModel model, IRewri
9984
.Where(f => (f.Declaration.AsTypeDeclaration?.DeclarationType.HasFlag(DeclarationType.UserDefinedType) ?? false)
10085
&& f.Declaration.AsTypeDeclaration.Accessibility == Accessibility.Private);
10186

102-
ReplaceEncapsulatedPrivateUserDefinedTypeMemberReferences(privateUdtInstances, rewriteSession);
87+
ReplaceUDTMemberReferencesOfPrivateUDTFields(privateUdtInstances, rewriteSession);
10388

10489
ReplaceEncapsulatedFieldReferences(model.SelectedFieldCandidates.Except(privateUdtInstances), rewriteSession);
10590
}
10691

107-
private void InsertNewContent(EncapsulateFieldUseBackingFieldModel model, IRewriteSession rewriteSession)
92+
private void InsertNewContent(EncapsulateFieldUseBackingFieldModel model, List<IEncapsulateFieldCandidate> candidatesRequiringNewBackingFields, IRewriteSession rewriteSession)
10893
{
94+
var aggregator = model.NewContentAggregator ?? _newContentAggregatorFactory.Create();
95+
model.NewContentAggregator = null;
96+
10997
var encapsulateFieldInsertNewCodeModel = new EncapsulateFieldInsertNewCodeModel(model.SelectedFieldCandidates)
11098
{
111-
NewContentAggregator = model.NewContentAggregator
99+
CandidatesRequiringNewBackingFields = candidatesRequiringNewBackingFields,
100+
NewContentAggregator = aggregator
112101
};
113102

114103
_encapsulateFieldInsertNewCodeRefactoringAction.Refactor(encapsulateFieldInsertNewCodeModel, rewriteSession);
@@ -120,42 +109,57 @@ private void ReplaceEncapsulatedFieldReferences(IEnumerable<IEncapsulateFieldCan
120109
{
121110
ModuleQualifyExternalReferences = true
122111
};
112+
123113
foreach (var field in fieldCandidates)
124114
{
125-
foreach (var idRef in field.Declaration.References)
126-
{
127-
var replacementExpression = idRef.QualifiedModuleName == field.QualifiedModuleName
128-
? field.Declaration.IsArray ? field.BackingIdentifier : field.PropertyIdentifier
129-
: field.PropertyIdentifier;
130-
131-
model.AssignReferenceReplacementExpression(idRef, replacementExpression);
132-
}
115+
InitializeModel(model, field);
133116
}
134117

135118
_replaceReferencesRefactoringAction.Refactor(model, rewriteSession);
136119
}
137120

138-
private void ReplaceEncapsulatedPrivateUserDefinedTypeMemberReferences(IEnumerable<IEncapsulateFieldCandidate> udtFieldCandidates, IRewriteSession rewriteSession)
121+
private void ReplaceUDTMemberReferencesOfPrivateUDTFields(IEnumerable<IEncapsulateFieldCandidate> udtFieldCandidates, IRewriteSession rewriteSession)
139122
{
140123
if (!udtFieldCandidates.Any())
141124
{
142125
return;
143126
}
144127

145-
var replacePrivateUDTMemberReferencesModel = _replaceUDTMemberReferencesModelFactory.Create(udtFieldCandidates.Select(f => f.Declaration).Cast<VariableDeclaration>());
128+
var replacePrivateUDTMemberReferencesModel
129+
= _replaceUDTMemberReferencesModelFactory.Create(udtFieldCandidates.Select(f => f.Declaration).Cast<VariableDeclaration>());
146130

147131
foreach (var udtfield in udtFieldCandidates)
148132
{
149-
foreach (var udtMember in replacePrivateUDTMemberReferencesModel.UDTMembers)
150-
{
151-
var udtExpressions = new PrivateUDTMemberReferenceReplacementExpressions($"{udtfield.IdentifierName}.{udtMember.IdentifierName}")
152-
{
153-
LocalReferenceExpression = udtMember.IdentifierName.CapitalizeFirstLetter(),
154-
};
133+
InitializeModel(replacePrivateUDTMemberReferencesModel, udtfield);
134+
}
135+
_replaceUDTMemberReferencesRefactoringAction.Refactor(replacePrivateUDTMemberReferencesModel, rewriteSession);
136+
}
155137

156-
replacePrivateUDTMemberReferencesModel.AssignUDTMemberReferenceExpressions(udtfield.Declaration as VariableDeclaration, udtMember, udtExpressions);
138+
private void InitializeModel(ReplaceReferencesModel model, IEncapsulateFieldCandidate field)
139+
{
140+
foreach (var idRef in field.Declaration.References)
141+
{
142+
var replacementExpression = field.PropertyIdentifier;
143+
144+
if (idRef.QualifiedModuleName == field.QualifiedModuleName && field.Declaration.IsArray)
145+
{
146+
replacementExpression = field.BackingIdentifier;
157147
}
158-
_replaceUDTMemberReferencesRefactoringAction.Refactor(replacePrivateUDTMemberReferencesModel, rewriteSession);
148+
149+
model.AssignReferenceReplacementExpression(idRef, replacementExpression);
150+
}
151+
}
152+
153+
private void InitializeModel(ReplacePrivateUDTMemberReferencesModel model, IEncapsulateFieldCandidate udtfield)
154+
{
155+
foreach (var udtMember in model.UDTMembers)
156+
{
157+
var udtExpressions = new PrivateUDTMemberReferenceReplacementExpressions($"{udtfield.IdentifierName}.{udtMember.IdentifierName}")
158+
{
159+
LocalReferenceExpression = udtMember.IdentifierName,
160+
};
161+
162+
model.AssignUDTMemberReferenceExpressions(udtfield.Declaration as VariableDeclaration, udtMember, udtExpressions);
159163
}
160164
}
161165

0 commit comments

Comments
 (0)