@@ -23,24 +23,27 @@ public abstract class CodeExplorerMoveToFolderCommandBase : CodeExplorerCommandB
23
23
} ;
24
24
25
25
private readonly IParserStatusProvider _parserStatusProvider ;
26
+ private readonly RubberduckParserState _state ;
26
27
27
28
private readonly IRefactoringAction < MoveMultipleFoldersModel > _moveFolders ;
28
29
private readonly IRefactoringAction < MoveMultipleToFolderModel > _moveToFolder ;
29
30
30
31
private readonly IRefactoringFailureNotifier _failureNotifier ;
31
32
32
- public CodeExplorerMoveToFolderCommandBase (
33
+ protected CodeExplorerMoveToFolderCommandBase (
33
34
MoveMultipleFoldersRefactoringAction moveFolders ,
34
35
MoveMultipleToFolderRefactoringAction moveToFolder ,
35
36
MoveToFolderRefactoringFailedNotifier failureNotifier ,
36
37
IParserStatusProvider parserStatusProvider ,
37
- IVbeEvents vbeEvents )
38
+ IVbeEvents vbeEvents ,
39
+ RubberduckParserState state )
38
40
: base ( vbeEvents )
39
41
{
40
42
_moveFolders = moveFolders ;
41
43
_moveToFolder = moveToFolder ;
42
44
43
45
_parserStatusProvider = parserStatusProvider ;
46
+ _state = state ;
44
47
_failureNotifier = failureNotifier ;
45
48
46
49
AddToCanExecuteEvaluation ( SpecialEvaluateCanExecute ) ;
@@ -67,15 +70,13 @@ protected override void OnExecute(object parameter)
67
70
if ( node is CodeExplorerComponentViewModel componentViewModel )
68
71
{
69
72
var model = ComponentModel ( componentViewModel ) ;
70
- var modifiedModel = ModifiedComponentModel ( model , parameter ) ;
71
- ExecuteRefactoringAction ( modifiedModel , _moveToFolder , _failureNotifier ) ;
73
+ ExecuteRefactoringAction ( model , parameter , ValidateInitialComponentModel , ModifiedComponentModel , _moveToFolder , _failureNotifier ) ;
72
74
}
73
75
74
76
if ( node is CodeExplorerCustomFolderViewModel folderViewModel )
75
77
{
76
78
var model = FolderModel ( folderViewModel ) ;
77
- var modifiedModel = ModifiedFolderModel ( model , parameter ) ;
78
- ExecuteRefactoringAction ( modifiedModel , _moveFolders , _failureNotifier ) ;
79
+ ExecuteRefactoringAction ( model , parameter , ValidateInitialFolderModel , ModifiedFolderModel , _moveFolders , _failureNotifier ) ;
79
80
}
80
81
}
81
82
@@ -103,6 +104,17 @@ private static ICollection<ModuleDeclaration> ContainedModules(ICodeExplorerNode
103
104
. ToList ( ) ;
104
105
}
105
106
107
+ private void ValidateInitialFolderModel ( MoveMultipleFoldersModel model )
108
+ {
109
+ var firstStaleAffectedModules = model . ModulesBySourceFolder . Values
110
+ . SelectMany ( modules => modules )
111
+ . FirstOrDefault ( module => _state . IsNewOrModified ( module . QualifiedModuleName ) ) ;
112
+ if ( firstStaleAffectedModules != null )
113
+ {
114
+ throw new AffectedModuleIsStaleException ( firstStaleAffectedModules . QualifiedModuleName ) ;
115
+ }
116
+ }
117
+
106
118
private MoveMultipleToFolderModel ComponentModel ( CodeExplorerComponentViewModel componentViewModel )
107
119
{
108
120
if ( ! ( componentViewModel . Declaration is ModuleDeclaration moduleDeclaration ) )
@@ -113,14 +125,32 @@ private MoveMultipleToFolderModel ComponentModel(CodeExplorerComponentViewModel
113
125
var targets = new List < ModuleDeclaration > { moduleDeclaration } ;
114
126
var targetFolder = moduleDeclaration . CustomFolder ;
115
127
return new MoveMultipleToFolderModel ( targets , targetFolder ) ;
116
- }
128
+ }
129
+
130
+ private void ValidateInitialComponentModel ( MoveMultipleToFolderModel model )
131
+ {
132
+ var firstStaleAffectedModules = model . Targets
133
+ . FirstOrDefault ( module => _state . IsNewOrModified ( module . QualifiedModuleName ) ) ;
134
+ if ( firstStaleAffectedModules != null )
135
+ {
136
+ throw new AffectedModuleIsStaleException ( firstStaleAffectedModules . QualifiedModuleName ) ;
137
+ }
138
+ }
117
139
118
- private static void ExecuteRefactoringAction < TModel > ( TModel model , IRefactoringAction < TModel > refactoringAction , IRefactoringFailureNotifier failureNotifier )
140
+ private static void ExecuteRefactoringAction < TModel > (
141
+ TModel model ,
142
+ object parameter ,
143
+ Action < TModel > initialModelValidation ,
144
+ Func < TModel , object , TModel > modelModification ,
145
+ IRefactoringAction < TModel > refactoringAction ,
146
+ IRefactoringFailureNotifier failureNotifier )
119
147
where TModel : class , IRefactoringModel
120
148
{
121
149
try
122
150
{
123
- refactoringAction . Refactor ( model ) ;
151
+ initialModelValidation ( model ) ;
152
+ var modifiedModel = modelModification ( model , parameter ) ;
153
+ refactoringAction . Refactor ( modifiedModel ) ;
124
154
}
125
155
catch ( RefactoringAbortedException )
126
156
{ }
0 commit comments