@@ -13,26 +13,32 @@ namespace Rubberduck.Refactorings.EncapsulateFieldInsertNewCode
13
13
{
14
14
public class EncapsulateFieldInsertNewCodeRefactoringAction : CodeOnlyRefactoringActionBase < EncapsulateFieldInsertNewCodeModel >
15
15
{
16
- private readonly static string _doubleSpace = $ "{ Environment . NewLine } { Environment . NewLine } ";
17
- private int ? _codeSectionStartIndex ;
18
16
private readonly IDeclarationFinderProvider _declarationFinderProvider ;
19
- private readonly IEncapsulateFieldCodeBuilderFactory _encapsulateFieldCodeBuilderFactory ;
17
+ private readonly IPropertyAttributeSetsGenerator _propertyAttributeSetsGenerator ;
18
+ private readonly IEncapsulateFieldCodeBuilder _encapsulateFieldCodeBuilder ;
19
+
20
20
public EncapsulateFieldInsertNewCodeRefactoringAction (
21
21
IDeclarationFinderProvider declarationFinderProvider ,
22
22
IRewritingManager rewritingManager ,
23
+ IPropertyAttributeSetsGenerator propertyAttributeSetsGenerator ,
23
24
IEncapsulateFieldCodeBuilderFactory encapsulateFieldCodeBuilderFactory )
24
25
: base ( rewritingManager )
25
26
{
26
27
_declarationFinderProvider = declarationFinderProvider ;
27
- _encapsulateFieldCodeBuilderFactory = encapsulateFieldCodeBuilderFactory ;
28
+ _propertyAttributeSetsGenerator = propertyAttributeSetsGenerator ;
29
+ _encapsulateFieldCodeBuilder = encapsulateFieldCodeBuilderFactory . Create ( ) ;
28
30
}
29
31
30
32
public override void Refactor ( EncapsulateFieldInsertNewCodeModel model , IRewriteSession rewriteSession )
31
33
{
32
- _codeSectionStartIndex = _declarationFinderProvider . DeclarationFinder
33
- . Members ( model . QualifiedModuleName ) . Where ( m => m . IsMember ( ) )
34
- . OrderBy ( c => c . Selection )
35
- . FirstOrDefault ( ) ? . Context . Start . TokenIndex ;
34
+ if ( model . CreateNewObjectStateUDT )
35
+ {
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 ) ;
41
+ }
36
42
37
43
LoadNewPropertyBlocks ( model , rewriteSession ) ;
38
44
@@ -41,14 +47,16 @@ public override void Refactor(EncapsulateFieldInsertNewCodeModel model, IRewrite
41
47
model . NewContentAggregator = null ;
42
48
}
43
49
44
- public void LoadNewPropertyBlocks ( EncapsulateFieldInsertNewCodeModel model , IRewriteSession rewriteSession )
50
+ private void LoadNewPropertyBlocks ( EncapsulateFieldInsertNewCodeModel model , IRewriteSession rewriteSession )
45
51
{
46
- var builder = _encapsulateFieldCodeBuilderFactory . Create ( ) ;
47
- foreach ( var propertyAttributes in model . SelectedFieldCandidates . SelectMany ( f => f . PropertyAttributeSets ) )
52
+ var propAttributeSets = model . SelectedFieldCandidates
53
+ . SelectMany ( f => _propertyAttributeSetsGenerator . GeneratePropertyAttributeSets ( f ) ) . ToList ( ) ;
54
+
55
+ foreach ( var propertyAttributeSet in propAttributeSets )
48
56
{
49
- Debug . Assert ( propertyAttributes . Declaration . DeclarationType . HasFlag ( DeclarationType . Variable ) || propertyAttributes . Declaration . DeclarationType . HasFlag ( DeclarationType . UserDefinedTypeMember ) ) ;
57
+ Debug . Assert ( propertyAttributeSet . Declaration . DeclarationType . HasFlag ( DeclarationType . Variable ) || propertyAttributeSet . Declaration . DeclarationType . HasFlag ( DeclarationType . UserDefinedTypeMember ) ) ;
50
58
51
- var ( Get , Let , Set ) = builder . BuildPropertyBlocks ( propertyAttributes ) ;
59
+ var ( Get , Let , Set ) = _encapsulateFieldCodeBuilder . BuildPropertyBlocks ( propertyAttributeSet ) ;
52
60
53
61
var blocks = new List < string > ( ) { Get , Let , Set } ;
54
62
blocks . ForEach ( s => model . NewContentAggregator . AddNewContent ( NewContentType . CodeSectionBlock , s ) ) ;
@@ -57,13 +65,16 @@ public void LoadNewPropertyBlocks(EncapsulateFieldInsertNewCodeModel model, IRew
57
65
58
66
private void InsertBlocks ( EncapsulateFieldInsertNewCodeModel model , IRewriteSession rewriteSession )
59
67
{
68
+
60
69
var newDeclarationSectionBlock = model . NewContentAggregator . RetrieveBlock ( NewContentType . UserDefinedTypeDeclaration , NewContentType . DeclarationBlock , NewContentType . CodeSectionBlock ) ;
61
70
if ( string . IsNullOrEmpty ( newDeclarationSectionBlock ) )
62
71
{
63
72
return ;
64
73
}
65
74
66
- var allNewContent = string . Join ( _doubleSpace , new string [ ] { newDeclarationSectionBlock } ) ;
75
+ var doubleSpace = $ "{ Environment . NewLine } { Environment . NewLine } ";
76
+
77
+ var allNewContent = string . Join ( doubleSpace , new string [ ] { newDeclarationSectionBlock } ) ;
67
78
68
79
var previewMarker = model . NewContentAggregator . RetrieveBlock ( RubberduckUI . EncapsulateField_PreviewMarker ) ;
69
80
if ( ! string . IsNullOrEmpty ( previewMarker ) )
@@ -73,22 +84,17 @@ private void InsertBlocks(EncapsulateFieldInsertNewCodeModel model, IRewriteSess
73
84
74
85
var rewriter = rewriteSession . CheckOutModuleRewriter ( model . QualifiedModuleName ) ;
75
86
76
- InsertBlock ( allNewContent , _codeSectionStartIndex , rewriter ) ;
77
- }
78
-
79
- private static void InsertBlock ( string content , int ? insertionIndex , IModuleRewriter rewriter )
80
- {
81
- if ( string . IsNullOrEmpty ( content ) )
82
- {
83
- return ;
84
- }
87
+ var codeSectionStartIndex = _declarationFinderProvider . DeclarationFinder
88
+ . Members ( model . QualifiedModuleName ) . Where ( m => m . IsMember ( ) )
89
+ . OrderBy ( c => c . Selection )
90
+ . FirstOrDefault ( ) ? . Context . Start . TokenIndex ;
85
91
86
- if ( insertionIndex . HasValue )
92
+ if ( codeSectionStartIndex . HasValue )
87
93
{
88
- rewriter . InsertBefore ( insertionIndex . Value , $ "{ content } { _doubleSpace } ") ;
94
+ rewriter . InsertBefore ( codeSectionStartIndex . Value , $ "{ allNewContent } { doubleSpace } ") ;
89
95
return ;
90
96
}
91
- rewriter . InsertBefore ( rewriter . TokenStream . Size - 1 , $ "{ _doubleSpace } { content } ") ;
97
+ rewriter . InsertBefore ( rewriter . TokenStream . Size - 1 , $ "{ doubleSpace } { allNewContent } ") ;
92
98
}
93
99
}
94
100
}
0 commit comments