Skip to content

Commit 2bcde43

Browse files
authored
Merge pull request #4279 from MDoerner/SomeRefactoringOfTheComCollector
Some refactoring of the com collector
2 parents 9082102 + 750a766 commit 2bcde43

35 files changed

+989
-689
lines changed

Rubberduck.API/VBA/Parser.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Runtime.InteropServices;
77
using System.Threading;
88
using Rubberduck.Common;
9+
using Rubberduck.Parsing.ComReflection;
910
using Rubberduck.Parsing.PreProcessing;
1011
using Rubberduck.Parsing.Rewriter;
1112
using Rubberduck.Parsing.Symbols.DeclarationLoaders;
@@ -116,7 +117,9 @@ internal Parser(object vbe) : this()
116117
var parserStateManager = new ParserStateManager(_state);
117118
var referenceRemover = new ReferenceRemover(_state, moduleToModuleReferenceManager);
118119
var supertypeClearer = new SupertypeClearer(_state);
119-
var comSynchronizer = new COMReferenceSynchronizer(_state, parserStateManager);
120+
var comLibraryProvider = new ComLibraryProvider();
121+
var referencedDeclarationsCollector = new LibraryReferencedDeclarationsCollector(comLibraryProvider);
122+
var comSynchronizer = new COMReferenceSynchronizer(_state, parserStateManager, projectRepository, referencedDeclarationsCollector);
120123
var builtInDeclarationLoader = new BuiltInDeclarationLoader(
121124
_state,
122125
new List<ICustomDeclarationLoader>

Rubberduck.Core/UI/Command/MenuItems/CommandBars/SerializeDeclarationsCommandMenuItem.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.IO;
3+
using System.Linq;
34
using NLog;
45
using Rubberduck.Parsing.ComReflection;
56
using Rubberduck.Parsing.Symbols;
@@ -22,12 +23,14 @@ public class SerializeDeclarationsCommand : CommandBase
2223
{
2324
private readonly RubberduckParserState _state;
2425
private readonly IPersistable<SerializableProject> _service;
26+
private readonly ISerializableProjectBuilder _serializableProjectBuilder;
2527

26-
public SerializeDeclarationsCommand(RubberduckParserState state, IPersistable<SerializableProject> service)
28+
public SerializeDeclarationsCommand(RubberduckParserState state, IPersistable<SerializableProject> service, ISerializableProjectBuilder serializableProjectBuilder)
2729
: base(LogManager.GetCurrentClassLogger())
2830
{
2931
_state = state;
3032
_service = service;
33+
_serializableProjectBuilder = serializableProjectBuilder;
3134
}
3235

3336
protected override bool EvaluateCanExecute(object parameter)
@@ -43,15 +46,14 @@ protected override void OnExecute(object parameter)
4346
var path = Path.Combine(BasePath, "Declarations");
4447
if (!Directory.Exists(path)) { Directory.CreateDirectory(path); }
4548

46-
foreach (var tree in _state.BuiltInDeclarationTrees)
49+
foreach (var project in _state.DeclarationFinder.BuiltInDeclarations(DeclarationType.Project).OfType<ProjectDeclaration>())
4750
{
4851
System.Diagnostics.Debug.Assert(path != null, "project path isn't supposed to be null");
4952

50-
var filename = string.Format("{0}.{1}.{2}.xml",
51-
tree.Node.QualifiedMemberName.QualifiedModuleName.ProjectName,
52-
tree.MajorVersion,
53-
tree.MinorVersion);
54-
_service.Persist(Path.Combine(path, filename), tree);
53+
var tree = _serializableProjectBuilder.SerializableProject(project);
54+
var filename = $"{tree.Node.QualifiedMemberName.QualifiedModuleName.ProjectName}.{tree.MajorVersion}.{tree.MinorVersion}.xml";
55+
var fullFilename = Path.Combine(path, filename);
56+
_service.Persist(fullFilename, tree);
5557
}
5658
}
5759
}

Rubberduck.Main/Root/RubberduckIoCInstaller.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,12 @@ private void RegisterParsingEngine(IWindsorContainer container)
818818
container.Register(Component.For<IParseCoordinator>()
819819
.ImplementedBy<ParseCoordinator>()
820820
.LifestyleSingleton());
821+
container.Register(Component.For<IComLibraryProvider>()
822+
.ImplementedBy<ComLibraryProvider>()
823+
.LifestyleSingleton());
824+
container.Register(Component.For<IReferencedDeclarationsCollector>()
825+
.ImplementedBy<LibraryReferencedDeclarationsCollector>()
826+
.LifestyleSingleton());
821827
container.Register(Component.For<ITokenStreamPreprocessor>()
822828
.ImplementedBy<VBAPreprocessor>()
823829
.DependsOn(Dependency.OnComponent<ITokenStreamParser, VBAPreprocessorParser>())
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Runtime.InteropServices;
2+
using System.Runtime.InteropServices.ComTypes;
3+
4+
namespace Rubberduck.Parsing.ComReflection
5+
{
6+
public class ComLibraryProvider : IComLibraryProvider
7+
{
8+
#region Native Stuff
9+
// ReSharper disable InconsistentNaming
10+
// ReSharper disable UnusedMember.Local
11+
/// <summary>
12+
/// Controls how a type library is registered.
13+
/// </summary>
14+
private enum REGKIND
15+
{
16+
/// <summary>
17+
/// Use default register behavior.
18+
/// </summary>
19+
20+
21+
REGKIND_DEFAULT = 0,
22+
/// <summary>
23+
/// Register this type library.
24+
/// </summary>
25+
REGKIND_REGISTER = 1,
26+
/// <summary>
27+
/// Do not register this type library.
28+
/// </summary>
29+
REGKIND_NONE = 2
30+
}
31+
// ReSharper restore UnusedMember.Local
32+
33+
[DllImport("oleaut32.dll", CharSet = CharSet.Unicode)]
34+
private static extern int LoadTypeLibEx(string strTypeLibName, REGKIND regKind, out ITypeLib TypeLib);
35+
// ReSharper restore InconsistentNaming
36+
#endregion
37+
38+
public ITypeLib LoadTypeLibrary(string libraryPath)
39+
{
40+
LoadTypeLibEx(libraryPath, REGKIND.REGKIND_NONE, out var typeLibrary);
41+
return typeLibrary;
42+
}
43+
}
44+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Runtime.InteropServices.ComTypes;
2+
3+
namespace Rubberduck.Parsing.ComReflection
4+
{
5+
public interface IComLibraryProvider
6+
{
7+
ITypeLib LoadTypeLibrary(string libraryPath);
8+
}
9+
}
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.Parsing.Symbols;
3+
using Rubberduck.VBEditor;
4+
5+
namespace Rubberduck.Parsing.ComReflection
6+
{
7+
public interface IReferencedDeclarationsCollector
8+
{
9+
IReadOnlyCollection<Declaration> CollectedDeclarations(ReferenceInfo reference);
10+
}
11+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using Rubberduck.Parsing.Symbols;
2+
3+
namespace Rubberduck.Parsing.ComReflection
4+
{
5+
public interface ISerializableProjectBuilder
6+
{
7+
SerializableProject SerializableProject(ProjectDeclaration projectDeclaration);
8+
}
9+
}

0 commit comments

Comments
 (0)