Skip to content

Commit 6cc0f38

Browse files
authored
Merge pull request #2972 from MDoerner/ExtractMtMRefsFromState
Extracted the handling of module-to-module references out of the state
2 parents 9dd6be3 + a37331e commit 6cc0f38

File tree

9 files changed

+88
-186
lines changed

9 files changed

+88
-186
lines changed

RetailCoder.VBE/API/ParserState.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public void Initialize(Microsoft.Vbe.Interop.VBE vbe)
6868
Func<IVBAPreprocessor> preprocessorFactory = () => new VBAPreprocessor(double.Parse(_vbe.Version, CultureInfo.InvariantCulture));
6969
_attributeParser = new AttributeParser(new ModuleExporter(), preprocessorFactory);
7070
var projectManager = new ProjectManager(_state, _vbe);
71-
var moduleToModuleReferenceManager = new ModuleToModuleReferenceManager(_state);
71+
var moduleToModuleReferenceManager = new ModuleToModuleReferenceManager();
7272
var parserStateManager = new ParserStateManager(_state);
7373
var referenceRemover = new ReferenceRemover(_state, moduleToModuleReferenceManager);
7474
var comSynchronizer = new COMReferenceSynchronizer(_state, parserStateManager);

Rubberduck.Parsing/Rubberduck.Parsing.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@
335335
<Compile Include="VBA\AttributeParser.cs" />
336336
<Compile Include="VBA\Attributes.cs" />
337337
<Compile Include="VBA\BuiltInDeclarationLoader.cs" />
338+
<Compile Include="VBA\ModuleToModuleReferenceManager.cs" />
338339
<Compile Include="VBA\IDeclarationFinderProvider.cs" />
339340
<Compile Include="VBA\IParseTreeProvider.cs" />
340341
<Compile Include="VBA\ParsingStageService.cs" />
@@ -363,7 +364,6 @@
363364
<Compile Include="VBA\SynchronousParserStateManager.cs" />
364365
<Compile Include="VBA\ParserStateManager.cs" />
365366
<Compile Include="VBA\ModuleToModuleReferenceManagerBase.cs" />
366-
<Compile Include="VBA\ModuleToModuleReferenceManager.cs" />
367367
<Compile Include="VBA\CombinedParseTreeListener.cs" />
368368
<Compile Include="VBA\ComponentParseTask.cs" />
369369
<Compile Include="VBA\EnumerableExtensions.cs" />

Rubberduck.Parsing/VBA/ModuleState.cs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
using Antlr4.Runtime.Tree;
77
using Rubberduck.Parsing.Annotations;
88
using Rubberduck.Parsing.Symbols;
9-
using Rubberduck.VBEditor;
109

1110
namespace Rubberduck.Parsing.VBA
1211
{
@@ -23,8 +22,6 @@ public class ModuleState
2322
public List<IAnnotation> Annotations { get; private set; }
2423
public SyntaxErrorException ModuleException { get; private set; }
2524
public IDictionary<Tuple<string, DeclarationType>, Attributes> ModuleAttributes { get; private set; }
26-
public ConcurrentDictionary<QualifiedModuleName, byte> HasReferenceToModule { get; private set; }
27-
public HashSet<QualifiedModuleName> IsReferencedByModule { get; private set; }
2825

2926
public bool IsNew { get; private set; }
3027

@@ -49,8 +46,6 @@ public ModuleState(ConcurrentDictionary<Declaration, byte> declarations)
4946
Annotations = new List<IAnnotation>();
5047
ModuleException = null;
5148
ModuleAttributes = new Dictionary<Tuple<string, DeclarationType>, Attributes>();
52-
HasReferenceToModule = new ConcurrentDictionary<QualifiedModuleName, byte>();
53-
IsReferencedByModule = new HashSet<QualifiedModuleName>();
5449

5550
IsNew = true;
5651
}
@@ -67,8 +62,6 @@ public ModuleState(ParserState state)
6762
Annotations = new List<IAnnotation>();
6863
ModuleException = null;
6964
ModuleAttributes = new Dictionary<Tuple<string, DeclarationType>, Attributes>();
70-
HasReferenceToModule = new ConcurrentDictionary<QualifiedModuleName, byte>();
71-
IsReferencedByModule = new HashSet<QualifiedModuleName>();
7265

7366
IsNew = true;
7467
}
@@ -85,8 +78,6 @@ public ModuleState(SyntaxErrorException moduleException)
8578
Annotations = new List<IAnnotation>();
8679
ModuleException = moduleException;
8780
ModuleAttributes = new Dictionary<Tuple<string, DeclarationType>, Attributes>();
88-
HasReferenceToModule = new ConcurrentDictionary<QualifiedModuleName, byte>();
89-
IsReferencedByModule = new HashSet<QualifiedModuleName>();
9081

9182
IsNew = true;
9283
}
@@ -103,8 +94,6 @@ public ModuleState(IDictionary<Tuple<string, DeclarationType>, Attributes> modul
10394
Annotations = new List<IAnnotation>();
10495
ModuleException = null;
10596
ModuleAttributes = moduleAttributes;
106-
HasReferenceToModule = new ConcurrentDictionary<QualifiedModuleName, byte>();
107-
IsReferencedByModule = new HashSet<QualifiedModuleName>();
10897

10998
IsNew = true;
11099
}
@@ -159,16 +148,6 @@ public ModuleState SetModuleAttributes(IDictionary<Tuple<string, DeclarationType
159148
return this;
160149
}
161150

162-
public void RefreshHasReferenceToModule()
163-
{
164-
HasReferenceToModule = new ConcurrentDictionary<QualifiedModuleName, byte>();
165-
}
166-
167-
public void RefreshIsReferencedByModule()
168-
{
169-
IsReferencedByModule = new HashSet<QualifiedModuleName>();
170-
}
171-
172151

173152
private bool _isDisposed;
174153
public void Dispose()
Lines changed: 67 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,98 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
32
using Rubberduck.VBEditor;
3+
using System.Collections.Concurrent;
44

55
namespace Rubberduck.Parsing.VBA
66
{
7-
public class ModuleToModuleReferenceManager: ModuleToModuleReferenceManagerBase
7+
public class ModuleToModuleReferenceManager : ModuleToModuleReferenceManagerBase
88
{
9-
private readonly RubberduckParserState _state;
10-
11-
public ModuleToModuleReferenceManager(RubberduckParserState state)
12-
{
13-
if (state == null)
14-
{
15-
throw new ArgumentNullException(nameof(state));
16-
}
17-
18-
_state = state;
19-
}
9+
private ConcurrentDictionary<QualifiedModuleName, ConcurrentDictionary<QualifiedModuleName, byte>> _referencesFrom = new ConcurrentDictionary<QualifiedModuleName, ConcurrentDictionary<QualifiedModuleName, byte>>();
10+
private ConcurrentDictionary<QualifiedModuleName, ConcurrentDictionary<QualifiedModuleName, byte>> _referencesTo = new ConcurrentDictionary<QualifiedModuleName, ConcurrentDictionary<QualifiedModuleName, byte>>();
2011

2112

2213
public override void AddModuleToModuleReference(QualifiedModuleName referencingModule, QualifiedModuleName referencedModule)
2314
{
24-
_state.AddModuleToModuleReference(referencingModule, referencedModule);
15+
ConcurrentDictionary<QualifiedModuleName, byte> referencedModules;
16+
ConcurrentDictionary<QualifiedModuleName, byte> referencingModules;
17+
while(!_referencesFrom.TryGetValue(referencingModule, out referencedModules) || !_referencesTo.TryGetValue(referencedModule, out referencingModules))
18+
{
19+
_referencesFrom.AddOrUpdate(referencingModule,
20+
new ConcurrentDictionary<QualifiedModuleName, byte>(),
21+
(key, value) => value);
22+
_referencesTo.AddOrUpdate(referencedModule,
23+
new ConcurrentDictionary<QualifiedModuleName, byte>(),
24+
(key, value) => value);
25+
}
26+
referencedModules.AddOrUpdate(referencedModule, 0, (key, value) => value);
27+
referencingModules.AddOrUpdate(referencingModule, 0, (key, value) => value);
2528
}
2629

2730
public override void RemoveModuleToModuleReference(QualifiedModuleName referencedModule, QualifiedModuleName referencingModule)
2831
{
29-
_state.RemoveModuleToModuleReference(referencedModule, referencingModule);
32+
byte dummyOutValue;
33+
ConcurrentDictionary<QualifiedModuleName, byte> referencedModules;
34+
if (_referencesFrom.TryGetValue(referencingModule, out referencedModules))
35+
{
36+
referencedModules.TryRemove(referencedModule, out dummyOutValue);
37+
}
38+
39+
ConcurrentDictionary<QualifiedModuleName, byte> referencingModules;
40+
if (_referencesTo.TryGetValue(referencedModule, out referencingModules))
41+
{
42+
referencingModules.TryRemove(referencingModule, out dummyOutValue);
43+
}
3044
}
3145

32-
public override void ClearModuleToModuleReferencesFromModule(QualifiedModuleName referencingModule)
46+
public override void ClearModuleToModuleReferencesToModule(QualifiedModuleName referencedModule)
3347
{
34-
_state.ClearModuleToModuleReferencesFromModule(referencingModule);
48+
ConcurrentDictionary<QualifiedModuleName, byte> referencingModules;
49+
if (_referencesTo.TryRemove(referencedModule, out referencingModules))
50+
{
51+
byte dummyOutValue;
52+
ConcurrentDictionary<QualifiedModuleName, byte> referencedModules;
53+
foreach (var module in referencingModules.Keys)
54+
{
55+
if(_referencesFrom.TryGetValue(module, out referencedModules))
56+
{
57+
referencedModules.TryRemove(referencedModule, out dummyOutValue);
58+
}
59+
}
60+
}
3561
}
3662

37-
public override void ClearModuleToModuleReferencesToModule(QualifiedModuleName referencedModule)
63+
public override void ClearModuleToModuleReferencesFromModule(QualifiedModuleName referencingModule)
3864
{
39-
_state.ClearModuleToModuleReferencesToModule(referencedModule);
65+
ConcurrentDictionary<QualifiedModuleName, byte> referencedModules;
66+
if (_referencesFrom.TryRemove(referencingModule, out referencedModules))
67+
{
68+
byte dummyOutValue;
69+
ConcurrentDictionary<QualifiedModuleName, byte> referencingModules;
70+
foreach (var module in referencedModules.Keys)
71+
{
72+
if (_referencesTo.TryGetValue(module, out referencingModules))
73+
{
74+
referencingModules.TryRemove(referencingModule, out dummyOutValue);
75+
}
76+
}
77+
}
4078
}
4179

4280
public override IReadOnlyCollection<QualifiedModuleName> ModulesReferencedBy(QualifiedModuleName referencingModule)
4381
{
44-
return _state.ModulesReferencedBy(referencingModule).AsReadOnly();
82+
ConcurrentDictionary<QualifiedModuleName, byte> referencedModules;
83+
return _referencesFrom.TryGetValue(referencingModule, out referencedModules)
84+
? referencedModules.Keys.ToHashSet().AsReadOnly()
85+
: new HashSet<QualifiedModuleName>().AsReadOnly();
4586
}
4687

4788
public override IReadOnlyCollection<QualifiedModuleName> ModulesReferencing(QualifiedModuleName referencedModule)
4889
{
49-
return _state.ModulesReferencing(referencedModule).AsReadOnly();
90+
ConcurrentDictionary<QualifiedModuleName, byte> referencingModules;
91+
return _referencesTo.TryGetValue(referencedModule, out referencingModules)
92+
? referencingModules.Keys.ToHashSet().AsReadOnly()
93+
: new HashSet<QualifiedModuleName>().AsReadOnly();
5094
}
5195

96+
5297
}
5398
}

Rubberduck.Parsing/VBA/RubberduckParserState.cs

Lines changed: 0 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,99 +1030,6 @@ public void RemoveBuiltInDeclarations(IReference reference)
10301030
}
10311031
}
10321032

1033-
public void AddModuleToModuleReference(QualifiedModuleName referencingModule, QualifiedModuleName referencedModule)
1034-
{
1035-
ModuleState referencedModuleState;
1036-
ModuleState referencingModuleState;
1037-
if (!_moduleStates.TryGetValue(referencedModule, out referencedModuleState) || !_moduleStates.TryGetValue(referencingModule, out referencingModuleState))
1038-
{
1039-
return;
1040-
}
1041-
if (referencedModuleState.IsReferencedByModule.Contains(referencingModule))
1042-
{
1043-
return;
1044-
}
1045-
referencedModuleState.IsReferencedByModule.Add(referencingModule);
1046-
referencingModuleState.HasReferenceToModule.AddOrUpdate(referencedModule, 1, (key, value) => value);
1047-
}
1048-
1049-
public void RemoveModuleToModuleReference(QualifiedModuleName referencedModule, QualifiedModuleName referencingModule)
1050-
{
1051-
ModuleState referencedModuleState;
1052-
ModuleState referencingModuleState;
1053-
if (!_moduleStates.TryGetValue(referencedModule, out referencedModuleState) || !_moduleStates.TryGetValue(referencingModule, out referencingModuleState))
1054-
{
1055-
return;
1056-
}
1057-
if (referencedModuleState.IsReferencedByModule.Contains(referencingModule))
1058-
{
1059-
referencedModuleState.IsReferencedByModule.Remove(referencingModule);
1060-
}
1061-
byte dummyOutValue;
1062-
referencingModuleState.HasReferenceToModule.TryRemove(referencedModule, out dummyOutValue);
1063-
}
1064-
1065-
public void ClearModuleToModuleReferencesFromModule(QualifiedModuleName referencingModule)
1066-
{
1067-
ModuleState referencingModuleState;
1068-
if (!_moduleStates.TryGetValue(referencingModule, out referencingModuleState))
1069-
{
1070-
return;
1071-
}
1072-
1073-
foreach (var referencedModule in referencingModuleState.HasReferenceToModule.Keys)
1074-
{
1075-
ModuleState referencedModuleState;
1076-
if (!_moduleStates.TryGetValue(referencedModule,out referencedModuleState))
1077-
{
1078-
continue;
1079-
}
1080-
referencedModuleState.IsReferencedByModule.Remove(referencingModule);
1081-
}
1082-
referencingModuleState.RefreshHasReferenceToModule();
1083-
}
1084-
1085-
public void ClearModuleToModuleReferencesToModule(QualifiedModuleName referencedModule)
1086-
{
1087-
ModuleState referencedModuleState;
1088-
if (!_moduleStates.TryGetValue(referencedModule, out referencedModuleState))
1089-
{
1090-
return;
1091-
}
1092-
1093-
foreach(var referencingModule in referencedModuleState.IsReferencedByModule)
1094-
{
1095-
ModuleState referencingModuleState;
1096-
if (!_moduleStates.TryGetValue(referencingModule, out referencingModuleState))
1097-
{
1098-
continue;
1099-
}
1100-
byte dummyOutValue;
1101-
referencingModuleState.HasReferenceToModule.TryRemove(referencedModule, out dummyOutValue);
1102-
}
1103-
referencedModuleState.RefreshIsReferencedByModule();
1104-
}
1105-
1106-
public HashSet<QualifiedModuleName> ModulesReferencedBy(QualifiedModuleName referencingModule)
1107-
{
1108-
ModuleState referencingModuleState;
1109-
if (!_moduleStates.TryGetValue(referencingModule, out referencingModuleState))
1110-
{
1111-
return new HashSet<QualifiedModuleName>();
1112-
}
1113-
return new HashSet<QualifiedModuleName>(referencingModuleState.HasReferenceToModule.Keys);
1114-
}
1115-
1116-
public HashSet<QualifiedModuleName> ModulesReferencing(QualifiedModuleName referencedModule)
1117-
{
1118-
ModuleState referencedModuleState;
1119-
if (!_moduleStates.TryGetValue(referencedModule, out referencedModuleState))
1120-
{
1121-
return new HashSet<QualifiedModuleName>();
1122-
}
1123-
return new HashSet<QualifiedModuleName>(referencedModuleState.IsReferencedByModule);
1124-
}
1125-
11261033

11271034
private bool _isDisposed;
11281035

RubberduckTests/Mocks/MockParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public static ParseCoordinator Create(IVBE vbe, RubberduckParserState state, IAt
4747
Path.Combine(Path.GetDirectoryName(Assembly.GetAssembly(typeof(MockParser)).Location), "TestFiles", "Resolver");
4848
Func<IVBAPreprocessor> preprocessorFactory = () => new VBAPreprocessor(double.Parse(vbe.Version, CultureInfo.InvariantCulture));
4949
var projectManager = new ProjectManager(state, vbe);
50-
var moduleToModuleReferenceManager = new ModuleToModuleReferenceManager(state);
50+
var moduleToModuleReferenceManager = new ModuleToModuleReferenceManager();
5151
var parserStateManager = new SynchronousParserStateManager(state);
5252
var referenceRemover = new SynchronousReferenceRemover(state, moduleToModuleReferenceManager);
5353
var comSynchronizer = new SynchronousCOMReferenceSynchronizer(

RubberduckTests/Parsing/Coordination/ModuleToModuleReferenceManagerTests.cs

Lines changed: 0 additions & 46 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using System.Linq;
4+
using Rubberduck.Parsing.VBA;
5+
using RubberduckTests.Mocks;
6+
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
7+
namespace RubberduckTests.Parsing.Coordination
8+
{
9+
[TestClass]
10+
public class StandAloneModuleToModuleReferenceManagerTests : IModuleToModuleReferenceManagerTestBase
11+
{
12+
protected override IModuleToModuleReferenceManager GetNewTestModuleToModuleReferenceManager()
13+
{
14+
return new ModuleToModuleReferenceManager();
15+
}
16+
}
17+
}

RubberduckTests/RubberduckTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@
106106
<Compile Include="Inspections\QuickFixProviderTests.cs" />
107107
<Compile Include="Inspections\UndeclaredVariableInspectionTests.cs" />
108108
<Compile Include="Parsing\Coordination\IModuleToModuleReferenceManagerTestBase.cs" />
109-
<Compile Include="Parsing\Coordination\ModuleToModuleReferenceManagerTests.cs" />
109+
<Compile Include="Parsing\Coordination\StandAloneModuleToModuleReferenceManagerTests.cs" />
110110
<Compile Include="PostProcessing\ModuleRewriterTests.cs" />
111111
<Compile Include="SmartIndenter\VerticalSpacingTests.cs" />
112112
<Compile Include="Symbols\AccessibilityCheckTests.cs" />

0 commit comments

Comments
 (0)