Skip to content

Commit c48d841

Browse files
author
Andrin Meier
committed
Merge branch 'next' of https://github.com/rubberduck-vba/Rubberduck into next
2 parents 37c6fc8 + 2e5f26c commit c48d841

File tree

402 files changed

+10943
-3475
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

402 files changed

+10943
-3475
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ If you like this project and would like to thank its contributors, you are welco
3737

3838
Rubberduck is a COM add-in for the VBA IDE (VBE).
3939

40-
Copyright (C) 2014-2018 Mathieu Guindon & Christopher McClellan
40+
Copyright (C) 2014-2018 Rubberduck project contributors
4141

4242
This program is free software: you can redistribute it and/or modify
4343
it under the terms of the GNU General Public License as published by

Rubberduck.API/VBA/Parser.cs

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,27 @@
44
using System.Globalization;
55
using System.Linq;
66
using System.Runtime.InteropServices;
7+
using System.Threading;
78
using Rubberduck.Common;
89
using Rubberduck.Parsing.PreProcessing;
10+
using Rubberduck.Parsing.Rewriter;
911
using Rubberduck.Parsing.Symbols.DeclarationLoaders;
1012
using Rubberduck.Parsing.VBA;
1113
using Rubberduck.Parsing.Symbols;
14+
using Rubberduck.Parsing.Symbols.ParsingExceptions;
1215
using Rubberduck.Parsing.UIContext;
16+
using Rubberduck.Parsing.VBA.ComReferenceLoading;
17+
using Rubberduck.Parsing.VBA.DeclarationResolving;
18+
using Rubberduck.Parsing.VBA.Parsing;
19+
using Rubberduck.Parsing.VBA.ReferenceManagement;
1320
using Rubberduck.Resources.Registration;
1421
using Rubberduck.VBEditor.ComManagement;
1522
using Rubberduck.VBEditor.Events;
1623
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
1724
using Rubberduck.VBEditor.Utility;
1825
using Rubberduck.Root;
26+
using Rubberduck.VBEditor.ComManagement.TypeLibs;
27+
using Rubberduck.VBEditor.SourceCodeHandling;
1928

2029
namespace Rubberduck.API.VBA
2130
{
@@ -59,16 +68,17 @@ public interface IParserEvents
5968
public sealed class Parser : IParser, IDisposable
6069
{
6170
private RubberduckParserState _state;
62-
private AttributeParser _attributeParser;
63-
private ParseCoordinator _parser;
71+
private SynchronousParseCoordinator _parser;
6472
private IVBE _vbe;
6573
private IVBEEvents _vbeEvents;
6674
private readonly IUiDispatcher _dispatcher;
75+
private readonly CancellationTokenSource _tokenSource;
6776

6877
internal Parser()
6978
{
7079
UiContextProvider.Initialize();
7180
_dispatcher = new UiDispatcher(UiContextProvider.Instance());
81+
_tokenSource = new CancellationTokenSource();
7282
}
7383

7484
// vbe is the com coclass interface from the interop assembly.
@@ -87,10 +97,20 @@ internal Parser(object vbe) : this()
8797
_state = new RubberduckParserState(_vbe, projectRepository, declarationFinderFactory, _vbeEvents);
8898
_state.StateChanged += _state_StateChanged;
8999

90-
var sourceCodeHandler = _vbe.SourceCodeHandler;
91-
92-
IVBAPreprocessor preprocessorFactory() => new VBAPreprocessor(double.Parse(_vbe.Version, CultureInfo.InvariantCulture));
93-
_attributeParser = new AttributeParser(sourceCodeHandler, preprocessorFactory, _state.ProjectsProvider);
100+
var sourceFileHandler = _vbe.TempSourceFileHandler;
101+
var vbeVersion = double.Parse(_vbe.Version, CultureInfo.InvariantCulture);
102+
var predefinedCompilationConstants = new VBAPredefinedCompilationConstants(vbeVersion);
103+
var typeLibProvider = new TypeLibWrapperProvider(projectRepository);
104+
var compilationArgumentsProvider = new CompilationArgumentsProvider(typeLibProvider, _dispatcher, predefinedCompilationConstants);
105+
var compilationsArgumentsCache = new CompilationArgumentsCache(compilationArgumentsProvider);
106+
var preprocessorErrorListenerFactory = new PreprocessingParseErrorListenerFactory();
107+
var preprocessorParser = new VBAPreprocessorParser(preprocessorErrorListenerFactory, preprocessorErrorListenerFactory);
108+
var preprocessor = new VBAPreprocessor(preprocessorParser, compilationsArgumentsCache);
109+
var mainParseErrorListenerFactory = new MainParseErrorListenerFactory();
110+
var mainTokenStreamParser = new VBATokenStreamParser(mainParseErrorListenerFactory, mainParseErrorListenerFactory);
111+
var tokenStreamProvider = new SimpleVBAModuleTokenStreamProvider();
112+
var stringParser = new TokenStreamParserStringParserAdapterWithPreprocessing(tokenStreamProvider, mainTokenStreamParser, preprocessor);
113+
var attributesSourceCodeHandler = new SourceFileHandlerSourceCodeHandlerAdapter(sourceFileHandler, projectRepository);
94114
var projectManager = new RepositoryProjectManager(projectRepository);
95115
var moduleToModuleReferenceManager = new ModuleToModuleReferenceManager();
96116
var parserStateManager = new ParserStateManager(_state);
@@ -108,12 +128,19 @@ internal Parser(object vbe) : this()
108128
//new RubberduckApiDeclarations(_state)
109129
}
110130
);
131+
var codePaneSourceCodeHandler = new CodePaneSourceCodeHandler(projectRepository);
132+
var moduleRewriterFactory = new ModuleRewriterFactory(
133+
codePaneSourceCodeHandler,
134+
attributesSourceCodeHandler);
135+
var moduleParser = new ModuleParser(
136+
codePaneSourceCodeHandler,
137+
attributesSourceCodeHandler,
138+
stringParser,
139+
moduleRewriterFactory);
111140
var parseRunner = new ParseRunner(
112141
_state,
113142
parserStateManager,
114-
preprocessorFactory,
115-
_attributeParser,
116-
sourceCodeHandler);
143+
moduleParser);
117144
var declarationResolveRunner = new DeclarationResolveRunner(
118145
_state,
119146
parserStateManager,
@@ -134,25 +161,25 @@ internal Parser(object vbe) : this()
134161
_state,
135162
moduleToModuleReferenceManager,
136163
referenceRemover,
137-
supertypeClearer
164+
supertypeClearer,
165+
compilationsArgumentsCache
138166
);
139167

140-
_parser = new ParseCoordinator(
168+
_parser = new SynchronousParseCoordinator(
141169
_state,
142170
parsingStageService,
143171
parsingCacheService,
144172
projectManager,
145173
parserStateManager
146174
);
147175
}
148-
176+
149177
/// <summary>
150178
/// Blocking call, for easier unit-test code
151179
/// </summary>
152180
public void Parse()
153181
{
154-
// blocking call
155-
_parser.Parse(new System.Threading.CancellationTokenSource());
182+
_parser.Parse(_tokenSource);
156183
}
157184

158185
/// <summary>
@@ -163,7 +190,7 @@ public void BeginParse()
163190
// non-blocking call
164191
_dispatcher.Invoke(() => _state.OnParseRequested(this));
165192
}
166-
193+
167194
public delegate void OnStateChangedDelegate(ParserState ParserState);
168195
public event OnStateChangedDelegate OnStateChanged;
169196

Rubberduck.CodeAnalysis/Inspections/Abstract/ParseTreeInspectionBase.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Rubberduck.Parsing.Inspections.Abstract;
22
using Rubberduck.Parsing.VBA;
3+
using Rubberduck.Parsing.VBA.Parsing;
34

45
namespace Rubberduck.Inspections.Abstract
56
{
@@ -9,6 +10,6 @@ protected ParseTreeInspectionBase(RubberduckParserState state)
910
: base(state) { }
1011

1112
public abstract IInspectionListener Listener { get; }
12-
public virtual ParsePass Pass => ParsePass.CodePanePass;
13+
public virtual CodeKind TargetKindOfCode => CodeKind.CodePaneCode;
1314
}
1415
}

Rubberduck.CodeAnalysis/Inspections/Abstract/QuickFixBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using NLog;
55
using Rubberduck.Parsing.Inspections.Abstract;
66
using Rubberduck.Parsing.VBA;
7+
using Rubberduck.Parsing.VBA.Extensions;
78

89
namespace Rubberduck.Inspections.Abstract
910
{

Rubberduck.CodeAnalysis/Inspections/Concrete/EmptyModuleInspection.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Rubberduck.Resources.Inspections;
88
using Rubberduck.Parsing.Symbols;
99
using Rubberduck.Parsing.VBA;
10+
using Rubberduck.Parsing.VBA.Extensions;
1011
using Rubberduck.VBEditor.SafeComWrappers;
1112

1213
namespace Rubberduck.Inspections.Concrete

Rubberduck.CodeAnalysis/Inspections/Concrete/IllegalAnnotationInspection.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ public void ClearContexts()
8585
private void SetCurrentScope(string memberName = null)
8686
{
8787
_hasMembers = !string.IsNullOrEmpty(memberName);
88-
_isFirstMemberProcessed = _hasMembers;
88+
// this is a one-time toggle until contexts are reset
89+
_isFirstMemberProcessed |= _hasMembers;
8990
_currentScopeDeclaration = _hasMembers ? _members.Value[memberName] : _module.Value;
9091
}
9192

@@ -108,6 +109,9 @@ public override void EnterModule(VBAParser.ModuleContext context)
108109
.Members(CurrentModuleName)
109110
.GroupBy(m => m.IdentifierName)
110111
.ToDictionary(m => m.Key, m => m.First()));
112+
113+
// we did not process the first member of the module we just entered, so reset here
114+
_isFirstMemberProcessed = false;
111115
}
112116

113117
public override void ExitModule(VBAParser.ModuleContext context)
@@ -163,7 +167,7 @@ public override void EnterPropertySetStmt(VBAParser.PropertySetStmtContext conte
163167
public override void ExitAnnotation(VBAParser.AnnotationContext context)
164168
{
165169
var name = Identifier.GetName(context.annotationName().unrestrictedIdentifier());
166-
var annotationType = (AnnotationType) Enum.Parse(typeof (AnnotationType), name);
170+
var annotationType = (AnnotationType) Enum.Parse(typeof (AnnotationType), name, true);
167171
var key = Tuple.Create(_currentModuleName, annotationType);
168172
_annotationCounts[key]++;
169173

Rubberduck.CodeAnalysis/Inspections/Concrete/ImplicitByRefModifierInspection.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Rubberduck.Parsing.Inspections.Abstract;
1010
using Rubberduck.Resources.Inspections;
1111
using Rubberduck.Parsing.VBA;
12+
using Rubberduck.Parsing.VBA.Extensions;
1213
using Rubberduck.VBEditor;
1314

1415
namespace Rubberduck.Inspections.Concrete

Rubberduck.CodeAnalysis/Inspections/Concrete/IntegerDataTypeInspection.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Rubberduck.Parsing.Inspections.Abstract;
99
using Rubberduck.Parsing.Symbols;
1010
using Rubberduck.Parsing.VBA;
11+
using Rubberduck.Parsing.VBA.Extensions;
1112
using Rubberduck.Resources;
1213

1314
namespace Rubberduck.Inspections.Concrete

Rubberduck.CodeAnalysis/Inspections/Concrete/MemberNotOnInterfaceInspection.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Linq;
33
using Rubberduck.Inspections.Abstract;
44
using Rubberduck.Inspections.Results;
5+
using Rubberduck.Parsing.Grammar;
56
using Rubberduck.Parsing.Inspections.Abstract;
67
using Rubberduck.Resources.Inspections;
78
using Rubberduck.Parsing.Symbols;
@@ -23,12 +24,19 @@ protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
2324
decl.AsTypeDeclaration.DeclarationType.HasFlag(DeclarationType.ClassModule) &&
2425
((ClassModuleDeclaration)decl.AsTypeDeclaration).IsExtensible)
2526
.SelectMany(decl => decl.References).ToList();
26-
return from access in unresolved
27-
let callingContext = targets.FirstOrDefault(usage => usage.Context.Equals(access.CallingContext))
28-
where callingContext != null
29-
select new DeclarationInspectionResult(this,
30-
string.Format(InspectionResults.MemberNotOnInterfaceInspection, access.IdentifierName, callingContext.Declaration.AsTypeDeclaration.IdentifierName),
31-
access);
27+
return unresolved
28+
.Select(access => new
29+
{
30+
access,
31+
callingContext = targets.FirstOrDefault(usage => usage.Context.Equals(access.CallingContext)
32+
|| (access.CallingContext is VBAParser.NewExprContext &&
33+
usage.Context.Parent.Parent.Equals(access.CallingContext))
34+
)
35+
})
36+
.Where(memberAccess => memberAccess.callingContext != null)
37+
.Select(memberAccess => new DeclarationInspectionResult(this,
38+
string.Format(InspectionResults.MemberNotOnInterfaceInspection, memberAccess.access.IdentifierName,
39+
memberAccess.callingContext.Declaration.AsTypeDeclaration.IdentifierName), memberAccess.access));
3240
}
3341
}
3442
}

Rubberduck.CodeAnalysis/Inspections/Concrete/MissingAnnotationArgumentInspection.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Rubberduck.Parsing.Inspections.Abstract;
1010
using Rubberduck.Resources.Inspections;
1111
using Rubberduck.Parsing.VBA;
12+
using Rubberduck.Parsing.VBA.Parsing;
1213
using Rubberduck.VBEditor;
1314

1415
namespace Rubberduck.Inspections.Concrete
@@ -18,7 +19,7 @@ public sealed class MissingAnnotationArgumentInspection : ParseTreeInspectionBas
1819
public MissingAnnotationArgumentInspection(RubberduckParserState state)
1920
: base(state) { }
2021

21-
public override ParsePass Pass => ParsePass.AttributesPass;
22+
public override CodeKind TargetKindOfCode => CodeKind.AttributesCode;
2223

2324
public override IInspectionListener Listener { get; } =
2425
new InvalidAnnotationStatementListener();

0 commit comments

Comments
 (0)