Skip to content

Commit 5eda095

Browse files
committed
Make the enum members part of the ParseTreeVisitorResults
This allows to remove the corresponding state from the ParseTreeValueVisitor.
1 parent deea59f commit 5eda095

File tree

2 files changed

+46
-41
lines changed

2 files changed

+46
-41
lines changed

Rubberduck.CodeAnalysis/Inspections/Concrete/UnreachableCaseInspection/ParseTreeValueVisitor.cs

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,21 @@ public interface IParseTreeValueVisitor
1515
IParseTreeVisitorResults VisitChildren(QualifiedModuleName module, IRuleNode node);
1616
}
1717

18-
public class ParseTreeValueVisitor : IParseTreeValueVisitor
18+
public class EnumMember
1919
{
20-
private class EnumMember
20+
public EnumMember(VBAParser.EnumerationStmt_ConstantContext constContext, long initValue)
2121
{
22-
public EnumMember(VBAParser.EnumerationStmt_ConstantContext constContext, long initValue)
23-
{
24-
ConstantContext = constContext;
25-
Value = initValue;
26-
HasAssignment = constContext.children.Any(ch => ch.Equals(constContext.GetToken(VBAParser.EQ, 0)));
27-
}
28-
public VBAParser.EnumerationStmt_ConstantContext ConstantContext { get; }
29-
public long Value { set; get; }
30-
public bool HasAssignment { get; }
22+
ConstantContext = constContext;
23+
Value = initValue;
24+
HasAssignment = constContext.children.Any(ch => ch.Equals(constContext.GetToken(VBAParser.EQ, 0)));
3125
}
26+
public VBAParser.EnumerationStmt_ConstantContext ConstantContext { get; }
27+
public long Value { set; get; }
28+
public bool HasAssignment { get; }
29+
}
3230

31+
public class ParseTreeValueVisitor : IParseTreeValueVisitor
32+
{
3333
private readonly IParseTreeValueFactory _valueFactory;
3434
private readonly Func<Declaration, (bool, string, string)> _valueDeclarationEvaluator;
3535
private readonly IReadOnlyList<QualifiedContext<VBAParser.EnumerationStmtContext>> _enumStmtContexts;
@@ -57,7 +57,7 @@ public IParseTreeVisitorResults VisitChildren(QualifiedModuleName module, IRuleN
5757

5858
//The known results get passed along instead of aggregating from the bottom since other contexts can get already visited when resolving the value of other contexts.
5959
//Passing the results along avoids performing the resolution multiple times.
60-
private IParseTreeVisitorResults VisitChildren(QualifiedModuleName module, IRuleNode node, IParseTreeVisitorResults knownResults)
60+
private IMutableParseTreeVisitorResults VisitChildren(QualifiedModuleName module, IRuleNode node, IMutableParseTreeVisitorResults knownResults)
6161
{
6262
if (!(node is ParserRuleContext context))
6363
{
@@ -73,7 +73,7 @@ private IParseTreeVisitorResults VisitChildren(QualifiedModuleName module, IRule
7373
return valueResults;
7474
}
7575

76-
private IParseTreeVisitorResults Visit(QualifiedModuleName module, IParseTree tree, IParseTreeVisitorResults knownResults)
76+
private IMutableParseTreeVisitorResults Visit(QualifiedModuleName module, IParseTree tree, IMutableParseTreeVisitorResults knownResults)
7777
{
7878
var valueResults = knownResults;
7979
if (tree is ParserRuleContext context && !(context is VBAParser.WhiteSpaceContext))
@@ -84,7 +84,7 @@ private IParseTreeVisitorResults Visit(QualifiedModuleName module, IParseTree tr
8484
return valueResults;
8585
}
8686

87-
private IParseTreeVisitorResults Visit(QualifiedModuleName module, ParserRuleContext parserRuleContext, IParseTreeVisitorResults knownResults)
87+
private IMutableParseTreeVisitorResults Visit(QualifiedModuleName module, ParserRuleContext parserRuleContext, IMutableParseTreeVisitorResults knownResults)
8888
{
8989
switch (parserRuleContext)
9090
{
@@ -117,7 +117,7 @@ private IParseTreeVisitorResults Visit(QualifiedModuleName module, ParserRuleCon
117117
}
118118
}
119119

120-
private IParseTreeVisitorResults Visit(QualifiedModuleName module, VBAParser.LExprContext context, IParseTreeVisitorResults knownResults)
120+
private IMutableParseTreeVisitorResults Visit(QualifiedModuleName module, VBAParser.LExprContext context, IMutableParseTreeVisitorResults knownResults)
121121
{
122122
if (knownResults.Contains(context))
123123
{
@@ -149,7 +149,7 @@ private IParseTreeVisitorResults Visit(QualifiedModuleName module, VBAParser.LEx
149149
return valueResults;
150150
}
151151

152-
private IParseTreeVisitorResults Visit(VBAParser.LiteralExprContext context, IParseTreeVisitorResults knownResults)
152+
private IMutableParseTreeVisitorResults Visit(VBAParser.LiteralExprContext context, IMutableParseTreeVisitorResults knownResults)
153153
{
154154
if (knownResults.Contains(context))
155155
{
@@ -163,7 +163,7 @@ private IParseTreeVisitorResults Visit(VBAParser.LiteralExprContext context, IPa
163163
return valueResults;
164164
}
165165

166-
private IParseTreeVisitorResults VisitBinaryOpEvaluationContext(QualifiedModuleName module, ParserRuleContext context, IParseTreeVisitorResults knownResults)
166+
private IMutableParseTreeVisitorResults VisitBinaryOpEvaluationContext(QualifiedModuleName module, ParserRuleContext context, IMutableParseTreeVisitorResults knownResults)
167167
{
168168
var valueResults = VisitChildren(module, context, knownResults);
169169

@@ -191,7 +191,7 @@ private IParseTreeVisitorResults VisitBinaryOpEvaluationContext(QualifiedModuleN
191191
return valueResults;
192192
}
193193

194-
private IParseTreeVisitorResults VisitUnaryOpEvaluationContext(QualifiedModuleName module, ParserRuleContext context, IParseTreeVisitorResults knownResults)
194+
private IMutableParseTreeVisitorResults VisitUnaryOpEvaluationContext(QualifiedModuleName module, ParserRuleContext context, IMutableParseTreeVisitorResults knownResults)
195195
{
196196
var valueResults = VisitChildren(module, context, knownResults);
197197

@@ -208,7 +208,7 @@ private IParseTreeVisitorResults VisitUnaryOpEvaluationContext(QualifiedModuleNa
208208
return valueResults;
209209
}
210210

211-
private static (IParseTreeValue LHS, IParseTreeValue RHS, string Symbol) RetrieveOpEvaluationElements(ParserRuleContext context, IParseTreeVisitorResults knownResults)
211+
private static (IParseTreeValue LHS, IParseTreeValue RHS, string Symbol) RetrieveOpEvaluationElements(ParserRuleContext context, IMutableParseTreeVisitorResults knownResults)
212212
{
213213
(IParseTreeValue LHS, IParseTreeValue RHS, string Symbol) operandElements = (null, null, string.Empty);
214214
foreach (var child in NonWhitespaceChildren(context))
@@ -233,7 +233,7 @@ private static (IParseTreeValue LHS, IParseTreeValue RHS, string Symbol) Retriev
233233
return operandElements;
234234
}
235235

236-
private IParseTreeVisitorResults VisitUnaryResultContext(QualifiedModuleName module, ParserRuleContext parserRuleContext, IParseTreeVisitorResults knownResults)
236+
private IMutableParseTreeVisitorResults VisitUnaryResultContext(QualifiedModuleName module, ParserRuleContext parserRuleContext, IMutableParseTreeVisitorResults knownResults)
237237
{
238238
var valueResults = VisitChildren(module, parserRuleContext, knownResults);
239239

@@ -248,7 +248,7 @@ private IParseTreeVisitorResults VisitUnaryResultContext(QualifiedModuleName mod
248248
return valueResults;
249249
}
250250

251-
private IParseTreeVisitorResults VisitChildren(QualifiedModuleName module, ParserRuleContext context, IParseTreeVisitorResults knownResults)
251+
private IMutableParseTreeVisitorResults VisitChildren(QualifiedModuleName module, ParserRuleContext context, IMutableParseTreeVisitorResults knownResults)
252252
{
253253
if (knownResults.Contains(context))
254254
{
@@ -270,7 +270,7 @@ private static IEnumerable<ParserRuleContext> ParserRuleContextChildren(ParserRu
270270
private static IEnumerable<IParseTree> NonWhitespaceChildren(ParserRuleContext ptParent)
271271
=> ptParent.children.Where(ch => !(ch is VBAParser.WhiteSpaceContext));
272272

273-
private bool TryGetLExprValue(QualifiedModuleName module, VBAParser.LExprContext lExprContext, ref IParseTreeVisitorResults knownResults, out string expressionValue, out string declaredTypeName)
273+
private bool TryGetLExprValue(QualifiedModuleName module, VBAParser.LExprContext lExprContext, ref IMutableParseTreeVisitorResults knownResults, out string expressionValue, out string declaredTypeName)
274274
{
275275
expressionValue = string.Empty;
276276
declaredTypeName = string.Empty;
@@ -315,7 +315,7 @@ private bool TryGetLExprValue(QualifiedModuleName module, VBAParser.LExprContext
315315
return (true, valuedDeclaration.Expression, typeName);
316316
}
317317

318-
private (string declarationTypeName, string expressionValue, IParseTreeVisitorResults resultValues) GetContextValue(QualifiedModuleName module, ParserRuleContext context, IParseTreeVisitorResults knownResults)
318+
private (string declarationTypeName, string expressionValue, IMutableParseTreeVisitorResults resultValues) GetContextValue(QualifiedModuleName module, ParserRuleContext context, IMutableParseTreeVisitorResults knownResults)
319319
{
320320
if (!TryGetIdentifierReferenceForContext(module, context, out var rangeClauseIdentifierReference))
321321
{
@@ -379,7 +379,7 @@ private bool TryGetIdentifierReferenceForContext(QualifiedModuleName module, Par
379379
return success;
380380
}
381381

382-
private (string valueText, IParseTreeVisitorResults valueResults) GetConstantContextValueToken(QualifiedModuleName module, ParserRuleContext context, IParseTreeVisitorResults knownResults)
382+
private (string valueText, IMutableParseTreeVisitorResults valueResults) GetConstantContextValueToken(QualifiedModuleName module, ParserRuleContext context, IMutableParseTreeVisitorResults knownResults)
383383
{
384384
if (context is null)
385385
{
@@ -443,24 +443,21 @@ private static bool IsBinaryOpEvaluationContext<T>(T context)
443443
return false;
444444
}
445445

446-
private List<EnumMember> _enumMembers;
447-
private (IReadOnlyList<EnumMember> enumMembers, IParseTreeVisitorResults resultValues) EnumMembers(IParseTreeVisitorResults knownResults)
446+
private (IReadOnlyList<EnumMember> enumMembers, IMutableParseTreeVisitorResults resultValues) EnumMembers(IMutableParseTreeVisitorResults knownResults)
448447
{
449-
if (_enumMembers != null)
448+
if (knownResults.EnumMembers.Count > 0)
450449
{
451-
return (_enumMembers, knownResults);
450+
return (knownResults.EnumMembers, knownResults);
452451
}
453452

454453
var resultValues = LoadEnumMemberValues(_enumStmtContexts, knownResults);
455-
return (_enumMembers, resultValues);
454+
return (resultValues.EnumMembers, resultValues);
456455
}
457456

458-
//This procedure loads the list _enumMembers.
459-
//The incrementally added values are used within the call to Visit.
460-
private IParseTreeVisitorResults LoadEnumMemberValues(IReadOnlyList<QualifiedContext<VBAParser.EnumerationStmtContext>> enumStmtContexts, IParseTreeVisitorResults knownResults)
457+
//The enum members incrementally to the parse tree visitor result are used within the call to Visit.
458+
private IMutableParseTreeVisitorResults LoadEnumMemberValues(IReadOnlyList<QualifiedContext<VBAParser.EnumerationStmtContext>> enumStmtContexts, IMutableParseTreeVisitorResults knownResults)
461459
{
462460
var valueResults = knownResults;
463-
_enumMembers = new List<EnumMember>();
464461
foreach (var qualifiedEnumStmt in enumStmtContexts)
465462
{
466463
var module = qualifiedEnumStmt.ModuleName;
@@ -484,7 +481,7 @@ private IParseTreeVisitorResults LoadEnumMemberValues(IReadOnlyList<QualifiedCon
484481
enumAssignedValue = enumMember.Value;
485482
}
486483
}
487-
_enumMembers.Add(enumMember);
484+
valueResults.Add(enumMember);
488485
}
489486
}
490487

Rubberduck.CodeAnalysis/Inspections/Concrete/UnreachableCaseInspection/ParseTreeVisitorResults.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,19 @@ public interface IParseTreeVisitorResults
1313
string GetToken(ParserRuleContext context);
1414
bool Contains(ParserRuleContext context);
1515
bool TryGetValue(ParserRuleContext context, out IParseTreeValue value);
16-
void AddIfNotPresent(ParserRuleContext context, IParseTreeValue value);
16+
IReadOnlyList<EnumMember> EnumMembers { get; }
1717
}
1818

19-
public class ParseTreeVisitorResults : IParseTreeVisitorResults
19+
public interface IMutableParseTreeVisitorResults : IParseTreeVisitorResults
2020
{
21-
private Dictionary<ParserRuleContext, IParseTreeValue> _parseTreeValues;
21+
void AddIfNotPresent(ParserRuleContext context, IParseTreeValue value);
22+
void Add(EnumMember enumMember);
23+
}
2224

23-
public ParseTreeVisitorResults()
24-
{
25-
_parseTreeValues = new Dictionary<ParserRuleContext, IParseTreeValue>();
26-
}
25+
public class ParseTreeVisitorResults : IMutableParseTreeVisitorResults
26+
{
27+
private readonly Dictionary<ParserRuleContext, IParseTreeValue> _parseTreeValues = new Dictionary<ParserRuleContext, IParseTreeValue>();
28+
private readonly List<EnumMember> _enumMembers = new List<EnumMember>();
2729

2830
public IParseTreeValue GetValue(ParserRuleContext context)
2931
{
@@ -74,5 +76,11 @@ public void AddIfNotPresent(ParserRuleContext context, IParseTreeValue value)
7476
_parseTreeValues.Add(context, value);
7577
}
7678
}
79+
80+
public IReadOnlyList<EnumMember> EnumMembers => _enumMembers;
81+
public void Add(EnumMember enumMember)
82+
{
83+
_enumMembers.Add(enumMember);
84+
}
7785
}
7886
}

0 commit comments

Comments
 (0)