Skip to content

Commit 96087d7

Browse files
committed
Add EncapsulateFieldUseBackingFieldModelFactory
Some changes in folder organization as well
1 parent 93977fa commit 96087d7

File tree

4 files changed

+170
-14
lines changed

4 files changed

+170
-14
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Rubberduck.Parsing.VBA;
4+
using Rubberduck.VBEditor;
5+
using Rubberduck.Refactorings.CodeBlockInsert;
6+
using Rubberduck.Refactorings.EncapsulateField;
7+
8+
namespace Rubberduck.Refactorings.EncapsulateFieldUseBackingField
9+
{
10+
public class EncapsulateFieldUseBackingFieldModel : IRefactoringModel
11+
{
12+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
13+
14+
public EncapsulateFieldUseBackingFieldModel(IEnumerable<IEncapsulateFieldCandidate> candidates,
15+
IDeclarationFinderProvider declarationFinderProvider)
16+
{
17+
_declarationFinderProvider = declarationFinderProvider;
18+
19+
EncapsulationCandidates = candidates.ToList();
20+
21+
ResetNewContent();
22+
}
23+
24+
public void ResetNewContent()
25+
{
26+
NewContent = new Dictionary<NewContentType, List<string>>
27+
{
28+
{ NewContentType.PostContentMessage, new List<string>() },
29+
{ NewContentType.DeclarationBlock, new List<string>() },
30+
{ NewContentType.CodeSectionBlock, new List<string>() },
31+
{ NewContentType.TypeDeclarationBlock, new List<string>() }
32+
};
33+
}
34+
35+
public IEncapsulateFieldConflictFinder ConflictFinder { set; get; }
36+
37+
public bool IncludeNewContentMarker { set; get; } = false;
38+
39+
public List<IEncapsulateFieldCandidate> EncapsulationCandidates { get; }
40+
41+
public IEnumerable<IEncapsulateFieldCandidate> SelectedFieldCandidates
42+
=> EncapsulationCandidates.Where(v => v.EncapsulateFlag);
43+
44+
public void AddContentBlock(NewContentType contentType, string block)
45+
=> NewContent[contentType].Add(block);
46+
47+
public Dictionary<NewContentType, List<string>> NewContent { set; get; }
48+
49+
public QualifiedModuleName QualifiedModuleName => EncapsulationCandidates.First().QualifiedModuleName;
50+
}
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using Rubberduck.Parsing.Symbols;
2+
using Rubberduck.Parsing.VBA;
3+
using Rubberduck.Refactorings.Common;
4+
using Rubberduck.Refactorings.EncapsulateField;
5+
using Rubberduck.Refactorings.EncapsulateFieldUseBackingField;
6+
using Rubberduck.VBEditor;
7+
using System.Collections.Generic;
8+
using System.Linq;
9+
10+
namespace Rubberduck.Refactorings
11+
{
12+
public interface IEncapsulateFieldUseBackingFieldModelFactory : IEncapsulateFieldModelsFactory<EncapsulateFieldUseBackingFieldModel>
13+
{ }
14+
15+
public class EncapsulateFieldUseBackingFieldModelFactory : IEncapsulateFieldUseBackingFieldModelFactory
16+
{
17+
private readonly IDeclarationFinderProvider _declarationFinderProvider;
18+
private readonly IEncapsulateFieldCandidateFactory _fieldCandidateFactory;
19+
20+
public EncapsulateFieldUseBackingFieldModelFactory(IDeclarationFinderProvider declarationFinderProvider,
21+
IEncapsulateFieldCandidateFactory fieldCandidateFactory)
22+
{
23+
_declarationFinderProvider = declarationFinderProvider;
24+
_fieldCandidateFactory = fieldCandidateFactory;
25+
}
26+
27+
public EncapsulateFieldUseBackingFieldModel Create(QualifiedModuleName qmn)
28+
{
29+
var fields = _declarationFinderProvider.DeclarationFinder.UserDeclarations(DeclarationType.Variable)
30+
.Where(v => v.ParentDeclaration is ModuleDeclaration
31+
&& !v.IsWithEvents);
32+
33+
var candidates = fields.Select(f => _fieldCandidateFactory.Create(f));
34+
35+
var objectStateUDTCandidates = candidates.Where(c => c is IUserDefinedTypeCandidate udt && udt.CanBeObjectStateUDT)
36+
.Select(udtc => new ObjectStateUDT(udtc as IUserDefinedTypeCandidate));
37+
38+
return Create(candidates, objectStateUDTCandidates);
39+
}
40+
41+
public EncapsulateFieldUseBackingFieldModel Create(IEnumerable<IEncapsulateFieldCandidate> candidates, IEnumerable<IObjectStateUDT> objectStateUDTCandidates)
42+
{
43+
var fieldCandidates = new List<IEncapsulateFieldCandidate>(candidates);
44+
var objectStateFieldCandidates = new List<IObjectStateUDT>(objectStateUDTCandidates);
45+
var udtMemberCandidates = new List<IUserDefinedTypeMemberCandidate>();
46+
47+
fieldCandidates.ForEach(c => LoadUDTMembers(udtMemberCandidates, c));
48+
49+
var conflictsFinder = new UseBackingFieldsStrategyConflictFinder(_declarationFinderProvider, candidates, udtMemberCandidates);
50+
fieldCandidates.ForEach(c => c.ConflictFinder = conflictsFinder);
51+
52+
return new EncapsulateFieldUseBackingFieldModel(candidates, _declarationFinderProvider)
53+
{
54+
ConflictFinder = conflictsFinder
55+
};
56+
}
57+
58+
private void LoadUDTMembers(List<IUserDefinedTypeMemberCandidate> udtMembers, IEncapsulateFieldCandidate candidate)
59+
{
60+
if (candidate is IUserDefinedTypeCandidate udtCandidate)
61+
{
62+
foreach (var member in udtCandidate.Members)
63+
{
64+
udtMembers.Add(member);
65+
if (member.WrappedCandidate is IUserDefinedTypeCandidate childUDT
66+
&& childUDT.Declaration.AsTypeDeclaration.HasPrivateAccessibility())
67+
{
68+
LoadUDTMembers(udtMembers, childUDT);
69+
}
70+
}
71+
}
72+
}
73+
}
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using Rubberduck.Parsing.Rewriter;
2+
using Rubberduck.VBEditor;
3+
using System;
4+
5+
namespace Rubberduck.Refactorings.EncapsulateFieldUseBackingField
6+
{
7+
public class EncapsulateFieldUseBackingFieldPreviewProvider : RefactoringPreviewProviderWrapperBase<EncapsulateFieldUseBackingFieldModel>
8+
{
9+
public EncapsulateFieldUseBackingFieldPreviewProvider(EncapsulateFieldUseBackingFieldRefactoringAction refactoringAction,
10+
IRewritingManager rewritingManager)
11+
: base(refactoringAction, rewritingManager)
12+
{ }
13+
14+
public override string Preview(EncapsulateFieldUseBackingFieldModel model)
15+
{
16+
var preview = string.Empty;
17+
var initialFlagValue = model.IncludeNewContentMarker;
18+
model.IncludeNewContentMarker = true;
19+
try
20+
{
21+
model.ResetNewContent();
22+
preview = base.Preview(model);
23+
}
24+
catch (Exception) { }
25+
finally
26+
{
27+
model.IncludeNewContentMarker = initialFlagValue;
28+
}
29+
return preview;
30+
}
31+
32+
protected override QualifiedModuleName ComponentToShow(EncapsulateFieldUseBackingFieldModel model)
33+
{
34+
return model.QualifiedModuleName;
35+
}
36+
}
37+
}

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldUseBackingFieldRefactoringAction.cs renamed to Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldUseBackingField/EncapsulateFieldUseBackingFieldRefactoringAction.cs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
using System;
1313
using System.Collections.Generic;
1414
using System.Linq;
15+
using Rubberduck.Refactorings.EncapsulateField;
16+
using Rubberduck.Refactorings.EncapsulateFieldInsertNewCode;
1517

16-
namespace Rubberduck.Refactorings.EncapsulateField
18+
namespace Rubberduck.Refactorings.EncapsulateFieldUseBackingField
1719
{
18-
public class EncapsulateFieldUseBackingFieldRefactoringAction : CodeOnlyRefactoringActionBase<EncapsulateFieldModel>
20+
public class EncapsulateFieldUseBackingFieldRefactoringAction : CodeOnlyRefactoringActionBase<EncapsulateFieldUseBackingFieldModel>
1921
{
2022
private readonly IDeclarationFinderProvider _declarationFinderProvider;
2123
private readonly ICodeOnlyRefactoringAction<ReplacePrivateUDTMemberReferencesModel> _replaceUDTMemberReferencesRefactoringAction;
@@ -39,29 +41,21 @@ public EncapsulateFieldUseBackingFieldRefactoringAction(
3941
_replaceUDTMemberReferencesModelFactory = replaceUDTMemberReferencesModelFactory;
4042
}
4143

42-
public override void Refactor(EncapsulateFieldModel model, IRewriteSession rewriteSession)
44+
public override void Refactor(EncapsulateFieldUseBackingFieldModel model, IRewriteSession rewriteSession)
4345
{
4446
if (!model.SelectedFieldCandidates.Any())
4547
{
4648
return;
4749
}
4850

49-
model.NewContent = new Dictionary<NewContentType, List<string>>
50-
{
51-
{ NewContentType.PostContentMessage, new List<string>() },
52-
{ NewContentType.DeclarationBlock, new List<string>() },
53-
{ NewContentType.CodeSectionBlock, new List<string>() },
54-
{ NewContentType.TypeDeclarationBlock, new List<string>() }
55-
};
56-
5751
ModifyFields(model, rewriteSession);
5852

5953
ModifyReferences(model, rewriteSession);
6054

6155
InsertNewContent(model, rewriteSession);
6256
}
6357

64-
private void ModifyFields(EncapsulateFieldModel model, IRewriteSession rewriteSession)
58+
private void ModifyFields(EncapsulateFieldUseBackingFieldModel model, IRewriteSession rewriteSession)
6559
{
6660
var fieldDeclarationsToDeleteAndReplace = model.SelectedFieldCandidates
6761
.Where(f => f.Declaration.IsDeclaredInList()
@@ -94,7 +88,7 @@ private void ModifyFields(EncapsulateFieldModel model, IRewriteSession rewriteSe
9488
}
9589
}
9690

97-
private void ModifyReferences(EncapsulateFieldModel model, IRewriteSession rewriteSession)
91+
private void ModifyReferences(EncapsulateFieldUseBackingFieldModel model, IRewriteSession rewriteSession)
9892
{
9993
var privateUdtInstances = model.SelectedFieldCandidates
10094
.Where(f => (f.Declaration.AsTypeDeclaration?.DeclarationType.HasFlag(DeclarationType.UserDefinedType) ?? false)
@@ -105,7 +99,7 @@ private void ModifyReferences(EncapsulateFieldModel model, IRewriteSession rewri
10599
ReplaceEncapsulatedFieldReferences(model.SelectedFieldCandidates.Except(privateUdtInstances), rewriteSession);
106100
}
107101

108-
private void InsertNewContent(EncapsulateFieldModel model, IRewriteSession rewriteSession)
102+
private void InsertNewContent(EncapsulateFieldUseBackingFieldModel model, IRewriteSession rewriteSession)
109103
{
110104
var encapsulateFieldInsertNewCodeModel = new EncapsulateFieldInsertNewCodeModel(model.SelectedFieldCandidates)
111105
{

0 commit comments

Comments
 (0)