Skip to content

Commit 91364e2

Browse files
committed
Refactored IModuleExporter to a higher level ISourceCodeHandler abstraction, with concrete implementations for VBA and VB6
1 parent 1addfae commit 91364e2

File tree

21 files changed

+158
-109
lines changed

21 files changed

+158
-109
lines changed

Rubberduck.API/VBA/Parser.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ internal Parser(object vbe) : this()
8787
_state = new RubberduckParserState(_vbe, projectRepository, declarationFinderFactory, _vbeEvents);
8888
_state.StateChanged += _state_StateChanged;
8989

90-
var exporter = new ModuleExporter();
90+
var sourceCodeHandler = _vbe.SourceCodeHandler;
9191

9292
IVBAPreprocessor preprocessorFactory() => new VBAPreprocessor(double.Parse(_vbe.Version, CultureInfo.InvariantCulture));
93-
_attributeParser = new AttributeParser(exporter, preprocessorFactory, _state.ProjectsProvider);
93+
_attributeParser = new AttributeParser(sourceCodeHandler, preprocessorFactory, _state.ProjectsProvider);
9494
var projectManager = new RepositoryProjectManager(projectRepository);
9595
var moduleToModuleReferenceManager = new ModuleToModuleReferenceManager();
9696
var parserStateManager = new ParserStateManager(_state);
@@ -113,7 +113,7 @@ internal Parser(object vbe) : this()
113113
parserStateManager,
114114
preprocessorFactory,
115115
_attributeParser,
116-
exporter);
116+
sourceCodeHandler);
117117
var declarationResolveRunner = new DeclarationResolveRunner(
118118
_state,
119119
parserStateManager,

Rubberduck.Core/Common/ModuleExporter.cs

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

Rubberduck.Core/Rubberduck.Core.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,6 @@
326326
<Compile Include="Common\IOperatingSystem.cs" />
327327
<Compile Include="Common\IRubberduckHooks.cs" />
328328
<Compile Include="Common\LogLevelHelper.cs" />
329-
<Compile Include="Common\ModuleExporter.cs" />
330329
<Compile Include="Common\StringExtensions.cs" />
331330
<Compile Include="Common\VariableNameValidator.cs" />
332331
<Compile Include="Common\WinAPI\RegistryAccess.cs" />
Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.IO;
22
using Antlr4.Runtime;
33
using Rubberduck.Parsing.VBA;
4+
using Rubberduck.VBEditor;
45
using Rubberduck.VBEditor.SafeComWrappers;
56
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
67

@@ -19,41 +20,31 @@ namespace Rubberduck.Parsing.Rewriter
1920
/// </remarks>
2021
public class MemberAttributesRewriter : ModuleRewriter
2122
{
22-
private readonly IModuleExporter _exporter;
23+
private readonly ISourceCodeHandler _sourceCodeHandler;
2324

24-
public MemberAttributesRewriter(IModuleExporter exporter, ICodeModule module, TokenStreamRewriter rewriter)
25+
public MemberAttributesRewriter(ISourceCodeHandler sourceCodeHandler, ICodeModule module, TokenStreamRewriter rewriter)
2526
: base(module, rewriter)
2627
{
27-
_exporter = exporter;
28+
_sourceCodeHandler = sourceCodeHandler;
2829
}
2930

3031
public override void Rewrite()
3132
{
3233
if(!IsDirty) { return; }
3334

3435
var component = Module.Parent;
35-
var vbeKind = component.VBE.Kind;
3636
if (component.Type == ComponentType.Document)
3737
{
3838
// can't re-import a document module
3939
return;
4040
}
4141

42-
var file = vbeKind == VBEKind.Hosted
43-
? _exporter.Export(component)
44-
: component.GetFileName(1);
42+
var file = _sourceCodeHandler.Export(component);
4543

4644
var content = Rewriter.GetText();
4745
File.WriteAllText(file, content);
48-
49-
if (vbeKind == VBEKind.Standalone)
50-
{
51-
return;
52-
}
53-
54-
var components = component.Collection;
55-
components.Remove(component);
56-
components.ImportSourceFile(file);
46+
47+
_sourceCodeHandler.Import(component, file);
5748
}
5849
}
5950
}

Rubberduck.Parsing/Rubberduck.Parsing.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,6 @@
394394
<Compile Include="VBA\ComponentParseTask.cs" />
395395
<Compile Include="VBA\EnumerableExtensions.cs" />
396396
<Compile Include="VBA\IAttributeParser.cs" />
397-
<Compile Include="VBA\IModuleExporter.cs" />
398397
<Compile Include="VBA\IModuleToModuleReferenceManager.cs" />
399398
<Compile Include="VBA\IDeclarationResolveRunner.cs" />
400399
<Compile Include="VBA\ICOMReferenceSynchronizer.cs" />

Rubberduck.Parsing/VBA/AttributeParser.cs

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Antlr4.Runtime.Tree;
33
using Rubberduck.Parsing.Symbols;
44
using System;
5+
using System.Collections;
56
using System.Collections.Generic;
67
using System.IO;
78
using System.Text;
@@ -16,13 +17,13 @@ namespace Rubberduck.Parsing.VBA
1617
{
1718
public class AttributeParser : IAttributeParser
1819
{
19-
private readonly IModuleExporter _exporter;
20+
private readonly ISourceCodeHandler _sourceCodeHandler;
2021
private readonly Func<IVBAPreprocessor> _preprocessorFactory;
2122
private readonly IProjectsProvider _projectsProvider;
2223

23-
public AttributeParser(IModuleExporter exporter, Func<IVBAPreprocessor> preprocessorFactory, IProjectsProvider projectsProvider)
24+
public AttributeParser(ISourceCodeHandler sourceCodeHandler, Func<IVBAPreprocessor> preprocessorFactory, IProjectsProvider projectsProvider)
2425
{
25-
_exporter = exporter;
26+
_sourceCodeHandler = sourceCodeHandler;
2627
_preprocessorFactory = preprocessorFactory;
2728
_projectsProvider = projectsProvider;
2829
}
@@ -37,38 +38,12 @@ public AttributeParser(IModuleExporter exporter, Func<IVBAPreprocessor> preproce
3738
cancellationToken.ThrowIfCancellationRequested();
3839
var component = _projectsProvider.Component(module);
3940

40-
var path = component.VBE.Kind == VBEKind.Hosted
41-
? _exporter.Export(component)
42-
: component.GetFileName(1);
43-
44-
if (!File.Exists(path))
41+
var code = _sourceCodeHandler.Read(component);
42+
if (code == null)
4543
{
46-
// a document component without any code wouldn't be exported (file would be empty anyway).
4744
return (null, null, new Dictionary<Tuple<string, DeclarationType>, Attributes>());
4845
}
4946

50-
string code;
51-
if (module.ComponentType == ComponentType.Document)
52-
{
53-
code = File.ReadAllText(path, Encoding.UTF8); //We export the code from Documents as UTF8.
54-
}
55-
else
56-
{
57-
code = File.ReadAllText(path, Encoding.Default); //The VBE exports encoded in the current ANSI codepage from the windows settings.
58-
}
59-
60-
if (component.VBE.Kind == VBEKind.Hosted)
61-
{
62-
try
63-
{
64-
File.Delete(path);
65-
}
66-
catch
67-
{
68-
// Meh.
69-
}
70-
}
71-
7247
cancellationToken.ThrowIfCancellationRequested();
7348

7449
var type = module.ComponentType == ComponentType.StandardModule

Rubberduck.Parsing/VBA/ComponentParseTask.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class ComponentParseTask
2525
private readonly QualifiedModuleName _module;
2626
private readonly TokenStreamRewriter _rewriter;
2727
private readonly IAttributeParser _attributeParser;
28-
private readonly IModuleExporter _exporter;
28+
private readonly ISourceCodeHandler _sourceCodeHandler;
2929
private readonly IVBAPreprocessor _preprocessor;
3030
private readonly VBAModuleParser _parser;
3131
private readonly IProjectsProvider _projectsProvider;
@@ -36,12 +36,12 @@ class ComponentParseTask
3636

3737
private readonly Guid _taskId;
3838

39-
public ComponentParseTask(QualifiedModuleName module, IVBAPreprocessor preprocessor, IAttributeParser attributeParser, IModuleExporter exporter, IProjectsProvider projectsProvider, TokenStreamRewriter rewriter = null)
39+
public ComponentParseTask(QualifiedModuleName module, IVBAPreprocessor preprocessor, IAttributeParser attributeParser, ISourceCodeHandler sourceCodeHandler, IProjectsProvider projectsProvider, TokenStreamRewriter rewriter = null)
4040
{
4141
_taskId = Guid.NewGuid();
4242

4343
_attributeParser = attributeParser;
44-
_exporter = exporter;
44+
_sourceCodeHandler = sourceCodeHandler;
4545
_preprocessor = preprocessor;
4646
_module = module;
4747
_rewriter = rewriter;
@@ -72,7 +72,7 @@ public void Start(CancellationToken cancellationToken)
7272
cancellationToken.ThrowIfCancellationRequested();
7373

7474
var attributesPassParseResults = RunAttributesPass(cancellationToken);
75-
var rewriter = new MemberAttributesRewriter(_exporter, _projectsProvider.Component(_module).CodeModule, new TokenStreamRewriter(attributesPassParseResults.tokenStream ?? tokenStream));
75+
var rewriter = new MemberAttributesRewriter(_sourceCodeHandler, _projectsProvider.Component(_module).CodeModule, new TokenStreamRewriter(attributesPassParseResults.tokenStream ?? tokenStream));
7676

7777
var completedHandler = ParseCompleted;
7878
if (completedHandler != null && !cancellationToken.IsCancellationRequested)

Rubberduck.Parsing/VBA/IModuleExporter.cs

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

Rubberduck.Parsing/VBA/ParseRunner.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ public ParseRunner(
1717
IParserStateManager parserStateManager,
1818
Func<IVBAPreprocessor> preprocessorFactory,
1919
IAttributeParser attributeParser,
20-
IModuleExporter exporter)
20+
ISourceCodeHandler sourceCodeHandler)
2121
:base(state,
2222
parserStateManager,
2323
preprocessorFactory,
2424
attributeParser,
25-
exporter)
25+
sourceCodeHandler)
2626
{ }
2727

2828
public override void ParseModules(IReadOnlyCollection<QualifiedModuleName> modules, CancellationToken token)

Rubberduck.Parsing/VBA/ParseRunnerBase.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ public abstract class ParseRunnerBase : IParseRunner
1818
private readonly RubberduckParserState _state;
1919
private readonly Func<IVBAPreprocessor> _preprocessorFactory;
2020
private readonly IAttributeParser _attributeParser;
21-
private readonly IModuleExporter _exporter;
21+
private readonly ISourceCodeHandler _sourceCodeHandler;
2222

2323
protected ParseRunnerBase(
2424
RubberduckParserState state,
2525
IParserStateManager parserStateManager,
2626
Func<IVBAPreprocessor> preprocessorFactory,
2727
IAttributeParser attributeParser,
28-
IModuleExporter exporter)
28+
ISourceCodeHandler sourceCodeHandler)
2929
{
3030
if (state == null)
3131
{
@@ -48,7 +48,7 @@ protected ParseRunnerBase(
4848
StateManager = parserStateManager;
4949
_preprocessorFactory = preprocessorFactory;
5050
_attributeParser = attributeParser;
51-
_exporter = exporter;
51+
_sourceCodeHandler = sourceCodeHandler;
5252
}
5353

5454

@@ -67,7 +67,7 @@ protected void ParseModule(QualifiedModuleName module, CancellationToken token)
6767
var tcs = new TaskCompletionSource<ComponentParseTask.ParseCompletionArgs>();
6868

6969
var preprocessor = _preprocessorFactory();
70-
var parser = new ComponentParseTask(module, preprocessor, _attributeParser, _exporter, _state.ProjectsProvider, rewriter);
70+
var parser = new ComponentParseTask(module, preprocessor, _attributeParser, _sourceCodeHandler, _state.ProjectsProvider, rewriter);
7171

7272
parser.ParseFailure += (sender, e) =>
7373
{

0 commit comments

Comments
 (0)