Skip to content

Commit 238e276

Browse files
skehrliSascha Kehrli
and
Sascha Kehrli
authored
Augment arrayaccess node
Co-authored-by: Sascha Kehrli <[email protected]>
1 parent b1ff230 commit 238e276

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

dataflow/src/main/java/org/checkerframework/dataflow/cfg/builder/CFGTranslationPhaseOne.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3123,6 +3123,7 @@ public Node visitEnhancedForLoop(EnhancedForLoopTree tree, Void p) {
31233123
handleArtificialTree(arrayAccess);
31243124
ArrayAccessNode arrayAccessNode = new ArrayAccessNode(arrayAccess, arrayNode2, indexNode2);
31253125
arrayAccessNode.setArrayExpression(expression);
3126+
arrayAccessNode.setEnhancedForLoop(tree);
31263127
arrayAccessNode.setInSource(false);
31273128
extendWithNode(arrayAccessNode);
31283129
AssignmentNode arrayAccessAssignNode =
@@ -3133,6 +3134,7 @@ public Node visitEnhancedForLoop(EnhancedForLoopTree tree, Void p) {
31333134
Node arrayAccessAssignNodeExpr = arrayAccessAssignNode.getExpression();
31343135
if (arrayAccessAssignNodeExpr instanceof ArrayAccessNode) {
31353136
((ArrayAccessNode) arrayAccessAssignNodeExpr).setArrayExpression(expression);
3137+
((ArrayAccessNode) arrayAccessAssignNodeExpr).setEnhancedForLoop(tree);
31363138
} else if (arrayAccessAssignNodeExpr instanceof MethodInvocationNode) {
31373139
// If the array component type is a primitive, there may be a boxing or unboxing
31383140
// conversion. Treat that as an iterator.

dataflow/src/main/java/org/checkerframework/dataflow/cfg/node/ArrayAccessNode.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.checkerframework.dataflow.cfg.node;
22

33
import com.sun.source.tree.ArrayAccessTree;
4+
import com.sun.source.tree.EnhancedForLoopTree;
45
import com.sun.source.tree.ExpressionTree;
56
import com.sun.source.tree.Tree;
67
import java.util.Arrays;
@@ -39,6 +40,14 @@ public class ArrayAccessNode extends Node {
3940
*/
4041
protected @Nullable ExpressionTree arrayExpression;
4142

43+
/**
44+
* If this ArrayAccessNode is a node for an array access desugared from an enhanced for loop, then
45+
* the {@code enhancedForLoop} field is the {@code EnhancedForLoopTree} AST node.
46+
*
47+
* <p>Is set by {@link #setEnhancedForLoop}.
48+
*/
49+
protected @Nullable EnhancedForLoopTree enhancedForLoop;
50+
4251
/**
4352
* Create an ArrayAccessNode.
4453
*
@@ -75,6 +84,27 @@ public void setArrayExpression(@Nullable ExpressionTree arrayExpression) {
7584
this.arrayExpression = arrayExpression;
7685
}
7786

87+
/**
88+
* If this ArrayAccessNode is a node for an array access desugared from an enhanced for loop, then
89+
* return the {@code EnhancedForLoopTree} AST node. Otherwise, return null.
90+
*
91+
* @return the {@code EnhancedForLoopTree}, or null if this is not an array access desugared from
92+
* an enhanced for loop
93+
*/
94+
public @Nullable EnhancedForLoopTree getEnhancedForLoop() {
95+
return enhancedForLoop;
96+
}
97+
98+
/**
99+
* Set the enhanced for loop from which {@code this} is desugared from.
100+
*
101+
* @param enhancedForLoop the {@code EnhancedForLoopTree}
102+
* @see #getEnhancedForLoop()
103+
*/
104+
public void setEnhancedForLoop(@Nullable EnhancedForLoopTree enhancedForLoop) {
105+
this.enhancedForLoop = enhancedForLoop;
106+
}
107+
78108
/**
79109
* Get the node that represents the array expression being accessed.
80110
*

0 commit comments

Comments
 (0)