@@ -453,10 +453,21 @@ public void visitExpressionStatement(ExpressionStatement node) {
453
453
visitMutatedVariable (target );
454
454
visit (target );
455
455
}
456
+ return ;
456
457
}
457
- else {
458
- super .visitExpressionStatement (node );
458
+ if ( exp instanceof MethodCallExpression mce ) {
459
+ var source = mce .getObjectExpression ();
460
+ var target = checkSetAssignment (mce );
461
+ if ( target != null ) {
462
+ visit (source );
463
+ declareAssignedVariable (target );
464
+ var ae = new AssignmentExpression (target , source );
465
+ ae .setSourcePosition (mce );
466
+ node .setExpression (ae );
467
+ return ;
468
+ }
459
469
}
470
+ super .visitExpressionStatement (node );
460
471
}
461
472
462
473
/**
@@ -485,6 +496,7 @@ private boolean declareAssignedVariable(VariableExpression ve) {
485
496
addError ("Built-in variable cannot be re-assigned" , ve );
486
497
else
487
498
checkExternalWriteInClosure (ve , variable );
499
+ ve .setAccessedVariable (variable );
488
500
return false ;
489
501
}
490
502
else if ( currentDefinition instanceof ProcessNode || currentDefinition instanceof WorkflowNode ) {
@@ -549,6 +561,21 @@ private void checkExternalWriteInClosure(VariableExpression target, Variable var
549
561
addFutureWarning ("Mutating an external variable in a closure may lead to a race condition" , target , "External variable declared here" , (ASTNode ) variable );
550
562
}
551
563
564
+ /**
565
+ * Treat `set` operator as an assignment.
566
+ */
567
+ private VariableExpression checkSetAssignment (MethodCallExpression node ) {
568
+ if ( !(currentDefinition instanceof WorkflowNode ) )
569
+ return null ;
570
+ var name = node .getMethodAsString ();
571
+ if ( !"set" .equals (name ) )
572
+ return null ;
573
+ var code = asDslBlock (node , 1 );
574
+ if ( code == null || code .getStatements ().size () != 1 )
575
+ return null ;
576
+ return asVarX (code .getStatements ().get (0 ));
577
+ }
578
+
552
579
// expressions
553
580
554
581
private static final List <String > KEYWORDS = List .of (
@@ -560,9 +587,6 @@ private void checkExternalWriteInClosure(VariableExpression target, Variable var
560
587
561
588
@ Override
562
589
public void visitMethodCallExpression (MethodCallExpression node ) {
563
- if ( currentDefinition instanceof WorkflowNode ) {
564
- visitAssignmentOperator (node );
565
- }
566
590
if ( node .isImplicitThis () && node .getMethod () instanceof ConstantExpression ) {
567
591
var name = node .getMethodAsString ();
568
592
var variable = findVariableDeclaration (name , node );
@@ -574,25 +598,6 @@ public void visitMethodCallExpression(MethodCallExpression node) {
574
598
super .visitMethodCallExpression (node );
575
599
}
576
600
577
- /**
578
- * Treat `set` operator as an assignment.
579
- */
580
- private void visitAssignmentOperator (MethodCallExpression node ) {
581
- var name = node .getMethodAsString ();
582
- if ( !("set" .equals (name ) || "tap" .equals (name )) )
583
- return ;
584
- var code = asDslBlock (node , 1 );
585
- if ( code == null || code .getStatements ().size () != 1 )
586
- return ;
587
- var varX = asVarX (code .getStatements ().get (0 ));
588
- if ( varX == null )
589
- return ;
590
- var scope = currentScope ;
591
- currentScope = currentDefinition .getVariableScope ();
592
- declare (varX );
593
- currentScope = scope ;
594
- }
595
-
596
601
@ Override
597
602
public void visitDeclarationExpression (DeclarationExpression node ) {
598
603
visit (node .getRightExpression ());
0 commit comments