@@ -614,51 +614,40 @@ public void Resolve(VBAParser.AsTypeClauseContext context)
614
614
615
615
public void Resolve ( VBAParser . ForNextStmtContext context )
616
616
{
617
+ var expressions = context . expression ( ) ;
618
+
617
619
// In "For expr1 = expr2" the "expr1 = expr2" part is treated as a single expression.
618
- var assignmentExpr = ( ( VBAParser . RelationalOpContext ) context . expression ( ) [ 0 ] ) ;
619
- var lExpr = assignmentExpr . expression ( ) [ 0 ] ;
620
- var withExpression = GetInnerMostWithExpression ( ) ;
621
- var firstExpression = _bindingService . ResolveDefault (
622
- _moduleDeclaration ,
623
- _currentParent ,
624
- lExpr ,
625
- withExpression ,
626
- StatementResolutionContext . Undefined ,
627
- true ) ;
628
- if ( firstExpression . Classification != ExpressionClassification . ResolutionFailed )
629
- {
630
- // each iteration counts as an assignment
620
+ var assignmentExpr = ( ( VBAParser . RelationalOpContext ) expressions [ 0 ] ) ;
621
+ ResolveStartValueAssignmentOfForNext ( assignmentExpr ) ;
631
622
632
- _failedResolutionVisitor . CollectUnresolved ( firstExpression , _currentParent , withExpression ) ;
633
- _boundExpressionVisitor . AddIdentifierReferences (
634
- firstExpression ,
635
- _qualifiedModuleName ,
636
- _currentScope ,
637
- _currentParent ,
638
- true ) ;
639
- }
640
- var rExpr = assignmentExpr . expression ( ) [ 1 ] ;
641
- var secondExpression = _bindingService . ResolveDefault (
642
- _moduleDeclaration ,
643
- _currentParent ,
644
- rExpr ,
645
- withExpression ,
646
- StatementResolutionContext . Undefined ,
647
- true ) ;
648
- _failedResolutionVisitor . CollectUnresolved ( secondExpression , _currentParent , withExpression ) ;
649
- _boundExpressionVisitor . AddIdentifierReferences (
650
- secondExpression ,
651
- _qualifiedModuleName ,
652
- _currentScope ,
653
- _currentParent ) ;
654
-
655
- ResolveDefault ( context . expression ( ) [ 1 ] , true ) ;
623
+ ResolveToValueOfForNext ( expressions [ 1 ] ) ;
656
624
657
625
var stepStatement = context . stepStmt ( ) ;
658
626
if ( stepStatement != null )
659
627
{
660
628
Resolve ( stepStatement ) ;
661
629
}
630
+
631
+ const int firstNextExpressionIndex = 2 ;
632
+ for ( var exprIndex = firstNextExpressionIndex ; exprIndex < expressions . Length ; exprIndex ++ )
633
+ {
634
+ ResolveDefault ( expressions [ exprIndex ] ) ;
635
+ }
636
+ }
637
+
638
+ private void ResolveStartValueAssignmentOfForNext ( VBAParser . RelationalOpContext expression )
639
+ {
640
+ var expressions = expression . expression ( ) ;
641
+ var elementVariableExpression = expressions [ 0 ] ;
642
+ ResolveDefault ( elementVariableExpression , requiresLetCoercion : true , isAssignmentTarget : true ) ;
643
+
644
+ var startValueExpression = expressions [ 1 ] ;
645
+ ResolveDefault ( startValueExpression , requiresLetCoercion : true ) ;
646
+ }
647
+
648
+ private void ResolveToValueOfForNext ( ParserRuleContext expression )
649
+ {
650
+ ResolveDefault ( expression , requiresLetCoercion : true ) ;
662
651
}
663
652
664
653
private void Resolve ( VBAParser . StepStmtContext context )
@@ -668,38 +657,18 @@ private void Resolve(VBAParser.StepStmtContext context)
668
657
669
658
public void Resolve ( VBAParser . ForEachStmtContext context )
670
659
{
671
- var withExpression = GetInnerMostWithExpression ( ) ;
672
- var firstExpression = _bindingService . ResolveDefault (
673
- _moduleDeclaration ,
674
- _currentParent ,
675
- context . expression ( ) [ 0 ] ,
676
- withExpression ,
677
- StatementResolutionContext . Undefined ,
678
- false ) ;
679
- if ( firstExpression . Classification == ExpressionClassification . ResolutionFailed )
680
- {
660
+ var expressions = context . expression ( ) ;
681
661
682
- _failedResolutionVisitor . CollectUnresolved ( firstExpression , _currentParent , withExpression ) ;
683
- _boundExpressionVisitor . AddIdentifierReferences (
684
- firstExpression ,
685
- _qualifiedModuleName ,
686
- _currentScope ,
687
- _currentParent ) ;
688
- }
689
- else
690
- {
691
- // each iteration counts as an assignment
692
- _failedResolutionVisitor . CollectUnresolved ( firstExpression , _currentParent , withExpression ) ;
693
- _boundExpressionVisitor . AddIdentifierReferences (
694
- firstExpression ,
695
- _qualifiedModuleName ,
696
- _currentScope ,
697
- _currentParent ,
698
- true ) ;
699
- }
700
- for ( var exprIndex = 1 ; exprIndex < context . expression ( ) . Length ; exprIndex ++ )
662
+ var elementVariableExpression = expressions [ 0 ] ;
663
+ ResolveDefault ( elementVariableExpression , isAssignmentTarget : true ) ;
664
+
665
+ var collectionExpression = expressions [ 1 ] ;
666
+ ResolveDefault ( collectionExpression ) ;
667
+
668
+ const int firstNextExpressionIndex = 2 ;
669
+ for ( var exprIndex = firstNextExpressionIndex ; exprIndex < context . expression ( ) . Length ; exprIndex ++ )
701
670
{
702
- ResolveDefault ( context . expression ( ) [ exprIndex ] , false ) ;
671
+ ResolveDefault ( expressions [ exprIndex ] ) ;
703
672
}
704
673
}
705
674
0 commit comments