Skip to content

Commit 36228ac

Browse files
committed
Merge remote-tracking branch 'upstream/next' into rkapka-master
2 parents fb07dc4 + e6a517e commit 36228ac

19 files changed

+1110
-108
lines changed

Rubberduck.Core/UI/Settings/IndenterSettings.xaml

Lines changed: 45 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
<UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
2-
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3-
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
4-
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5-
xmlns:settings="clr-namespace:Rubberduck.UI.Settings"
6-
xmlns:converters="clr-namespace:Rubberduck.UI.Settings.Converters"
7-
xmlns:controls="clr-namespace:Rubberduck.UI.Controls"
8-
xmlns:core="clr-namespace:System;assembly=mscorlib"
9-
xmlns:smartIndenter="clr-namespace:Rubberduck.SmartIndenter;assembly=Rubberduck.SmartIndenter"
10-
xmlns:avalonedit="http://icsharpcode.net/sharpdevelop/avalonedit"
11-
x:Class="Rubberduck.UI.Settings.IndenterSettings">
2+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3+
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
4+
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5+
xmlns:converters="clr-namespace:Rubberduck.UI.Settings.Converters"
6+
xmlns:controls="clr-namespace:Rubberduck.UI.Controls"
7+
xmlns:core="clr-namespace:System;assembly=mscorlib"
8+
xmlns:smartIndenter="clr-namespace:Rubberduck.SmartIndenter;assembly=Rubberduck.SmartIndenter"
9+
xmlns:avalonedit="http://icsharpcode.net/sharpdevelop/avalonedit"
10+
x:Class="Rubberduck.UI.Settings.IndenterSettings">
1211
<UserControl.Resources>
1312
<converters:EndOfLineCommentStyleToVisibilityConverter x:Key="EndOfLineCommentStyleToVisibility"/>
1413
<converters:EndOfLineCommentStyleToTextConverter x:Key="LocalizedEndOfLineCommentStyles"/>
@@ -30,7 +29,7 @@
3029
<Style>
3130
<Style.Resources>
3231
<Style TargetType="{x:Type Border}">
33-
<Setter Property="Border.CornerRadius" Value="5"/>
32+
<Setter Property="CornerRadius" Value="5"/>
3433
</Style>
3534
</Style.Resources>
3635
</Style>
@@ -116,6 +115,16 @@
116115
</AccessText.Text>
117116
</AccessText>
118117
</CheckBox>
118+
<CheckBox Margin="25,0,0,5"
119+
HorizontalAlignment="Left"
120+
IsEnabled="{Binding ElementName=IndentProcedureCheckBox,Path=IsChecked}"
121+
IsChecked="{Binding IgnoreEmptyLinesInFirstBlocks,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
122+
<AccessText TextWrapping="WrapWithOverflow">
123+
<AccessText.Text>
124+
<Resx ResxName="Rubberduck.Resources.RubberduckUI" Key="IndenterSettings_IgnoreEmptyLinesInFirstBlocks"/>
125+
</AccessText.Text>
126+
</AccessText>
127+
</CheckBox>
119128
<CheckBox Margin="5,0,0,5"
120129
HorizontalAlignment="Left"
121130
IsChecked="{Binding IndentEnumTypeAsProcedure,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
@@ -248,6 +257,7 @@
248257
</Expander.Header>
249258
<StackPanel Margin="75,5,0,5">
250259
<CheckBox Margin="5,0,0,5"
260+
Name="ForceDebugStatementsInColumn1"
251261
HorizontalAlignment="Left"
252262
IsChecked="{Binding ForceDebugStatementsInColumn1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
253263
<AccessText TextWrapping="WrapWithOverflow">
@@ -256,6 +266,30 @@
256266
</AccessText.Text>
257267
</AccessText>
258268
</CheckBox>
269+
<CheckBox Margin="25,0,0,5"
270+
HorizontalAlignment="Left"
271+
IsChecked="{Binding ForceDebugPrintInColumn1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
272+
IsEnabled="{Binding ElementName=ForceDebugStatementsInColumn1,Path=IsChecked}">
273+
<AccessText TextWrapping="WrapWithOverflow">
274+
<AccessText.Text>Debug.Print</AccessText.Text>
275+
</AccessText>
276+
</CheckBox>
277+
<CheckBox Margin="25,0,0,5"
278+
HorizontalAlignment="Left"
279+
IsChecked="{Binding ForceDebugAssertInColumn1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
280+
IsEnabled="{Binding ElementName=ForceDebugStatementsInColumn1,Path=IsChecked}">
281+
<AccessText TextWrapping="WrapWithOverflow">
282+
<AccessText.Text>Debug.Assert</AccessText.Text>
283+
</AccessText>
284+
</CheckBox>
285+
<CheckBox Margin="25,0,0,5"
286+
HorizontalAlignment="Left"
287+
IsChecked="{Binding ForceStopInColumn1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
288+
IsEnabled="{Binding ElementName=ForceDebugStatementsInColumn1,Path=IsChecked}">
289+
<AccessText TextWrapping="WrapWithOverflow">
290+
<AccessText.Text>Stop</AccessText.Text>
291+
</AccessText>
292+
</CheckBox>
259293
<CheckBox Margin="5,0,0,5"
260294
HorizontalAlignment="Left"
261295
IsChecked="{Binding ForceCompilerDirectivesInColumn1,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">

Rubberduck.Core/UI/Settings/IndenterSettingsViewModel.cs

Lines changed: 93 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,17 @@ public IndenterSettingsViewModel(Configuration config)
2121
_endOfLineCommentStyle = config.UserSettings.IndenterSettings.EndOfLineCommentStyle;
2222
_forceCompilerDirectivesInColumn1 = config.UserSettings.IndenterSettings.ForceCompilerDirectivesInColumn1;
2323
_forceDebugStatementsInColumn1 = config.UserSettings.IndenterSettings.ForceDebugStatementsInColumn1;
24+
_forceDebugPrintInColumn1 = config.UserSettings.IndenterSettings.ForceDebugPrintInColumn1;
25+
_forceDebugAssertInColumn1 = config.UserSettings.IndenterSettings.ForceDebugAssertInColumn1;
26+
_forceStopInColumn1 = config.UserSettings.IndenterSettings.ForceStopInColumn1;
2427
_ignoreOperatorsInContinuations = config.UserSettings.IndenterSettings.IgnoreOperatorsInContinuations;
2528
_indentCase = config.UserSettings.IndenterSettings.IndentCase;
2629
_indentCompilerDirectives = config.UserSettings.IndenterSettings.IndentCompilerDirectives;
2730
_indentEnumTypeAsProcedure = config.UserSettings.IndenterSettings.IndentEnumTypeAsProcedure;
2831
_indentEntireProcedureBody = config.UserSettings.IndenterSettings.IndentEntireProcedureBody;
2932
_indentFirstCommentBlock = config.UserSettings.IndenterSettings.IndentFirstCommentBlock;
3033
_indentFirstDeclarationBlock = config.UserSettings.IndenterSettings.IndentFirstDeclarationBlock;
34+
_ignoreEmptyLinesInFirstBlocks = config.UserSettings.IndenterSettings.IgnoreEmptyLinesInFirstBlocks;
3135
_indentSpaces = config.UserSettings.IndenterSettings.IndentSpaces;
3236
_spaceProcedures = config.UserSettings.IndenterSettings.VerticallySpaceProcedures;
3337
_procedureSpacing = config.UserSettings.IndenterSettings.LinesBetweenProcedures;
@@ -169,11 +173,69 @@ public bool ForceDebugStatementsInColumn1
169173
{
170174
if (_forceDebugStatementsInColumn1 != value)
171175
{
172-
_forceDebugStatementsInColumn1 = value;OnPropertyChanged();
176+
_forceDebugStatementsInColumn1 = value;
177+
ForceDebugPrintInColumn1 = _forceDebugStatementsInColumn1;
178+
ForceDebugAssertInColumn1 = _forceDebugStatementsInColumn1;
179+
ForceStopInColumn1 = _forceDebugStatementsInColumn1;
180+
OnPropertyChanged();
181+
}
182+
}
183+
}
184+
185+
private bool _forceDebugPrintInColumn1;
186+
public bool ForceDebugPrintInColumn1
187+
{
188+
get => _forceDebugPrintInColumn1;
189+
set
190+
{
191+
if (_forceDebugPrintInColumn1 != value)
192+
{
193+
_forceDebugPrintInColumn1 = value;
194+
if (!_forceDebugPrintInColumn1 && !_forceDebugAssertInColumn1 && !_forceStopInColumn1)
195+
{
196+
ForceDebugStatementsInColumn1 = false;
197+
}
198+
OnPropertyChanged();
199+
}
200+
}
201+
}
202+
203+
private bool _forceDebugAssertInColumn1;
204+
public bool ForceDebugAssertInColumn1
205+
{
206+
get => _forceDebugAssertInColumn1;
207+
set
208+
{
209+
if (_forceDebugAssertInColumn1 != value)
210+
{
211+
_forceDebugAssertInColumn1 = value;
212+
if (!_forceDebugPrintInColumn1 && !_forceDebugAssertInColumn1 && !_forceStopInColumn1)
213+
{
214+
ForceDebugStatementsInColumn1 = false;
215+
}
216+
OnPropertyChanged();
173217
}
174218
}
175219
}
176220

221+
private bool _forceStopInColumn1;
222+
public bool ForceStopInColumn1
223+
{
224+
get => _forceStopInColumn1;
225+
set
226+
{
227+
if (_forceStopInColumn1 != value)
228+
{
229+
_forceStopInColumn1 = value;
230+
if (!_forceDebugPrintInColumn1 && !_forceDebugAssertInColumn1 && !_forceStopInColumn1)
231+
{
232+
ForceDebugStatementsInColumn1 = false;
233+
}
234+
OnPropertyChanged();
235+
}
236+
}
237+
}
238+
177239
private bool _ignoreOperatorsInContinuations;
178240
public bool IgnoreOperatorsInContinuations
179241
{
@@ -258,6 +320,20 @@ public bool IndentFirstDeclarationBlock
258320
}
259321
}
260322

323+
private bool _ignoreEmptyLinesInFirstBlocks;
324+
public bool IgnoreEmptyLinesInFirstBlocks
325+
{
326+
get => _ignoreEmptyLinesInFirstBlocks;
327+
set
328+
{
329+
if (_ignoreEmptyLinesInFirstBlocks != value)
330+
{
331+
_ignoreEmptyLinesInFirstBlocks = value;
332+
OnPropertyChanged();
333+
}
334+
}
335+
}
336+
261337
private int _indentSpaces;
262338
public int IndentSpaces
263339
{
@@ -300,7 +376,7 @@ public int LinesBetweenProcedures
300376
}
301377
}
302378

303-
public string PreviewSampleCode
379+
public string PreviewSampleCode
304380
{
305381
get
306382
{
@@ -314,7 +390,7 @@ public string PreviewSampleCode
314390

315391
private IIndenterSettings GetCurrentSettings()
316392
{
317-
return new SmartIndenter.IndenterSettings
393+
return new SmartIndenter.IndenterSettings(false)
318394
{
319395
AlignCommentsWithCode = AlignCommentsWithCode,
320396
AlignContinuations = AlignContinuations,
@@ -324,13 +400,17 @@ private IIndenterSettings GetCurrentSettings()
324400
EndOfLineCommentStyle = EndOfLineCommentStyle,
325401
ForceCompilerDirectivesInColumn1 = ForceCompilerDirectivesInColumn1,
326402
ForceDebugStatementsInColumn1 = ForceDebugStatementsInColumn1,
403+
ForceDebugPrintInColumn1 = ForceDebugPrintInColumn1,
404+
ForceDebugAssertInColumn1 = ForceDebugAssertInColumn1,
405+
ForceStopInColumn1 = ForceStopInColumn1,
327406
IgnoreOperatorsInContinuations = IgnoreOperatorsInContinuations,
328407
IndentCase = IndentCase,
329408
IndentCompilerDirectives = IndentCompilerDirectives,
330409
IndentEnumTypeAsProcedure = IndentEnumTypeAsProcedure,
331410
IndentEntireProcedureBody = IndentEntireProcedureBody,
332411
IndentFirstCommentBlock = IndentFirstCommentBlock,
333412
IndentFirstDeclarationBlock = IndentFirstDeclarationBlock,
413+
IgnoreEmptyLinesInFirstBlocks = IgnoreEmptyLinesInFirstBlocks,
334414
IndentSpaces = IndentSpaces,
335415
VerticallySpaceProcedures = VerticallySpaceProcedures,
336416
LinesBetweenProcedures = LinesBetweenProcedures
@@ -349,13 +429,17 @@ public void UpdateConfig(Configuration config)
349429
config.UserSettings.IndenterSettings.EndOfLineCommentStyle = EndOfLineCommentStyle;
350430
config.UserSettings.IndenterSettings.ForceCompilerDirectivesInColumn1 = ForceCompilerDirectivesInColumn1;
351431
config.UserSettings.IndenterSettings.ForceDebugStatementsInColumn1 = ForceDebugStatementsInColumn1;
432+
config.UserSettings.IndenterSettings.ForceDebugPrintInColumn1 = ForceDebugPrintInColumn1;
433+
config.UserSettings.IndenterSettings.ForceDebugAssertInColumn1 = ForceDebugAssertInColumn1;
434+
config.UserSettings.IndenterSettings.ForceStopInColumn1 = ForceStopInColumn1;
352435
config.UserSettings.IndenterSettings.IgnoreOperatorsInContinuations = IgnoreOperatorsInContinuations;
353436
config.UserSettings.IndenterSettings.IndentCase = IndentCase;
354437
config.UserSettings.IndenterSettings.IndentEnumTypeAsProcedure = IndentEnumTypeAsProcedure;
355438
config.UserSettings.IndenterSettings.IndentCompilerDirectives = IndentCompilerDirectives;
356439
config.UserSettings.IndenterSettings.IndentEntireProcedureBody = IndentEntireProcedureBody;
357-
config.UserSettings.IndenterSettings.IndentFirstCommentBlock = IndentFirstCommentBlock;
440+
config.UserSettings.IndenterSettings.IndentFirstCommentBlock = IndentFirstCommentBlock;
358441
config.UserSettings.IndenterSettings.IndentFirstDeclarationBlock = IndentFirstDeclarationBlock;
442+
config.UserSettings.IndenterSettings.IgnoreEmptyLinesInFirstBlocks = IgnoreEmptyLinesInFirstBlocks;
359443
config.UserSettings.IndenterSettings.IndentSpaces = IndentSpaces;
360444
config.UserSettings.IndenterSettings.VerticallySpaceProcedures = VerticallySpaceProcedures;
361445
config.UserSettings.IndenterSettings.LinesBetweenProcedures = LinesBetweenProcedures;
@@ -376,13 +460,17 @@ private void TransferSettingsToView(IIndenterSettings toLoad)
376460
EndOfLineCommentStyle = toLoad.EndOfLineCommentStyle;
377461
ForceCompilerDirectivesInColumn1 = toLoad.ForceCompilerDirectivesInColumn1;
378462
ForceDebugStatementsInColumn1 = toLoad.ForceDebugStatementsInColumn1;
463+
ForceDebugPrintInColumn1 = toLoad.ForceDebugPrintInColumn1;
464+
ForceDebugAssertInColumn1 = toLoad.ForceDebugAssertInColumn1;
465+
ForceStopInColumn1 = toLoad.ForceStopInColumn1;
379466
IgnoreOperatorsInContinuations = toLoad.IgnoreOperatorsInContinuations;
380467
IndentCase = toLoad.IndentCase;
381468
IndentEnumTypeAsProcedure = toLoad.IndentEnumTypeAsProcedure;
382469
IndentCompilerDirectives = toLoad.IndentCompilerDirectives;
383470
IndentEntireProcedureBody = toLoad.IndentEntireProcedureBody;
384471
IndentFirstCommentBlock = toLoad.IndentFirstCommentBlock;
385472
IndentFirstDeclarationBlock = toLoad.IndentFirstDeclarationBlock;
473+
IgnoreEmptyLinesInFirstBlocks = toLoad.IgnoreEmptyLinesInFirstBlocks;
386474
IndentSpaces = toLoad.IndentSpaces;
387475
VerticallySpaceProcedures = toLoad.VerticallySpaceProcedures;
388476
LinesBetweenProcedures = toLoad.LinesBetweenProcedures;
@@ -399,7 +487,7 @@ private void ImportSettings()
399487
dialog.ShowDialog();
400488
if (string.IsNullOrEmpty(dialog.FileName)) return;
401489
var service = new XmlPersistanceService<SmartIndenter.IndenterSettings> { FilePath = dialog.FileName };
402-
var loaded = service.Load(new SmartIndenter.IndenterSettings());
490+
var loaded = service.Load(new SmartIndenter.IndenterSettings(false));
403491
TransferSettingsToView(loaded);
404492
}
405493
}

Rubberduck.Resources/RubberduckUI.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Resources/RubberduckUI.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1297,4 +1297,7 @@ NOTE: Restart is required for the setting to take effect.</value>
12971297
<data name="GroupingStyle_ByCategory" xml:space="preserve">
12981298
<value>By category</value>
12991299
</data>
1300+
<data name="IndenterSettings_IgnoreEmptyLinesInFirstBlocks" xml:space="preserve">
1301+
<value>Ignore empty lines when locating first comment and declaration blocks</value>
1302+
</data>
13001303
</root>

Rubberduck.SmartIndenter/AbsoluteCodeLine.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ internal class AbsoluteCodeLine
1717
private static readonly Regex ProcedureEndRegex = new Regex(@"^End\s(Sub|Function|Property)", RegexOptions.IgnoreCase);
1818
private static readonly Regex TypeEnumStartRegex = new Regex(@"^(Public\s|Private\s)?(Enum\s|Type\s)", RegexOptions.IgnoreCase);
1919
private static readonly Regex TypeEnumEndRegex = new Regex(@"^End\s(Enum|Type)", RegexOptions.IgnoreCase);
20-
private static readonly Regex InProcedureInRegex = new Regex(@"^(Else)?If\s.*\sThen$|^Else$|^Case\s|^With|^For\s|^Do$|^Do\s|^While$|^While\s|^Select Case", RegexOptions.IgnoreCase);
20+
private static readonly Regex InProcedureInRegex = new Regex(@"^(Else)?If\s.*\sThen$|^Else:?$|^Case\s|^With|^For\s|^Do$|^Do\s|^While$|^While\s|^Select Case", RegexOptions.IgnoreCase);
2121
private static readonly Regex InProcedureOutRegex = new Regex(@"^Else(If)?|^Case\s|^End With|^Next\s|^Next$|^Loop$|^Loop\s|^Wend$|^End If$|^End Select", RegexOptions.IgnoreCase);
2222
private static readonly Regex DeclarationRegex = new Regex(@"^(Dim|Const|Static|Public|Private)\s(.*(\sAs\s)?|_)", RegexOptions.IgnoreCase);
2323
private static readonly Regex PrecompilerInRegex = new Regex(@"^#(Else)?If\s.+Then$|^#Else$", RegexOptions.IgnoreCase);
@@ -159,7 +159,9 @@ public bool HasDeclarationContinuation
159159

160160
public bool IsPrecompilerDirective => _code.TrimStart().StartsWith("#");
161161

162-
public bool IsBareDebugStatement => _code.StartsWith("Debug.") || _code.Equals("Stop");
162+
public bool IsBareDebugPrintStatement => _code.StartsWith("Debug.Print");
163+
public bool IsBareDebugAssertStatement => _code.StartsWith("Debug.Assert");
164+
public bool IsBareStopStatement => _code.Equals("Stop");
163165

164166
public int EnumOrTypeStarts
165167
{
@@ -232,7 +234,9 @@ public string Indent(int indents, bool atProcStart, bool absolute = false)
232234
}
233235

234236
if ((IsPrecompilerDirective && _settings.ForceCompilerDirectivesInColumn1) ||
235-
(IsBareDebugStatement && _settings.ForceDebugStatementsInColumn1) ||
237+
(IsBareDebugPrintStatement && _settings.ForceDebugPrintInColumn1) ||
238+
(IsBareDebugAssertStatement && _settings.ForceDebugAssertInColumn1) ||
239+
(IsBareStopStatement && _settings.ForceStopInColumn1) ||
236240
(atProcStart && !_settings.IndentFirstCommentBlock && ContainsOnlyComment) ||
237241
(atProcStart && !_settings.IndentFirstDeclarationBlock && (IsDeclaration || IsDeclarationContinuation)))
238242
{

0 commit comments

Comments
 (0)