Skip to content

Commit 126d05d

Browse files
authored
Merge pull request #4441 from MDoerner/FixDeserializedObjectCachingInTests
Cache deserialized ComProjects in the tests instead of declarations
2 parents 8d26793 + c80cc17 commit 126d05d

File tree

6 files changed

+63
-48
lines changed

6 files changed

+63
-48
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Rubberduck.VBEditor;
2+
3+
namespace Rubberduck.Parsing.ComReflection
4+
{
5+
public interface IComProjectDeserializer
6+
{
7+
ComProject DeserializeProject(ReferenceInfo reference);
8+
bool SerializedVersionExists(ReferenceInfo reference);
9+
}
10+
}
Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
using Rubberduck.VBEditor;
2-
3-
namespace Rubberduck.Parsing.ComReflection
1+
namespace Rubberduck.Parsing.ComReflection
42
{
5-
public interface IComProjectSerializationProvider
3+
public interface IComProjectSerializationProvider : IComProjectDeserializer
64
{
75
string Target { get; }
86
void SerializeProject(ComProject project);
9-
ComProject DeserializeProject(ReferenceInfo reference);
10-
bool SerializedVersionExists(ReferenceInfo reference);
117
}
128
}

Rubberduck.Parsing/ComReflection/SerializedReferencedDeclarationsCollector.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ namespace Rubberduck.Parsing.ComReflection
66
{
77
public class SerializedReferencedDeclarationsCollector : ReferencedDeclarationsCollectorBase
88
{
9-
private readonly IComProjectSerializationProvider _serializer;
9+
private readonly IComProjectDeserializer _deserializer;
1010

11-
public SerializedReferencedDeclarationsCollector(string serializedDeclarationsPath = null)
11+
public SerializedReferencedDeclarationsCollector(IComProjectDeserializer deserializer)
1212
{
13-
_serializer = new XmlComProjectSerializer(serializedDeclarationsPath);
13+
_deserializer = deserializer;
1414
}
1515

1616
public override IReadOnlyCollection<Declaration> CollectedDeclarations(ReferenceInfo reference)
1717
{
18-
if (!_serializer.SerializedVersionExists(reference))
18+
if (!_deserializer.SerializedVersionExists(reference))
1919
{
2020
return new List<Declaration>();
2121
}
@@ -25,7 +25,7 @@ public override IReadOnlyCollection<Declaration> CollectedDeclarations(Reference
2525

2626
private IReadOnlyCollection<Declaration> LoadDeclarationsFromProvider(ReferenceInfo reference)
2727
{
28-
var type = _serializer.DeserializeProject(reference);
28+
var type = _deserializer.DeserializeProject(reference);
2929
return LoadDeclarationsFromComProject(type);
3030
}
3131
}

RubberduckTests/Mocks/MockParser.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,9 @@ public static SynchronousParseCoordinator Create(IVBE vbe, RubberduckParserState
7272
var supertypeClearer = new SynchronousSupertypeClearer(state);
7373
var parserStateManager = new SynchronousParserStateManager(state);
7474
var referenceRemover = new SynchronousReferenceRemover(state, moduleToModuleReferenceManager);
75-
var baseReferencedDeclarationsCollector = new SerializedReferencedDeclarationsCollector(path);
76-
var referencedDeclarationsCollector = new StaticCachingReferencedDeclarationsCollectorDecorator(baseReferencedDeclarationsCollector);
75+
var baseComDeserializer = new XmlComProjectSerializer(path);
76+
var comDeserializer = new StaticCachingComDeserializerDecorator(baseComDeserializer);
77+
var referencedDeclarationsCollector = new SerializedReferencedDeclarationsCollector(comDeserializer);
7778
var comSynchronizer = new SynchronousCOMReferenceSynchronizer(
7879
state,
7980
parserStateManager,
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
using System.Collections.Generic;
2+
using Rubberduck.Parsing.ComReflection;
3+
using Rubberduck.VBEditor;
4+
5+
namespace RubberduckTests.Mocks
6+
{
7+
public class StaticCachingComDeserializerDecorator : IComProjectDeserializer
8+
{
9+
private static readonly Dictionary<ReferenceInfo, ComProject> CachedReferences = new Dictionary<ReferenceInfo, ComProject>();
10+
11+
private static readonly object _lockObject = new object();
12+
13+
private IComProjectDeserializer _baseDeserializer;
14+
15+
public StaticCachingComDeserializerDecorator(IComProjectDeserializer baseDeserializer)
16+
{
17+
_baseDeserializer = baseDeserializer;
18+
}
19+
20+
public bool SerializedVersionExists(ReferenceInfo reference)
21+
{
22+
lock(_lockObject)
23+
{
24+
return CachedReferences.TryGetValue(reference, out _) || _baseDeserializer.SerializedVersionExists(reference);
25+
}
26+
}
27+
28+
public ComProject DeserializeProject(ReferenceInfo reference)
29+
{
30+
lock (_lockObject)
31+
{
32+
if (CachedReferences.TryGetValue(reference, out var cachedProject))
33+
{
34+
return cachedProject;
35+
}
36+
37+
var comProject = _baseDeserializer.DeserializeProject(reference);
38+
CachedReferences[reference] = comProject;
39+
return comProject;
40+
}
41+
}
42+
}
43+
}

RubberduckTests/Mocks/StaticCachingReferencedDeclarationsCollectorDecorator.cs

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)