@@ -32,17 +32,14 @@ public class ParseTreeValueVisitor : IParseTreeValueVisitor
32
32
{
33
33
private readonly IParseTreeValueFactory _valueFactory ;
34
34
private readonly Func < Declaration , ( bool , string , string ) > _valueDeclarationEvaluator ;
35
- private readonly IReadOnlyList < QualifiedContext < VBAParser . EnumerationStmtContext > > _enumStmtContexts ;
36
35
37
36
public ParseTreeValueVisitor (
38
37
IParseTreeValueFactory valueFactory ,
39
- IReadOnlyList < QualifiedContext < VBAParser . EnumerationStmtContext > > allEnums ,
40
38
Func < QualifiedModuleName , ParserRuleContext , ( bool success , IdentifierReference idRef ) > identifierReferenceRetriever ,
41
39
Func < Declaration , ( bool , string , string ) > valueDeclarationEvaluator = null )
42
40
{
43
41
_valueFactory = valueFactory ;
44
42
IdentifierReferenceRetriever = identifierReferenceRetriever ;
45
- _enumStmtContexts = allEnums ;
46
43
_valueDeclarationEvaluator = valueDeclarationEvaluator ?? GetValuedDeclaration ;
47
44
}
48
45
@@ -357,10 +354,15 @@ private bool TryGetLExprValue(QualifiedModuleName module, VBAParser.LExprContext
357
354
return ( Tokens . Long , constantExpressionValue , resultValues ) ;
358
355
}
359
356
360
- var ( enumMembers , valueResults ) = EnumMembers ( resultValues ) ;
361
- var enumValue = enumMembers . SingleOrDefault ( dt => dt . ConstantContext == declaration . Context ) ;
362
- var enumExpressionValue = enumValue ? . Value . ToString ( ) ?? string . Empty ;
363
- return ( Tokens . Long , enumExpressionValue , valueResults ) ;
357
+ if ( declaration . Context . Parent is VBAParser . EnumerationStmtContext enumStmt )
358
+ {
359
+ var ( enumMembers , valueResults ) = EnumMembers ( module , enumStmt , resultValues ) ;
360
+ var enumValue = enumMembers . SingleOrDefault ( enumMember => enumMember . ConstantContext == declaration . Context ) ;
361
+ var enumExpressionValue = enumValue ? . Value . ToString ( ) ?? string . Empty ;
362
+ return ( Tokens . Long , enumExpressionValue , valueResults ) ;
363
+ }
364
+
365
+ return ( Tokens . Long , string . Empty , resultValues ) ;
364
366
}
365
367
366
368
return ( declaredTypeName , expressionValue , knownResults ) ;
@@ -443,46 +445,46 @@ private static bool IsBinaryOpEvaluationContext<T>(T context)
443
445
return false ;
444
446
}
445
447
446
- private ( IReadOnlyList < EnumMember > enumMembers , IMutableParseTreeVisitorResults resultValues ) EnumMembers ( IMutableParseTreeVisitorResults knownResults )
448
+ private ( IReadOnlyList < EnumMember > enumMembers , IMutableParseTreeVisitorResults resultValues ) EnumMembers ( QualifiedModuleName enumModule , VBAParser . EnumerationStmtContext enumerationStmtContext , IMutableParseTreeVisitorResults knownResults )
447
449
{
448
- if ( knownResults . EnumMembers . Count > 0 )
450
+ if ( knownResults . TryGetEnumMembers ( enumerationStmtContext , out var enumMembers ) )
451
+ {
452
+ return ( enumMembers , knownResults ) ;
453
+ }
454
+
455
+ var resultValues = LoadEnumMemberValues ( enumModule , enumerationStmtContext , knownResults ) ;
456
+ if ( knownResults . TryGetEnumMembers ( enumerationStmtContext , out var newEnumMembers ) )
449
457
{
450
- return ( knownResults . EnumMembers , knownResults ) ;
458
+ return ( newEnumMembers , resultValues ) ;
451
459
}
452
460
453
- var resultValues = LoadEnumMemberValues ( _enumStmtContexts , knownResults ) ;
454
- return ( resultValues . EnumMembers , resultValues ) ;
461
+ return ( new List < EnumMember > ( ) , resultValues ) ;
455
462
}
456
463
457
464
//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 )
465
+ private IMutableParseTreeVisitorResults LoadEnumMemberValues ( QualifiedModuleName enumModule , VBAParser . EnumerationStmtContext enumStmt , IMutableParseTreeVisitorResults knownResults )
459
466
{
460
467
var valueResults = knownResults ;
461
- foreach ( var qualifiedEnumStmt in enumStmtContexts )
462
- {
463
- var module = qualifiedEnumStmt . ModuleName ;
464
- var enumStmt = qualifiedEnumStmt . Context ;
465
- long enumAssignedValue = - 1 ;
466
- var enumConstContexts = enumStmt . children
467
- . OfType < VBAParser . EnumerationStmt_ConstantContext > ( ) ;
468
- foreach ( var enumConstContext in enumConstContexts )
468
+ long enumAssignedValue = - 1 ;
469
+ var enumConstContexts = enumStmt . children
470
+ . OfType < VBAParser . EnumerationStmt_ConstantContext > ( ) ;
471
+ foreach ( var enumConstContext in enumConstContexts )
472
+ {
473
+ enumAssignedValue ++ ;
474
+ var enumMember = new EnumMember ( enumConstContext , enumAssignedValue ) ;
475
+ if ( enumMember . HasAssignment )
469
476
{
470
- enumAssignedValue ++ ;
471
- var enumMember = new EnumMember ( enumConstContext , enumAssignedValue ) ;
472
- if ( enumMember . HasAssignment )
477
+ valueResults = Visit ( enumModule , enumMember . ConstantContext , valueResults ) ;
478
+
479
+ var ( valueText , resultValues ) = GetConstantContextValueToken ( enumModule , enumMember . ConstantContext , valueResults ) ;
480
+ valueResults = resultValues ;
481
+ if ( ! valueText . Equals ( string . Empty ) )
473
482
{
474
- valueResults = Visit ( module , enumMember . ConstantContext , valueResults ) ;
475
-
476
- var ( valueText , resultValues ) = GetConstantContextValueToken ( module , enumMember . ConstantContext , valueResults ) ;
477
- valueResults = resultValues ;
478
- if ( ! valueText . Equals ( string . Empty ) )
479
- {
480
- enumMember . Value = long . Parse ( valueText ) ;
481
- enumAssignedValue = enumMember . Value ;
482
- }
483
+ enumMember . Value = long . Parse ( valueText ) ;
484
+ enumAssignedValue = enumMember . Value ;
483
485
}
484
- valueResults . Add ( enumMember ) ;
485
486
}
487
+ valueResults . AddEnumMember ( enumStmt , enumMember ) ;
486
488
}
487
489
488
490
return valueResults ;
0 commit comments