Skip to content

Commit dfb61b0

Browse files
committed
Inject and use IndenterSettings to determine indentation level
1 parent 8f87314 commit dfb61b0

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

RetailCoder.VBE/Navigation/CodeMetrics/ParseTreeMetricsAnalyst.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,19 @@
66
using Rubberduck.VBEditor;
77
using Antlr4.Runtime.Misc;
88
using Rubberduck.Parsing.Symbols;
9+
using Rubberduck.SmartIndenter;
910

1011
namespace Rubberduck.Navigation.CodeMetrics
1112
{
1213
public class ParseTreeMetricsAnalyst : ICodeMetricsAnalyst
1314
{
15+
private readonly IIndenterSettings indenterSettings;
16+
17+
public ParseTreeMetricsAnalyst(IIndenterSettings indenterSettings)
18+
{
19+
this.indenterSettings = indenterSettings;
20+
}
21+
1422
public IEnumerable<ModuleMetricsResult> ModuleMetrics(RubberduckParserState state)
1523
{
1624
if (state == null || !state.AllUserDeclarations.Any())
@@ -35,24 +43,27 @@ public ModuleMetricsResult GetModuleResult(RubberduckParserState state, Qualifie
3543
private ModuleMetricsResult GetModuleResult(QualifiedModuleName qmn, IParseTree moduleTree, DeclarationFinder declarationFinder)
3644
{
3745
// Consider rewrite as visitor? That should make subtrees easier and allow us to expand metrics
38-
var cmListener = new CodeMetricsListener(declarationFinder);
46+
var cmListener = new CodeMetricsListener(declarationFinder, indenterSettings);
3947
ParseTreeWalker.Default.Walk(cmListener, moduleTree);
4048
return cmListener.GetMetricsResult(qmn);
4149
}
4250

4351

4452
private class CodeMetricsListener : VBAParserBaseListener
4553
{
46-
private Declaration currentMember;
4754
private readonly DeclarationFinder _finder;
55+
private readonly IIndenterSettings _indenterSettings;
56+
57+
private Declaration currentMember;
4858
private List<CodeMetricsResult> results = new List<CodeMetricsResult>();
4959
private List<CodeMetricsResult> moduleResults = new List<CodeMetricsResult>();
5060

5161
private List<MemberMetricsResult> memberResults = new List<MemberMetricsResult>();
5262

53-
public CodeMetricsListener(DeclarationFinder finder)
63+
public CodeMetricsListener(DeclarationFinder finder, IIndenterSettings indenterSettings)
5464
{
5565
_finder = finder;
66+
_indenterSettings = indenterSettings;
5667
}
5768

5869
public override void EnterEndOfLine([NotNull] VBAParser.EndOfLineContext context)
@@ -160,11 +171,9 @@ public override void ExitPropertySetStmt([NotNull] VBAParser.PropertySetStmtCont
160171
public override void EnterBlockStmt([NotNull] VBAParser.BlockStmtContext context)
161172
{
162173
var ws = context.whiteSpace();
163-
// FIXME divide by indent size and assume we're indented?
164-
// FIXME LINE_CONTINUATION might interfere here
165-
//results.Add(new CodeMetricsResult(0, 0, ws.ChildCount / 4));
174+
// FIXME only take the last contiguous non-linebreak into account
175+
results.Add(new CodeMetricsResult(0, 0, ws.ChildCount / _indenterSettings.IndentSpaces));
166176
}
167-
// FIXME also check if we need to do something about `mandatoryLineContinuation`?
168177

169178
private void ExitMeasurableMember()
170179
{

RubberduckTests/Stats/ParseTreeMetricsAnalystTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Microsoft.VisualStudio.TestTools.UnitTesting;
22
using Rubberduck.Navigation.CodeMetrics;
33
using RubberduckTests.Mocks;
4+
using RubberduckTests.Settings;
45
using System;
56
using System.Collections.Generic;
67
using System.Linq;
@@ -18,7 +19,7 @@ public class ParseTreeMetricsAnalystTests
1819
[TestInitialize]
1920
public void Setup()
2021
{
21-
cut = new ParseTreeMetricsAnalyst();
22+
cut = new ParseTreeMetricsAnalyst(IndenterSettingsTests.GetMockIndenterSettings());
2223
}
2324

2425
[TestMethod]

0 commit comments

Comments
 (0)