Skip to content

Commit af1dfcc

Browse files
authored
Merge pull request #1976 from Hosch250/resolverPerformance
Improve performance by 66%
2 parents d468fbc + b0917bc commit af1dfcc

15 files changed

+74
-183
lines changed

RetailCoder.VBE/App.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ public void Startup()
141141
_hooks.HookHotkeys(); // need to hook hotkeys before we localize menus, to correctly display ShortcutTexts
142142
_appMenus.Localize();
143143
UpdateLoggingLevel();
144+
145+
if (_vbe.VBProjects.Count != 0)
146+
{
147+
_parser.State.OnParseRequested(this);
148+
}
144149
}
145150

146151
public void Shutdown()

RetailCoder.VBE/Inspections/IInspector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Rubberduck.Inspections
88
{
99
public interface IInspector
1010
{
11-
Task<IEnumerable<ICodeInspectionResult>> FindIssuesAsync(RubberduckParserState state, CancellationToken token);
11+
List<ICodeInspectionResult> FindIssuesAsync(RubberduckParserState state, CancellationToken token);
1212
}
1313

1414
public class InspectorIssuesFoundEventArg : EventArgs

RetailCoder.VBE/Inspections/ImplicitByRefParameterInspection.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,17 @@ public ImplicitByRefParameterInspection(RubberduckParserState state)
2121

2222
public override IEnumerable<InspectionResultBase> GetInspectionResults()
2323
{
24-
var interfaceMembers = UserDeclarations.FindInterfaceImplementationMembers();
24+
var interfaceMembersScope = UserDeclarations.FindInterfaceImplementationMembers().Select(m => m.Scope);
25+
var builtinEventHandlers = State.AllDeclarations.FindBuiltInEventHandlers();
2526

2627
var issues = (from item in UserDeclarations
2728
where
2829
!item.IsInspectionDisabled(AnnotationName)
2930
&& item.DeclarationType == DeclarationType.Parameter
3031
// ParamArray parameters do not allow an explicit "ByRef" parameter mechanism.
3132
&& !((ParameterDeclaration)item).IsParamArray
32-
&& !interfaceMembers.Select(m => m.Scope).Contains(item.ParentScope)
33-
&& !State.AllDeclarations.FindBuiltInEventHandlers().Contains(item.ParentDeclaration)
33+
&& !interfaceMembersScope.Contains(item.ParentScope)
34+
&& !builtinEventHandlers.Contains(item.ParentDeclaration)
3435
let arg = item.Context as VBAParser.ArgContext
3536
where arg != null && arg.BYREF() == null && arg.BYVAL() == null
3637
select new QualifiedContext<VBAParser.ArgContext>(item.QualifiedName, arg))

RetailCoder.VBE/Inspections/InspectionResultBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public int CompareTo(object obj)
121121
public object[] ToArray()
122122
{
123123
var module = QualifiedSelection.QualifiedName;
124-
return new object[] { Inspection.Severity.ToString(), module.ProjectTitle, module.ComponentTitle, Description, QualifiedSelection.Selection.StartLine, QualifiedSelection.Selection.StartColumn };
124+
return new object[] { Inspection.Severity.ToString(), module.ProjectTitle, module.ComponentName, Description, QualifiedSelection.Selection.StartLine, QualifiedSelection.Selection.StartColumn };
125125
}
126126

127127
public string ToCsvString()

RetailCoder.VBE/Inspections/Inspector.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,11 @@ private void UpdateInspectionSeverity()
4848
}
4949
}
5050

51-
public async Task<IEnumerable<ICodeInspectionResult>> FindIssuesAsync(RubberduckParserState state, CancellationToken token)
51+
public List<ICodeInspectionResult> FindIssuesAsync(RubberduckParserState state, CancellationToken token)
5252
{
5353
if (state == null || !state.AllUserDeclarations.Any())
5454
{
55-
return new ICodeInspectionResult[] { };
55+
return new List<ICodeInspectionResult>();
5656
}
5757

5858
state.OnStatusMessageUpdate(RubberduckUI.CodeInspections_Inspecting);
@@ -78,11 +78,11 @@ public async Task<IEnumerable<ICodeInspectionResult>> FindIssuesAsync(Rubberduck
7878
{
7979
allIssues.Add(inspectionResult);
8080
}
81-
})).ToList();
81+
}, token)).ToArray();
8282

83-
await Task.WhenAll(inspections);
83+
Task.WaitAll(inspections);
8484
state.OnStatusMessageUpdate(RubberduckUI.ResourceManager.GetString("ParserState_" + state.Status, UI.Settings.Settings.Culture)); // should be "Ready"
85-
return allIssues;
85+
return allIssues.ToList();
8686
}
8787

8888
private ParseTreeResults GetParseTreeResults(RubberduckParserState state)

RetailCoder.VBE/Inspections/SelfAssignedDeclarationInspection.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
3939
&& declaration.IsTypeSpecified
4040
&& !ValueTypes.Contains(declaration.AsTypeName)
4141
&& declaration.DeclarationType == DeclarationType.Variable
42-
&& declaration.AsTypeDeclaration.DeclarationType != DeclarationType.UserDefinedType
42+
&& (declaration.AsTypeDeclaration == null
43+
|| declaration.AsTypeDeclaration.DeclarationType != DeclarationType.UserDefinedType)
4344
&& declaration.ParentScopeDeclaration != null
4445
&& declaration.ParentScopeDeclaration.DeclarationType.HasFlag(DeclarationType.Member))
4546
.Select(issue => new SelfAssignedDeclarationInspectionResult(this, issue));

RetailCoder.VBE/UI/Inspections/InspectionResultsViewModel.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Collections.ObjectModel;
4+
using System.Diagnostics;
45
using System.Globalization;
56
using System.IO;
67
using System.Linq;
@@ -258,11 +259,12 @@ private void _state_StateChanged(object sender, EventArgs e)
258259
RefreshInspections();
259260
}
260261

261-
private async void RefreshInspections()
262+
private void RefreshInspections()
262263
{
264+
var stopwatch = Stopwatch.StartNew();
263265
IsBusy = true;
264266

265-
var results = (await _inspector.FindIssuesAsync(_state, CancellationToken.None)).ToList();
267+
var results = _inspector.FindIssuesAsync(_state, CancellationToken.None);
266268
if (GroupByInspectionType)
267269
{
268270
results = results.OrderBy(o => o.Inspection.InspectionType)
@@ -289,6 +291,9 @@ private async void RefreshInspections()
289291
IsBusy = false;
290292
SelectedItem = null;
291293
});
294+
295+
stopwatch.Stop();
296+
LogManager.GetCurrentClassLogger().Trace("Inspections loaded in {0}ms", stopwatch.ElapsedMilliseconds);
292297
}
293298

294299
private void ExecuteQuickFixes(IEnumerable<CodeInspectionQuickFix> quickFixes)

RetailCoder.VBE/UnitTesting/TestMethod.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ public NavigateCodeEventArgs GetNavigationArgs()
109109

110110
public object[] ToArray()
111111
{
112-
return new object[] { Declaration.QualifiedName.QualifiedModuleName.ProjectTitle, Declaration.QualifiedName.QualifiedModuleName.ComponentTitle, Declaration.IdentifierName,
112+
return new object[] { Declaration.QualifiedName.QualifiedModuleName.ProjectTitle, Declaration.QualifiedName.QualifiedModuleName.ComponentName, Declaration.IdentifierName,
113113
_result.Outcome.ToString(), _result.Output, _result.StartTime.ToString(CultureInfo.InvariantCulture), _result.EndTime.ToString(CultureInfo.InvariantCulture), _result.Duration };
114114
}
115115

Rubberduck.Parsing/VBA/RubberduckParser.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,11 @@ private void ParseAll(CancellationTokenSource token)
319319

320320
private Task[] ResolveReferencesAsync(CancellationToken token)
321321
{
322+
foreach (var kvp in State.ParseTrees)
323+
{
324+
State.SetModuleState(kvp.Key.Component, ParserState.ResolvingReferences);
325+
}
326+
322327
var finder = new DeclarationFinder(State.AllDeclarations, State.AllComments, State.AllAnnotations);
323328
var passes = new List<ICompilationPass>
324329
{

Rubberduck.Parsing/VBA/RubberduckParserState.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,10 @@ private ParserState EvaluateParserState()
432432
}
433433
}
434434

435+
if (stateCounts[(int)ParserState.Pending] > 0)
436+
{
437+
result = ParserState.Pending;
438+
}
435439
if (stateCounts[(int)ParserState.Parsing] > 0)
436440
{
437441
result = ParserState.Parsing;

0 commit comments

Comments
 (0)