6
6
using Rubberduck . VBEditor ;
7
7
using Antlr4 . Runtime . Misc ;
8
8
using Rubberduck . Parsing . Symbols ;
9
+ using Rubberduck . SmartIndenter ;
9
10
10
11
namespace Rubberduck . Navigation . CodeMetrics
11
12
{
12
13
public class ParseTreeMetricsAnalyst : ICodeMetricsAnalyst
13
14
{
15
+ private readonly IIndenterSettings indenterSettings ;
16
+
17
+ public ParseTreeMetricsAnalyst ( IIndenterSettings indenterSettings )
18
+ {
19
+ this . indenterSettings = indenterSettings ;
20
+ }
21
+
14
22
public IEnumerable < ModuleMetricsResult > ModuleMetrics ( RubberduckParserState state )
15
23
{
16
24
if ( state == null || ! state . AllUserDeclarations . Any ( ) )
@@ -35,24 +43,27 @@ public ModuleMetricsResult GetModuleResult(RubberduckParserState state, Qualifie
35
43
private ModuleMetricsResult GetModuleResult ( QualifiedModuleName qmn , IParseTree moduleTree , DeclarationFinder declarationFinder )
36
44
{
37
45
// 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 ) ;
39
47
ParseTreeWalker . Default . Walk ( cmListener , moduleTree ) ;
40
48
return cmListener . GetMetricsResult ( qmn ) ;
41
49
}
42
50
43
51
44
52
private class CodeMetricsListener : VBAParserBaseListener
45
53
{
46
- private Declaration currentMember ;
47
54
private readonly DeclarationFinder _finder ;
55
+ private readonly IIndenterSettings _indenterSettings ;
56
+
57
+ private Declaration currentMember ;
48
58
private List < CodeMetricsResult > results = new List < CodeMetricsResult > ( ) ;
49
59
private List < CodeMetricsResult > moduleResults = new List < CodeMetricsResult > ( ) ;
50
60
51
61
private List < MemberMetricsResult > memberResults = new List < MemberMetricsResult > ( ) ;
52
62
53
- public CodeMetricsListener ( DeclarationFinder finder )
63
+ public CodeMetricsListener ( DeclarationFinder finder , IIndenterSettings indenterSettings )
54
64
{
55
65
_finder = finder ;
66
+ _indenterSettings = indenterSettings ;
56
67
}
57
68
58
69
public override void EnterEndOfLine ( [ NotNull ] VBAParser . EndOfLineContext context )
@@ -160,11 +171,9 @@ public override void ExitPropertySetStmt([NotNull] VBAParser.PropertySetStmtCont
160
171
public override void EnterBlockStmt ( [ NotNull ] VBAParser . BlockStmtContext context )
161
172
{
162
173
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 ) ) ;
166
176
}
167
- // FIXME also check if we need to do something about `mandatoryLineContinuation`?
168
177
169
178
private void ExitMeasurableMember ( )
170
179
{
0 commit comments