Skip to content

Commit 8207ab7

Browse files
committed
Implement and Test Property Get Set and Let Metrics
1 parent 6d50282 commit 8207ab7

File tree

2 files changed

+99
-12
lines changed

2 files changed

+99
-12
lines changed

RetailCoder.VBE/Navigation/CodeMetrics/ParseTreeMetricsAnalyst.cs

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,8 @@
1-
using System;
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
32
using System.Linq;
4-
using System.Text;
53
using System.Threading;
6-
using System.Threading.Tasks;
74
using Rubberduck.Parsing.VBA;
85
using Antlr4.Runtime.Tree;
9-
using Antlr4.Runtime;
106
using Rubberduck.Parsing.Grammar;
117
using Rubberduck.VBEditor;
128
using Antlr4.Runtime.Misc;
@@ -109,9 +105,7 @@ public override void EnterSubStmt([NotNull] VBAParser.SubStmtContext context)
109105
public override void ExitSubStmt([NotNull] VBAParser.SubStmtContext context)
110106
{
111107
// well, we're done here
112-
memberResults.Add(new MemberMetricsResult(currentMember, results));
113-
results = new List<CodeMetricsResult>(); // reinitialize to drop results
114-
currentMember = null;
108+
ExitMeasurableMember();
115109
}
116110

117111
public override void EnterFunctionStmt([NotNull] VBAParser.FunctionStmtContext context)
@@ -126,9 +120,46 @@ public override void EnterFunctionStmt([NotNull] VBAParser.FunctionStmtContext c
126120
public override void ExitFunctionStmt([NotNull] VBAParser.FunctionStmtContext context)
127121
{
128122
// well, we're done here
129-
memberResults.Add(new MemberMetricsResult(currentMember, results));
130-
results = new List<CodeMetricsResult>(); // reinitialize to drop results
131-
currentMember = null;
123+
ExitMeasurableMember();
124+
}
125+
126+
public override void EnterPropertyGetStmt([NotNull] VBAParser.PropertyGetStmtContext context)
127+
{
128+
results.Add(new CodeMetricsResult(0, 1, 0));
129+
130+
currentMember = _finder.DeclarationsWithType(DeclarationType.PropertyGet).Where(d => d.Context == context).First();
131+
}
132+
133+
public override void ExitPropertyGetStmt([NotNull] VBAParser.PropertyGetStmtContext context)
134+
{
135+
// well, we're done here
136+
ExitMeasurableMember();
137+
}
138+
139+
public override void EnterPropertyLetStmt([NotNull] VBAParser.PropertyLetStmtContext context)
140+
{
141+
results.Add(new CodeMetricsResult(0, 1, 0));
142+
143+
currentMember = _finder.DeclarationsWithType(DeclarationType.PropertyLet).Where(d => d.Context == context).First();
144+
}
145+
146+
public override void ExitPropertyLetStmt([NotNull] VBAParser.PropertyLetStmtContext context)
147+
{
148+
// well, we're done here
149+
ExitMeasurableMember();
150+
}
151+
152+
public override void EnterPropertySetStmt([NotNull] VBAParser.PropertySetStmtContext context)
153+
{
154+
results.Add(new CodeMetricsResult(0, 1, 0));
155+
156+
currentMember = _finder.DeclarationsWithType(DeclarationType.PropertySet).Where(d => d.Context == context).First();
157+
}
158+
159+
public override void ExitPropertySetStmt([NotNull] VBAParser.PropertySetStmtContext context)
160+
{
161+
// well, we're done here
162+
ExitMeasurableMember();
132163
}
133164

134165
public override void EnterBlockStmt([NotNull] VBAParser.BlockStmtContext context)
@@ -138,9 +169,15 @@ public override void EnterBlockStmt([NotNull] VBAParser.BlockStmtContext context
138169
// FIXME LINE_CONTINUATION might interfere here
139170
//results.Add(new CodeMetricsResult(0, 0, ws.ChildCount / 4));
140171
}
141-
142172
// FIXME also check if we need to do something about `mandatoryLineContinuation`?
143173

174+
private void ExitMeasurableMember()
175+
{
176+
memberResults.Add(new MemberMetricsResult(currentMember, results));
177+
results = new List<CodeMetricsResult>(); // reinitialize to drop results
178+
currentMember = null;
179+
}
180+
144181
internal ModuleMetricsResult GetMetricsResult(QualifiedModuleName qmn)
145182
{
146183
return new ModuleMetricsResult(qmn, memberResults, moduleResults);

RubberduckTests/Stats/ParseTreeMetricsAnalystTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,5 +232,55 @@ End Sub
232232
Assert.AreEqual(blockCount + 1, metrics.Result.CyclomaticComplexity);
233233
}
234234
}
235+
236+
[TestMethod]
237+
[TestCategory("Code Metrics")]
238+
public void PropertyGet_HasCyclomaticComplexity_One()
239+
{
240+
var code = @"
241+
Public Property Get Complexity() As Long
242+
Complexity = 1
243+
End Property
244+
";
245+
var state = MockParser.ParseString(code, out var _);
246+
var metrics = cut.ModuleMetrics(state, cts.Token).First();
247+
Assert.AreEqual(1, metrics.Result.CyclomaticComplexity);
248+
}
249+
250+
[TestMethod]
251+
[TestCategory("Code Metrics")]
252+
public void PropertyLet_HasCyclomaticComplexity_One()
253+
{
254+
var code = @"
255+
Option Explicit
256+
257+
Private mComplexity As Long
258+
259+
Public Property Let Complexity(ByVal complexity As Long)
260+
mComplexity = complexity
261+
End Property
262+
";
263+
var state = MockParser.ParseString(code, out var _);
264+
var metrics = cut.ModuleMetrics(state, cts.Token).First();
265+
Assert.AreEqual(1, metrics.Result.CyclomaticComplexity);
266+
}
267+
268+
[TestMethod]
269+
[TestCategory("Code Metrics")]
270+
public void PropertySet_HasCyclomaticComplexity_One()
271+
{
272+
var code = @"
273+
Option Explicit
274+
275+
Private mComplexity As Object
276+
277+
Public Property Set Complexity(ByRef complexity As Object)
278+
mComplexity = complexity
279+
End Property
280+
";
281+
var state = MockParser.ParseString(code, out var _);
282+
var metrics = cut.ModuleMetrics(state, cts.Token).First();
283+
Assert.AreEqual(1, metrics.Result.CyclomaticComplexity);
284+
}
235285
}
236286
}

0 commit comments

Comments
 (0)