Skip to content

Commit c853e05

Browse files
authored
Merge pull request #5668 from BZngr/AddPropertyGroupIndenterSetting
Add Indenter Vertical Spacing option: Remove vertical space between related property members
2 parents 7fcf461 + 6a1f626 commit c853e05

File tree

16 files changed

+350
-20
lines changed

16 files changed

+350
-20
lines changed

Rubberduck.Core/UI/Settings/IndenterSettings.xaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,19 @@
355355
IsEnabled="{Binding ElementName=SpaceProcedures,Path=IsChecked}"
356356
NumValue="{Binding LinesBetweenProcedures,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
357357
</WrapPanel>
358+
<WrapPanel Orientation="Horizontal">
359+
<CheckBox Name="PropertyGrouping"
360+
Margin="50,0,0,5"
361+
HorizontalAlignment="Left"
362+
IsChecked="{Binding GroupRelatedProperties,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
363+
<AccessText TextWrapping="WrapWithOverflow">
364+
<AccessText.Text>
365+
<Resx ResxName="Rubberduck.Resources.RubberduckUI"
366+
Key="IndenterSettings_GroupRelatedProperties" />
367+
</AccessText.Text>
368+
</AccessText>
369+
</CheckBox>
370+
</WrapPanel>
358371
</StackPanel>
359372
</Expander>
360373
<Expander Grid.Row="4"

Rubberduck.Core/UI/Settings/IndenterSettingsViewModel.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public IndenterSettingsViewModel(Configuration config, IConfigurationService<Sma
3737
_indentSpaces = config.UserSettings.IndenterSettings.IndentSpaces;
3838
_spaceProcedures = config.UserSettings.IndenterSettings.VerticallySpaceProcedures;
3939
_procedureSpacing = config.UserSettings.IndenterSettings.LinesBetweenProcedures;
40+
_groupRelatedProperties = config.UserSettings.IndenterSettings.GroupRelatedProperties;
4041

4142
PropertyChanged += IndenterSettingsViewModel_PropertyChanged;
4243
ExportButtonCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), _ => ExportSettings(GetCurrentSettings()));
@@ -396,6 +397,21 @@ public int LinesBetweenProcedures
396397
}
397398
}
398399

400+
private bool _groupRelatedProperties;
401+
402+
public bool GroupRelatedProperties
403+
{
404+
get => _groupRelatedProperties;
405+
set
406+
{
407+
if (_groupRelatedProperties != value)
408+
{
409+
_groupRelatedProperties = value;
410+
OnPropertyChanged();
411+
}
412+
}
413+
}
414+
399415
public string PreviewSampleCode
400416
{
401417
get
@@ -465,6 +481,7 @@ public void UpdateConfig(Configuration config)
465481
config.UserSettings.IndenterSettings.IndentSpaces = IndentSpaces;
466482
config.UserSettings.IndenterSettings.VerticallySpaceProcedures = VerticallySpaceProcedures;
467483
config.UserSettings.IndenterSettings.LinesBetweenProcedures = LinesBetweenProcedures;
484+
config.UserSettings.IndenterSettings.GroupRelatedProperties = GroupRelatedProperties;
468485
}
469486

470487
public void SetToDefaults(Configuration config)
@@ -497,6 +514,7 @@ protected override void TransferSettingsToView(SmartIndenter.IndenterSettings to
497514
IndentSpaces = toLoad.IndentSpaces;
498515
VerticallySpaceProcedures = toLoad.VerticallySpaceProcedures;
499516
LinesBetweenProcedures = toLoad.LinesBetweenProcedures;
517+
GroupRelatedProperties = toLoad.GroupRelatedProperties;
500518
}
501519
}
502520
}

Rubberduck.Refactorings/EncapsulateField/EncapsulateFieldInsertNewCode/EncapsulateFieldInsertNewCodeRefactoringAction.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Linq;
99
using Rubberduck.Refactorings.EncapsulateField;
1010
using System.Collections.Generic;
11+
using Rubberduck.SmartIndenter;
1112

1213
namespace Rubberduck.Refactorings.EncapsulateFieldInsertNewCode
1314
{
@@ -20,17 +21,20 @@ public class EncapsulateFieldInsertNewCodeRefactoringAction : CodeOnlyRefactorin
2021
private readonly IDeclarationFinderProvider _declarationFinderProvider;
2122
private readonly IPropertyAttributeSetsGenerator _propertyAttributeSetsGenerator;
2223
private readonly IEncapsulateFieldCodeBuilder _encapsulateFieldCodeBuilder;
24+
private readonly IIndenter _indenter;
2325

2426
public EncapsulateFieldInsertNewCodeRefactoringAction(
2527
IDeclarationFinderProvider declarationFinderProvider,
2628
IRewritingManager rewritingManager,
2729
IPropertyAttributeSetsGenerator propertyAttributeSetsGenerator,
28-
IEncapsulateFieldCodeBuilder encapsulateFieldCodeBuilder)
30+
IEncapsulateFieldCodeBuilder encapsulateFieldCodeBuilder,
31+
IIndenter indenter)
2932
: base(rewritingManager)
3033
{
3134
_declarationFinderProvider = declarationFinderProvider;
3235
_propertyAttributeSetsGenerator = propertyAttributeSetsGenerator;
3336
_encapsulateFieldCodeBuilder = encapsulateFieldCodeBuilder;
37+
_indenter = indenter;
3438
}
3539

3640
public override void Refactor(EncapsulateFieldInsertNewCodeModel model, IRewriteSession rewriteSession)
@@ -98,6 +102,8 @@ private void InsertBlocks(EncapsulateFieldInsertNewCodeModel model, IRewriteSess
98102
allNewContent = $"{allNewContent}{Environment.NewLine}{previewMarker}";
99103
}
100104

105+
var formattedContent = string.Join(Environment.NewLine, _indenter.Indent(allNewContent));
106+
101107
var rewriter = rewriteSession.CheckOutModuleRewriter(model.QualifiedModuleName);
102108

103109
var codeSectionStartIndex = _declarationFinderProvider.DeclarationFinder
@@ -107,10 +113,10 @@ private void InsertBlocks(EncapsulateFieldInsertNewCodeModel model, IRewriteSess
107113

108114
if (codeSectionStartIndex.HasValue)
109115
{
110-
rewriter.InsertBefore(codeSectionStartIndex.Value, $"{allNewContent}{NewLines.DOUBLE_SPACE}");
116+
rewriter.InsertBefore(codeSectionStartIndex.Value, $"{formattedContent}{NewLines.DOUBLE_SPACE}");
111117
return;
112118
}
113-
rewriter.InsertBefore(rewriter.TokenStream.Size - 1, $"{NewLines.DOUBLE_SPACE}{allNewContent}");
119+
rewriter.InsertBefore(rewriter.TokenStream.Size - 1, $"{NewLines.DOUBLE_SPACE}{formattedContent}");
114120
}
115121
}
116122
}

Rubberduck.Resources/Rubberduck.Resources.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,9 @@
2626
<DependentUpon>$([System.String]::Copy('%(Filename)').Replace('.Designer', '')).resx</DependentUpon>
2727
</Compile>
2828
</ItemGroup>
29+
<ItemGroup>
30+
<Compile Update="RubberduckUI.Designer.cs">
31+
<DesignTime>True</DesignTime>
32+
</Compile>
33+
</ItemGroup>
2934
</Project>

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
@@ -1889,4 +1889,7 @@ Do you want to proceed?</value>
18891889
<data name="TestOutcome_Ignored" xml:space="preserve">
18901890
<value>Ignored</value>
18911891
</data>
1892+
<data name="IndenterSettings_GroupRelatedProperties" xml:space="preserve">
1893+
<value>Remove vertical space between related property members</value>
1894+
</data>
18921895
</root>

Rubberduck.SmartIndenter/AbsoluteCodeLine.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ internal class AbsoluteCodeLine
1111
{
1212
private const string StupidLineEnding = ": _";
1313
private static readonly Regex LineNumberRegex = new Regex(@"^(?<number>(-?\d+)|(&H[0-9A-F]{1,8}))(?<separator>:)?\s+(?<code>.*)", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
14-
private static readonly Regex EndOfLineCommentRegex = new Regex(@"^(?!(Rem\s)|('))(?<code>[^']*)(\s(?<comment>'.*))$", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
14+
private static readonly Regex EndOfLineCommentRegex = new Regex(@"^(?!(Rem\s)|('))(?<code>[^']*)(\s(?<comment>'.*))$", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase);
1515
private static readonly Regex ProcedureStartRegex = new Regex(@"^(Public\s|Private\s|Friend\s)?(Static\s)?(Sub|Function|Property\s(Let|Get|Set))\s", RegexOptions.IgnoreCase);
16+
17+
private static readonly Regex PropertyStartRegex = new Regex(@"^(Public\s|Private\s|Friend\s)?(Static\s)?(Property\s(Let|Get|Set))\s", RegexOptions.IgnoreCase);
18+
1619
private static readonly Regex ProcedureStartIgnoreRegex = new Regex(@"^[LR]?Set\s|^Let\s|^(Public|Private)\sDeclare\s(Function|Sub)", RegexOptions.IgnoreCase);
1720
private static readonly Regex ProcedureEndRegex = new Regex(@"^End\s(Sub|Function|Property)", RegexOptions.IgnoreCase);
1821
private static readonly Regex TypeEnumStartRegex = new Regex(@"^(Public\s|Private\s)?(Enum\s|Type\s)", RegexOptions.IgnoreCase);
@@ -178,6 +181,10 @@ public bool IsProcedureStart
178181
get { return _segments.Any(s => ProcedureStartRegex.IsMatch(s)) && !_segments.Any(s => ProcedureStartIgnoreRegex.IsMatch(s)); }
179182
}
180183

184+
public bool IsPropertyStart
185+
{
186+
get { return _segments.Any(s => PropertyStartRegex.IsMatch(s)); }
187+
}
181188
public bool IsProcedureEnd
182189
{
183190
get { return _segments.Any(s => ProcedureEndRegex.IsMatch(s)); }

Rubberduck.SmartIndenter/IIndenterSettings.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public interface IIndenterSettings
2525
int IndentSpaces { get; set; }
2626
bool VerticallySpaceProcedures { get; set; }
2727
int LinesBetweenProcedures { get; set; }
28+
bool GroupRelatedProperties { get; set; }
2829
bool LegacySettingsExist();
2930
void LoadLegacyFromRegistry();
3031
}

Rubberduck.SmartIndenter/Indenter.cs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ private IEnumerable<string> Indent(IEnumerable<string> codeLines, bool forceTrai
279279
inProcedure = true;
280280
}
281281
line.InsideProcedureTypeOrEnum = inProcedure || enumStart;
282-
inProcedure = inProcedure && !line.IsProcudureEnd && !line.IsEnumOrTypeEnd;
282+
inProcedure = inProcedure && !line.IsProcedureEnd && !line.IsEnumOrTypeEnd;
283283
if (line.IsProcedureStart || line.IsEnumOrTypeStart)
284284
{
285285
indents = 0;
@@ -311,6 +311,8 @@ private IEnumerable<string> GenerateCodeLineStrings(IEnumerable<LogicalCodeLine>
311311
var lines = logical.ToArray();
312312
var header = true;
313313
var inEnumType = false;
314+
var propertyGroupIdentifier = string.Empty;
315+
314316
for (var i = 0; i < lines.Length; i++)
315317
{
316318
indent.Add(lines[i]);
@@ -328,19 +330,42 @@ private IEnumerable<string> GenerateCodeLineStrings(IEnumerable<LogicalCodeLine>
328330
{
329331
header = false;
330332
SpaceHeader(indent, settings);
333+
334+
propertyGroupIdentifier = lines[i].IsPropertyStart
335+
? ExtractPropertyIdentifier(lines[i].ToString())
336+
: string.Empty;
337+
331338
continue;
332339
}
333-
if (!lines[i].IsEnumOrTypeEnd && !lines[i].IsProcudureEnd)
340+
if (!lines[i].IsEnumOrTypeEnd && !lines[i].IsProcedureEnd)
334341
{
335342
continue;
336343
}
344+
337345
while (++i < lines.Length && lines[i].IsEmpty) { }
338346
if (i != lines.Length)
339347
{
340-
if (settings.LinesBetweenProcedures > 0)
348+
var linesBetweenProcedures = settings.LinesBetweenProcedures;
349+
350+
if (lines[i].IsPropertyStart)
351+
{
352+
var propertyIdentifier = ExtractPropertyIdentifier(lines[i].ToString());
353+
if (propertyIdentifier.Equals(propertyGroupIdentifier, StringComparison.InvariantCultureIgnoreCase)
354+
&& settings.GroupRelatedProperties)
355+
{
356+
linesBetweenProcedures = 0;
357+
}
358+
else
359+
{
360+
propertyGroupIdentifier = propertyIdentifier;
361+
}
362+
}
363+
364+
if (linesBetweenProcedures > 0)
341365
{
342-
indent.Add(new LogicalCodeLine(Enumerable.Repeat(new AbsoluteCodeLine(string.Empty, settings), settings.LinesBetweenProcedures), settings));
366+
indent.Add(new LogicalCodeLine(Enumerable.Repeat(new AbsoluteCodeLine(string.Empty, settings), linesBetweenProcedures), settings));
343367
}
368+
344369
indent.Add(lines[i]);
345370
}
346371
else if (forceTrailingNewLines && i == lines.Length)
@@ -361,6 +386,12 @@ private IEnumerable<string> GenerateCodeLineStrings(IEnumerable<LogicalCodeLine>
361386
return output;
362387
}
363388

389+
private static string ExtractPropertyIdentifier(string line)
390+
{
391+
var declarationElementsStartingAtGetLetOrSet = line.ToString().Split(' ').SkipWhile(c => !c.EndsWith("et")).ToArray();
392+
return declarationElementsStartingAtGetLetOrSet[1].Split(new string[] { "(" }, StringSplitOptions.None).FirstOrDefault();
393+
}
394+
364395
private static void SpaceHeader(IList<LogicalCodeLine> header, IIndenterSettings settings)
365396
{
366397
var commentSkipped = false;

Rubberduck.SmartIndenter/IndenterSettings.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,8 @@ public virtual int LinesBetweenProcedures
118118
set => _procedureSpacing = value > MaximumVerticalSpacing ? MaximumVerticalSpacing : Math.Max(value, 0);
119119
}
120120

121+
public virtual bool GroupRelatedProperties { get; set; }
122+
121123
/// <summary>
122124
/// Use this ctor for unit testing.
123125
/// </summary>

0 commit comments

Comments
 (0)