Skip to content

Commit b9561b7

Browse files
authored
Merge pull request #4686 from MDoerner/RecoveringMemberAttributes
Recovering member attributes
2 parents cd8b365 + cf1aedc commit b9561b7

22 files changed

+800
-18
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Rubberduck.Interaction;
4+
using Rubberduck.Parsing.Rewriter;
5+
using Rubberduck.VBEditor;
6+
7+
namespace Rubberduck.UI.Notifiers
8+
{
9+
public class MemberAttributeRecoveryFailureNotifier : IMemberAttributeRecoveryFailureNotifier
10+
{
11+
private readonly IMessageBox _messageBox;
12+
13+
public MemberAttributeRecoveryFailureNotifier(IMessageBox messageBox)
14+
{
15+
_messageBox = messageBox;
16+
}
17+
18+
public void NotifyRewriteFailed(RewriteSessionState sessionState)
19+
{
20+
var message = RewriteFailureMessage(sessionState);
21+
var caption = Resources.RubberduckUI.MemberAttributeRecoveryFailureCaption;
22+
23+
_messageBox.NotifyWarn(message, caption);
24+
}
25+
26+
private static string RewriteFailureMessage(RewriteSessionState sessionState)
27+
{
28+
var baseFailureMessage = Resources.RubberduckUI.MemberAttributeRecoveryRewriteFailedMessage;
29+
var failureReasonMessage = RewriteFailureReasonMessage(sessionState);
30+
var message = string.IsNullOrEmpty(failureReasonMessage)
31+
? baseFailureMessage
32+
: $"{baseFailureMessage}{Environment.NewLine}{Environment.NewLine}{failureReasonMessage}";
33+
return message;
34+
}
35+
36+
private static string RewriteFailureReasonMessage(RewriteSessionState sessionState)
37+
{
38+
switch (sessionState)
39+
{
40+
case RewriteSessionState.StaleParseTree:
41+
return Resources.Inspections.QuickFixes.StaleModuleFailureReason;
42+
default:
43+
return string.Empty;
44+
}
45+
}
46+
47+
public void NotifyMembersForRecoveryNotFound(IEnumerable<QualifiedMemberName> membersNotFound)
48+
{
49+
var message = MembersNotFoundMessage(membersNotFound);
50+
var caption = Resources.RubberduckUI.MemberAttributeRecoveryFailureCaption;
51+
52+
_messageBox.NotifyWarn(message, caption);
53+
}
54+
55+
private string MembersNotFoundMessage(IEnumerable<QualifiedMemberName> membersNotFound)
56+
{
57+
var missingMemberList = $"{Environment.NewLine}{string.Join(Environment.NewLine, membersNotFound)}";
58+
return string.Format(Resources.RubberduckUI.MemberAttributeRecoveryMembersNotFoundMessage, missingMemberList); ;
59+
}
60+
}
61+
}

Rubberduck.Deployment.Build/RubberduckPreBuildTask.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ private void VerifyFileLocks()
5555

5656
private void UpdateLicenseFile()
5757
{
58-
var sourceFile = WorkingDir + @"\Licenses\license.rtf";
58+
var sourceFile = WorkingDir + @"\Licenses\License.rtf";
5959
var license = WorkingDir + @"\InnoSetup\Includes\license.rtf";
6060
var endYear = new DateTime().Year;
6161

Rubberduck.Main/Root/RubberduckIoCInstaller.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ public void Install(IWindsorContainer container, IConfigurationStore store)
116116
container.Register(Component.For<IRewritingManager>()
117117
.ImplementedBy<RewritingManager>()
118118
.LifestyleSingleton());
119+
container.Register(Component.For<IMemberAttributeRecovererWithSettableRewritingManager>()
120+
.ImplementedBy<MemberAttributeRecoverer>()
121+
.LifestyleSingleton());
119122

120123
container.Register(Component.For<TestExplorerModel>()
121124
.LifestyleSingleton());

Rubberduck.Parsing/Rewriter/AttributesRewriteSession.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ protected override IExecutableModuleRewriter ModuleRewriter(QualifiedModuleName
2424
}
2525

2626
protected override bool TryRewriteInternal()
27-
{
27+
{
2828
//The suspension ensures that only one parse gets executed instead of two for each rewritten module.
29-
var result = _parseManager.OnSuspendParser(this, new[] {ParserState.Ready}, ExecuteAllRewriters);
29+
GuaranteeReparseAfterRewrite();
30+
var result = _parseManager.OnSuspendParser(this, new[] {ParserState.Ready, ParserState.ResolvedDeclarations}, ExecuteAllRewriters);
3031
if(result != SuspensionResult.Completed)
3132
{
3233
Logger.Warn($"Rewriting attribute modules did not succeed. suspension result = {result}");
@@ -36,6 +37,22 @@ protected override bool TryRewriteInternal()
3637
return true;
3738
}
3839

40+
private void GuaranteeReparseAfterRewrite()
41+
{
42+
_parseManager.StateChanged += ReparseOnSuspension;
43+
}
44+
45+
private void ReparseOnSuspension(object requestor, ParserStateEventArgs e)
46+
{
47+
if (e.State != ParserState.Busy)
48+
{
49+
return;
50+
}
51+
52+
_parseManager.StateChanged -= ReparseOnSuspension;
53+
_parseManager.OnParseRequested(this);
54+
}
55+
3956
private void ExecuteAllRewriters()
4057
{
4158
foreach (var module in CheckedOutModuleRewriters.Keys)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Collections.Generic;
2+
using Rubberduck.VBEditor;
3+
4+
namespace Rubberduck.Parsing.Rewriter
5+
{
6+
public interface IMemberAttributeRecoverer
7+
{
8+
void RecoverCurrentMemberAttributesAfterNextParse(IEnumerable<QualifiedMemberName> members);
9+
void RecoverCurrentMemberAttributesAfterNextParse(IEnumerable<QualifiedModuleName> modules);
10+
}
11+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Rubberduck.Parsing.Rewriter
2+
{
3+
public interface IMemberAttributeRecovererWithSettableRewritingManager : IMemberAttributeRecoverer
4+
{
5+
IRewritingManager RewritingManager { set; }
6+
}
7+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Collections.Generic;
2+
using Rubberduck.VBEditor;
3+
4+
namespace Rubberduck.Parsing.Rewriter
5+
{
6+
public interface IMemberAttributeRecoveryFailureNotifier
7+
{
8+
void NotifyRewriteFailed(RewriteSessionState rewriteSessionState);
9+
void NotifyMembersForRecoveryNotFound(IEnumerable<QualifiedMemberName> membersNotFound);
10+
}
11+
}

Rubberduck.Parsing/Rewriter/IRewriteSession.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Rubberduck.Parsing.VBA.Parsing;
1+
using System.Collections.Generic;
2+
using Rubberduck.Parsing.VBA.Parsing;
23
using Rubberduck.VBEditor;
34

45
namespace Rubberduck.Parsing.Rewriter
@@ -7,6 +8,7 @@ public interface IRewriteSession
78
{
89
IModuleRewriter CheckOutModuleRewriter(QualifiedModuleName module);
910
bool TryRewrite();
11+
IReadOnlyCollection<QualifiedModuleName> CheckedOutModules { get; }
1012
RewriteSessionState Status { get; set; }
1113
CodeKind TargetCodeKind { get; }
1214
}

0 commit comments

Comments
 (0)