Skip to content

Commit e1be557

Browse files
authored
Merge branch 'next' into Issue2067
2 parents be8d366 + f42bd8c commit e1be557

20 files changed

+1113
-1010
lines changed

RetailCoder.VBE/Inspections/UnassignedVariableUsageInspection.cs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System.Collections.Generic;
22
using System.Linq;
3+
using Antlr4.Runtime;
4+
using Rubberduck.Parsing;
35
using Rubberduck.Parsing.Symbols;
46
using Rubberduck.Parsing.VBA;
57

@@ -27,10 +29,46 @@ public override IEnumerable<InspectionResultBase> GetInspectionResults()
2729
.SelectMany(declaration => declaration.References)
2830
.Where(usage => !usage.IsInspectionDisabled(AnnotationName));
2931

32+
var lenFunction = BuiltInDeclarations.SingleOrDefault(s => s.Scope == "VBE7.DLL;VBA.Strings.Len");
33+
var lenbFunction = BuiltInDeclarations.SingleOrDefault(s => s.Scope == "VBE7.DLL;VBA.Strings.LenB");
34+
3035
foreach (var issue in usages)
3136
{
32-
yield return new UnassignedVariableUsageInspectionResult(this, issue.Context, issue.QualifiedModuleName, issue.Declaration);
37+
if (DeclarationReferencesContainsReference(lenFunction, issue) ||
38+
DeclarationReferencesContainsReference(lenbFunction, issue))
39+
{
40+
continue;
41+
}
42+
43+
yield return
44+
new UnassignedVariableUsageInspectionResult(this, issue.Context, issue.QualifiedModuleName,
45+
issue.Declaration);
46+
}
47+
}
48+
49+
private bool DeclarationReferencesContainsReference(Declaration parentDeclaration, IdentifierReference issue)
50+
{
51+
if (parentDeclaration == null)
52+
{
53+
return false;
54+
}
55+
56+
var lenUsesIssue = false;
57+
foreach (var reference in parentDeclaration.References)
58+
{
59+
var context = (ParserRuleContext) reference.Context.Parent;
60+
if (context.GetSelection().Contains(issue.Selection))
61+
{
62+
lenUsesIssue = true;
63+
break;
64+
}
65+
}
66+
67+
if (lenUsesIssue)
68+
{
69+
return true;
3370
}
71+
return false;
3472
}
3573
}
3674
}

RetailCoder.VBE/NLog.dll.nlog

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
<target
77
xsi:type="File"
88
name="file"
9-
fileName="${specialfolder:folder=ApplicationData}/Rubberduck/logs/rubberduck.log"
9+
fileName="${specialfolder:folder=ApplicationData}/Rubberduck/Logs/RubberduckLog.txt"
1010
layout="${longdate};${uppercase:${level}};${logger};${message};${exception:format=tostring}"
11-
archiveFileName="${specialfolder:folder=ApplicationData}/Rubberduck/logs/archives/rubberduck.{#}.log"
11+
archiveFileName="${specialfolder:folder=ApplicationData}/Rubberduck/Logs/archives/RubberduckLog.{#}.txt"
1212
archiveAboveSize="5242880"
1313
archiveNumbering="Sequence"
1414
concurrentWrites="true"

RetailCoder.VBE/Navigation/CodeExplorer/CodeExplorerViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,9 @@ public ObservableCollection<CodeExplorerItemViewModel> Projects
228228
get { return _projects; }
229229
set
230230
{
231+
ReorderChildNodes(value);
231232
_projects = new ObservableCollection<CodeExplorerItemViewModel>(value.OrderBy(o => o.NameWithSignature));
232-
233-
ReorderChildNodes(_projects);
233+
234234
OnPropertyChanged();
235235
}
236236
}

RetailCoder.VBE/Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private void MoveCloserToUsage()
110110

111111
private void _state_StateChanged(object sender, ParserStateEventArgs e)
112112
{
113-
if (e.State != ParserState.ResolvedDeclarations) { return; }
113+
if (e.State != ParserState.Ready) { return; }
114114

115115
var newTarget = _state.AllUserDeclarations.FirstOrDefault(
116116
item => item.ComponentName == _target.ComponentName &&
@@ -121,7 +121,7 @@ private void _state_StateChanged(object sender, ParserStateEventArgs e)
121121

122122
if (newTarget != null)
123123
{
124-
UpdateCallsToOtherModule(newTarget.References);
124+
UpdateCallsToOtherModule(newTarget.References.ToList());
125125
RemoveField(newTarget);
126126
}
127127

@@ -273,20 +273,28 @@ private string RemoveExtraComma(string str, int numParams, int indexRemoved)
273273
return str.Remove(str.NthIndexOf(',', commaToRemove), 1);
274274
}
275275

276-
private void UpdateCallsToOtherModule(IEnumerable<IdentifierReference> references)
276+
private void UpdateCallsToOtherModule(List<IdentifierReference> references)
277277
{
278-
var identifierReferences = references.ToList();
278+
if (!references.Any())
279+
{
280+
return;
281+
}
279282

280-
var module = identifierReferences[0].QualifiedModuleName.Component.CodeModule;
283+
var module = references[0].QualifiedModuleName.Component.CodeModule;
281284

282-
foreach (var reference in identifierReferences.OrderByDescending(o => o.Selection.StartLine).ThenByDescending(t => t.Selection.StartColumn))
285+
foreach (var reference in references.OrderByDescending(o => o.Selection.StartLine).ThenByDescending(t => t.Selection.StartColumn))
283286
{
284287
var parent = reference.Context.Parent;
285-
while (!(parent is VBAParser.MemberAccessExprContext))
288+
while (!(parent is VBAParser.MemberAccessExprContext) && parent.Parent != null)
286289
{
287290
parent = parent.Parent;
288291
}
289292

293+
if (!(parent is VBAParser.MemberAccessExprContext))
294+
{
295+
continue;
296+
}
297+
290298
var parentSelection = ((VBAParser.MemberAccessExprContext)parent).GetSelection();
291299

292300
var oldText = module.Lines[parentSelection.StartLine, parentSelection.LineCount];

RetailCoder.VBE/UI/Command/MenuItems/RubberduckCommandBar.cs

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using Microsoft.Office.Core;
33
using Microsoft.Vbe.Interop;
4+
using Rubberduck.Parsing;
45
using Rubberduck.Parsing.Symbols;
56
using Rubberduck.Parsing.VBA;
67
using Rubberduck.Properties;
@@ -13,23 +14,53 @@ public class RubberduckCommandBar : IDisposable
1314
{
1415
private readonly RubberduckParserState _state;
1516
private readonly VBE _vbe;
17+
private readonly ISinks _sinks;
1618
private readonly IShowParserErrorsCommand _command;
1719

1820
private CommandBarButton _refreshButton;
1921
private CommandBarButton _statusButton;
2022
private CommandBarButton _selectionButton;
2123
private CommandBar _commandbar;
2224

23-
public RubberduckCommandBar(RubberduckParserState state, VBE vbe, IShowParserErrorsCommand command)
25+
public RubberduckCommandBar(RubberduckParserState state, VBE vbe, ISinks sinks, IShowParserErrorsCommand command)
2426
{
2527
_state = state;
2628
_vbe = vbe;
29+
_sinks = sinks;
2730
_command = command;
2831
_state.StateChanged += State_StateChanged;
2932
Initialize();
33+
34+
_sinks.ProjectRemoved += ProjectRemoved;
35+
_sinks.ComponentActivated += ComponentActivated;
36+
_sinks.ComponentSelected += ComponentSelected;
3037
}
3138

32-
private void _statusButton_Click(CommandBarButton Ctrl, ref bool CancelDefault)
39+
private void ProjectRemoved(object sender, IProjectEventArgs e)
40+
{
41+
SetSelectionText();
42+
}
43+
44+
private void ComponentActivated(object sender, IComponentEventArgs e)
45+
{
46+
SetSelectionText();
47+
}
48+
49+
private void ComponentSelected(object sender, IComponentEventArgs e)
50+
{
51+
SetSelectionText();
52+
}
53+
54+
private void SetSelectionText()
55+
{
56+
var selectedDeclaration = _vbe.ActiveCodePane != null
57+
? _state.FindSelectedDeclaration(_vbe.ActiveCodePane)
58+
: null;
59+
60+
SetSelectionText(selectedDeclaration);
61+
}
62+
63+
private void _statusButton_Click(CommandBarButton ctrl, ref bool cancelDefault)
3364
{
3465
if (_state.Status == ParserState.Error)
3566
{
@@ -39,7 +70,7 @@ private void _statusButton_Click(CommandBarButton Ctrl, ref bool CancelDefault)
3970

4071
public void SetStatusText(string value = null)
4172
{
42-
var text = value ?? RubberduckUI.ResourceManager.GetString("ParserState_" + _state.Status, UI.Settings.Settings.Culture);
73+
var text = value ?? RubberduckUI.ResourceManager.GetString("ParserState_" + _state.Status, Settings.Settings.Culture);
4374
UiDispatcher.Invoke(() => _statusButton.Caption = text);
4475
}
4576

@@ -51,6 +82,10 @@ public void SetSelectionText(Declaration declaration)
5182
if (selection.HasValue) { SetSelectionText(selection.Value); }
5283
_selectionButton.TooltipText = _selectionButton.Caption;
5384
}
85+
else if (declaration == null && _vbe.ActiveCodePane == null)
86+
{
87+
UiDispatcher.Invoke(() => _selectionButton.Caption = string.Empty);
88+
}
5489
else if (declaration != null && !declaration.IsBuiltIn && declaration.DeclarationType != DeclarationType.ClassModule && declaration.DeclarationType != DeclarationType.ProceduralModule)
5590
{
5691
var typeName = declaration.HasTypeHint
@@ -61,7 +96,7 @@ public void SetSelectionText(Declaration declaration)
6196
declaration.QualifiedSelection.Selection,
6297
declaration.QualifiedName.QualifiedModuleName,
6398
declaration.IdentifierName,
64-
RubberduckUI.ResourceManager.GetString("DeclarationType_" + declaration.DeclarationType, UI.Settings.Settings.Culture),
99+
RubberduckUI.ResourceManager.GetString("DeclarationType_" + declaration.DeclarationType, Settings.Settings.Culture),
65100
string.IsNullOrEmpty(declaration.AsTypeName) ? string.Empty : ": " + typeName);
66101

67102
_selectionButton.TooltipText = string.IsNullOrEmpty(declaration.DescriptionString)
@@ -82,7 +117,7 @@ public void SetSelectionText(Declaration declaration)
82117
selection.Value.Selection,
83118
declaration.QualifiedName.QualifiedModuleName,
84119
declaration.IdentifierName,
85-
RubberduckUI.ResourceManager.GetString("DeclarationType_" + declaration.DeclarationType, UI.Settings.Settings.Culture),
120+
RubberduckUI.ResourceManager.GetString("DeclarationType_" + declaration.DeclarationType, Settings.Settings.Culture),
86121
string.IsNullOrEmpty(declaration.AsTypeName) ? string.Empty : ": " + typeName);
87122
}
88123
_selectionButton.TooltipText = string.IsNullOrEmpty(declaration.DescriptionString)
@@ -100,7 +135,7 @@ private void State_StateChanged(object sender, EventArgs e)
100135
{
101136
if (_state.Status != ParserState.ResolvedDeclarations)
102137
{
103-
SetStatusText(RubberduckUI.ResourceManager.GetString("ParserState_" + _state.Status, UI.Settings.Settings.Culture));
138+
SetStatusText(RubberduckUI.ResourceManager.GetString("ParserState_" + _state.Status, Settings.Settings.Culture));
104139
}
105140
}
106141

@@ -115,7 +150,7 @@ private void OnRefresh()
115150
}
116151
}
117152

118-
public void Initialize()
153+
private void Initialize()
119154
{
120155
_commandbar = _vbe.CommandBars.Add("Rubberduck", MsoBarPosition.msoBarTop, false, true);
121156

@@ -139,7 +174,7 @@ public void Initialize()
139174
_commandbar.Visible = true;
140175
}
141176

142-
private void refreshButton_Click(CommandBarButton Ctrl, ref bool CancelDefault)
177+
private void refreshButton_Click(CommandBarButton ctrl, ref bool cancelDefault)
143178
{
144179
OnRefresh();
145180
}
@@ -154,6 +189,10 @@ public void Dispose()
154189

155190
_state.StateChanged -= State_StateChanged;
156191

192+
_sinks.ProjectRemoved -= ProjectRemoved;
193+
_sinks.ComponentActivated -= ComponentActivated;
194+
_sinks.ComponentSelected -= ComponentSelected;
195+
157196
_refreshButton.Delete();
158197
_selectionButton.Delete();
159198
_statusButton.Delete();

RetailCoder.VBE/UI/RegexAssistant/RegexAssistant.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
<TextBox HorizontalAlignment="Stretch"
7171
VerticalAlignment="Top" Height="23"
7272
VerticalContentAlignment="Center" Margin="5"
73-
Text="{Binding Pattern}"/>
73+
Text="{Binding Pattern, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
7474

7575
<StackPanel Orientation="Horizontal" Margin="5,0,5,0">
7676
<CheckBox Content="{Resx ResxName=Rubberduck.UI.RubberduckUI, Key=RegexAssistant_GlobalFlag}"

RetailCoder.VBE/UI/RubberduckUI.Designer.cs

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

RetailCoder.VBE/UI/RubberduckUI.resx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1716,7 +1716,7 @@ All our stargazers, likers &amp; followers, for the warm fuzzies
17161716
<value>Publish Existing Repository</value>
17171717
</data>
17181718
<data name="RubberduckFatalError" xml:space="preserve">
1719-
<value>Rubberduck encountered an error. Please save your work and restart the host program, then upload your log file to our GitHub page.</value>
1719+
<value>Rubberduck encountered an error. Please save your work and restart the host program, then upload your log file located at "C:\Users\{username}\AppData\Roaming\Rubberduck\Logs\RubberduckLog.txt" to a GitHub issue at "https://github.com/rubberduck-vba/Rubberduck/issues/new".</value>
17201720
</data>
17211721
<data name="TestExplorerMenu_AddExpectedErrorTestMethod" xml:space="preserve">
17221722
<value>Test Method (&amp;Expected Error)</value>

Rubberduck.Parsing/VBA/RubberduckParser.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,20 @@ private readonly IDictionary<VBComponent, IDictionary<Tuple<string, DeclarationT
3232
private readonly IEnumerable<ICustomDeclarationLoader> _customDeclarationLoaders;
3333
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
3434

35+
private readonly bool _isTestScope;
36+
3537
public RubberduckParser(
3638
RubberduckParserState state,
3739
IAttributeParser attributeParser,
3840
Func<IVBAPreprocessor> preprocessorFactory,
39-
IEnumerable<ICustomDeclarationLoader> customDeclarationLoaders)
41+
IEnumerable<ICustomDeclarationLoader> customDeclarationLoaders,
42+
bool isTestScope = false)
4043
{
4144
_state = state;
4245
_attributeParser = attributeParser;
4346
_preprocessorFactory = preprocessorFactory;
4447
_customDeclarationLoaders = customDeclarationLoaders;
48+
_isTestScope = isTestScope;
4549

4650
state.ParseRequest += ReparseRequested;
4751
}
@@ -53,8 +57,15 @@ public RubberduckParser(
5357

5458
private void ReparseRequested(object sender, EventArgs e)
5559
{
56-
Cancel();
57-
Task.Run(() => ParseAll(_cancellationTokens[0]));
60+
if (!_isTestScope)
61+
{
62+
Cancel();
63+
Task.Run(() => ParseAll(_cancellationTokens[0]));
64+
}
65+
else
66+
{
67+
Parse(_cancellationTokens[0]);
68+
}
5869
}
5970

6071
/// <summary>

0 commit comments

Comments
 (0)