@@ -17,19 +17,22 @@ public class MemberAttributeRecoverer : IMemberAttributeRecovererWithSettableRew
17
17
private readonly IParseManager _parseManager ;
18
18
private readonly IAttributesUpdater _attributesUpdater ;
19
19
private IRewritingManager _rewritingManager ;
20
+ private readonly IMemberAttributeRecoveryFailureNotifier _failureNotifier ;
20
21
21
22
private readonly
22
23
IDictionary < QualifiedModuleName , IDictionary < string , HashSet < AttributeNode > > > _attributesToRecover
23
24
= new Dictionary < QualifiedModuleName , IDictionary < string , HashSet < AttributeNode > > > ( ) ;
25
+ private readonly HashSet < QualifiedMemberName > _missingMembers = new HashSet < QualifiedMemberName > ( ) ;
24
26
25
27
private readonly Logger _logger = LogManager . GetCurrentClassLogger ( ) ;
26
28
27
29
public MemberAttributeRecoverer ( IDeclarationFinderProvider declarationFinderProvider ,
28
- IParseManager parseManager , IAttributesUpdater attributesUpdater )
30
+ IParseManager parseManager , IAttributesUpdater attributesUpdater , IMemberAttributeRecoveryFailureNotifier failureNotifier )
29
31
{
30
32
_declarationFinderProvider = declarationFinderProvider ;
31
33
_parseManager = parseManager ;
32
34
_attributesUpdater = attributesUpdater ;
35
+ _failureNotifier = failureNotifier ;
33
36
}
34
37
35
38
//This needs to be property injected because this class will be constructor injected into the RewritingManager that needs to set itself as the dependency here.
@@ -101,6 +104,8 @@ private void ExecuteRecoveryOfAttributes(object sender, ParserStateEventArgs e)
101
104
StopRecoveringAttributesOnNextParse ( ) ;
102
105
103
106
var rewriteSession = _rewritingManager . CheckOutAttributesSession ( ) ;
107
+
108
+ _missingMembers . Clear ( ) ;
104
109
foreach ( var module in _attributesToRecover . Keys )
105
110
{
106
111
RecoverAttributes ( rewriteSession , module , _attributesToRecover [ module ] ) ;
@@ -112,13 +117,33 @@ private void ExecuteRecoveryOfAttributes(object sender, ParserStateEventArgs e)
112
117
return ;
113
118
}
114
119
120
+ if ( rewriteSession . Status != RewriteSessionState . Valid )
121
+ {
122
+ _failureNotifier . NotifyRewriteFailed ( rewriteSession . Status ) ;
123
+ return ;
124
+ }
125
+
115
126
CancelTheCurrentParse ( ) ;
116
127
117
- Task . Run ( ( ) => rewriteSession . TryRewrite ( ) ) ;
128
+ Task . Run ( ( ) => Apply ( rewriteSession ) ) ;
118
129
119
130
EndTheCurrentParse ( e . Token ) ;
120
131
}
121
132
133
+ private void Apply ( IRewriteSession rewriteSession )
134
+ {
135
+
136
+ var rewriteSucceeded = rewriteSession . TryRewrite ( ) ;
137
+ if ( ! rewriteSucceeded )
138
+ {
139
+ _failureNotifier . NotifyRewriteFailed ( rewriteSession . Status ) ;
140
+ }
141
+ else if ( _missingMembers . Any ( ) )
142
+ {
143
+ _failureNotifier . NotifyMembersForRecoveryNotFound ( _missingMembers ) ;
144
+ }
145
+ }
146
+
122
147
private void StopRecoveringAttributesOnNextParse ( )
123
148
{
124
149
_parseManager . StateChanged -= ExecuteRecoveryOfAttributes ;
@@ -140,7 +165,9 @@ private void RecoverAttributes(IRewriteSession rewriteSession, QualifiedModuleNa
140
165
141
166
if ( membersWithAttributesToRecover . Count != declarationsWithAttributesToRecover . Count )
142
167
{
143
- LogFailureToRecoverAllAttributes ( module , membersWithAttributesToRecover , declarationsWithAttributesToRecover ) ;
168
+ var membersWithoutDeclarations = MembersWithoutDeclarations ( membersWithAttributesToRecover , declarationsWithAttributesToRecover ) ;
169
+ LogFailureToRecoverAllAttributes ( module , membersWithoutDeclarations ) ;
170
+ _missingMembers . UnionWith ( membersWithoutDeclarations . Select ( memberName => new QualifiedMemberName ( module , memberName ) ) ) ;
144
171
}
145
172
146
173
foreach ( var declaration in declarationsWithAttributesToRecover )
@@ -149,12 +176,16 @@ private void RecoverAttributes(IRewriteSession rewriteSession, QualifiedModuleNa
149
176
}
150
177
}
151
178
152
- private void LogFailureToRecoverAllAttributes ( QualifiedModuleName module , IEnumerable < string > membersWithAttributesToRecover , List < Declaration > declarationsWithAttributesToRecover )
179
+ private static ICollection < string > MembersWithoutDeclarations ( HashSet < string > membersWithAttributesToRecover , IEnumerable < Declaration > declarationsWithAttributesToRecover )
153
180
{
154
- _logger . Warn ( "Could not recover the attributes for all members because one or more members could no longer be found." ) ;
155
-
156
181
var membersWithoutDeclarations = membersWithAttributesToRecover . ToHashSet ( ) ;
157
182
membersWithoutDeclarations . ExceptWith ( declarationsWithAttributesToRecover . Select ( decl => decl . IdentifierName ) ) ;
183
+ return membersWithoutDeclarations ;
184
+ }
185
+
186
+ private void LogFailureToRecoverAllAttributes ( QualifiedModuleName module , IEnumerable < string > membersWithoutDeclarations )
187
+ {
188
+ _logger . Warn ( "Could not recover the attributes for all members because one or more members could no longer be found." ) ;
158
189
foreach ( var member in membersWithoutDeclarations )
159
190
{
160
191
_logger . Trace ( $ "Could not recover the attributes for member { member } in module { module } because a member of that name exists no longer.") ;
0 commit comments