Skip to content

Commit ff2cbd4

Browse files
committed
Wire up member attribute recovery in the RewritingManager
1 parent 02d4ad1 commit ff2cbd4

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

Rubberduck.Parsing/Rewriter/RewritingManager.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,16 @@ public class RewritingManager : IRewritingManager
88
{
99
private readonly HashSet<IRewriteSession> _activeCodePaneSessions = new HashSet<IRewriteSession>();
1010
private readonly HashSet<IRewriteSession> _activeAttributesSessions = new HashSet<IRewriteSession>();
11+
private readonly IMemberAttributeRecoverer _memberAttributeRecoverer;
1112

1213
private readonly IRewriteSessionFactory _sessionFactory;
1314

1415
private readonly object _invalidationLockObject = new object();
1516

16-
public RewritingManager(IRewriteSessionFactory sessionFactory)
17+
public RewritingManager(IRewriteSessionFactory sessionFactory, IMemberAttributeRecoverer memberAttributeRecoverer)
1718
{
1819
_sessionFactory = sessionFactory;
20+
_memberAttributeRecoverer = memberAttributeRecoverer;
1921
}
2022

2123

@@ -51,10 +53,19 @@ private bool TryAllowExclusiveRewrite(IRewriteSession rewriteSession)
5153
}
5254

5355
InvalidateAllSessionsInternal();
56+
if (rewriteSession.TargetCodeKind == CodeKind.CodePaneCode)
57+
{
58+
RequestMemberAttributeRecovery(rewriteSession);
59+
}
5460
return true;
5561
}
5662
}
5763

64+
private void RequestMemberAttributeRecovery(IRewriteSession rewriteSession)
65+
{
66+
_memberAttributeRecoverer.RecoverCurrentMemberAttributesAfterNextParse(rewriteSession.CheckedOutModules);
67+
}
68+
5869
private bool IsCurrentlyActive(IRewriteSession rewriteSession)
5970
{
6071
switch (rewriteSession.TargetCodeKind)

RubberduckTests/Mocks/MockParser.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ public static (SynchronousParseCoordinator parser, IRewritingManager rewritingMa
134134
attributesSourceCodeHandler);
135135
var rewriterProvider = new RewriterProvider(tokenStreamCache, moduleRewriterFactory);
136136
var rewriteSessionFactory = new RewriteSessionFactory(state, rewriterProvider);
137-
var rewritingManager = new RewritingManager(rewriteSessionFactory);
137+
var stubMembersAttributeRecoverer = new Mock<IMemberAttributeRecoverer>().Object;
138+
var rewritingManager = new RewritingManager(rewriteSessionFactory, stubMembersAttributeRecoverer);
138139

139140
var parser = new SynchronousParseCoordinator(
140141
state,

RubberduckTests/Rewriter/RewriteManagerTests.cs

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using NUnit.Framework;
66
using Rubberduck.Parsing.Rewriter;
77
using Rubberduck.Parsing.VBA.Parsing;
8+
using Rubberduck.VBEditor;
89

910
namespace RubberduckTests.Rewriter
1011
{
@@ -177,10 +178,47 @@ public void CallingTheRewritingAllowedCallbackFromANoLongerActiveAttributesSessi
177178
}
178179
}
179180

180-
private IRewritingManager RewritingManager(out MockRewriteSessionFactory mockFactory)
181+
[Test]
182+
[Category("Rewriter")]
183+
public void CallingTheRewritingAllowedCallbackFromAnActiveCodePaneSessionRequestMemberAttributeRecoveryForTheCheckedOutModules()
184+
{
185+
var memberAttributeRecovererMock = new Mock<IMemberAttributeRecoverer>();
186+
memberAttributeRecovererMock.Setup(m => m.RecoverCurrentMemberAttributesAfterNextParse(It.IsAny<IEnumerable<QualifiedModuleName>>()));
187+
188+
var rewritingManager = RewritingManager(out var mockFactory, memberAttributeRecovererMock.Object);
189+
var codePaneSession = rewritingManager.CheckOutCodePaneSession();
190+
191+
var moduleToCheckOutRewriterFor = new QualifiedModuleName("project", "path", "module");
192+
codePaneSession.CheckOutModuleRewriter(moduleToCheckOutRewriterFor);
193+
194+
codePaneSession.TryRewrite();
195+
196+
memberAttributeRecovererMock.Verify(m => m.RecoverCurrentMemberAttributesAfterNextParse(new HashSet<QualifiedModuleName>{ moduleToCheckOutRewriterFor }), Times.Once);
197+
}
198+
199+
[Test]
200+
[Category("Rewriter")]
201+
public void CallingTheRewritingAllowedCallbackFromAnActiveAttributesSessionDoesNotRequestMemberAttributeRecovery()
181202
{
203+
var memberAttributeRecovererMock = new Mock<IMemberAttributeRecoverer>();
204+
memberAttributeRecovererMock.Setup(m => m.RecoverCurrentMemberAttributesAfterNextParse(It.IsAny<IEnumerable<QualifiedModuleName>>()));
205+
206+
var rewritingManager = RewritingManager(out var mockFactory, memberAttributeRecovererMock.Object);
207+
var codePaneSession = rewritingManager.CheckOutAttributesSession();
208+
209+
var moduleToCheckOutRewriterFor = new QualifiedModuleName("project", "path", "module");
210+
codePaneSession.CheckOutModuleRewriter(moduleToCheckOutRewriterFor);
211+
212+
codePaneSession.TryRewrite();
213+
214+
memberAttributeRecovererMock.Verify(m => m.RecoverCurrentMemberAttributesAfterNextParse(It.IsAny<IEnumerable<QualifiedModuleName>>()), Times.Never);
215+
}
216+
217+
private IRewritingManager RewritingManager(out MockRewriteSessionFactory mockFactory, IMemberAttributeRecoverer memberAttributeRecoverer = null)
218+
{
219+
var recoverer = memberAttributeRecoverer ?? new Mock<IMemberAttributeRecoverer>().Object;
182220
mockFactory = new MockRewriteSessionFactory();
183-
return new RewritingManager(mockFactory);
221+
return new RewritingManager(mockFactory, recoverer);
184222
}
185223
}
186224

@@ -215,6 +253,12 @@ private Mock<IRewriteSession> MockSession(Func<IRewriteSession, bool> rewritingA
215253
mockSession.Setup(m => m.Invalidate()).Callback(() => isInvalidated = true);
216254
mockSession.Setup(m => m.TargetCodeKind).Returns(targetCodeKind);
217255

256+
var checkedOutModules = new HashSet<QualifiedModuleName>();
257+
mockSession.Setup(m => m.CheckOutModuleRewriter(It.IsAny<QualifiedModuleName>()))
258+
.Returns( (QualifiedModuleName module) => null)
259+
.Callback((QualifiedModuleName module) => checkedOutModules.Add(module));
260+
mockSession.Setup(m => m.CheckedOutModules).Returns(() => checkedOutModules);
261+
218262
return mockSession;
219263
}
220264

0 commit comments

Comments
 (0)