public class LoopInvariantASTTransformation
extends Object
implements ASTTransformation, CompilationUnitAware
Handles Invariant annotations placed on loop statements (for,
while, do-while). For for and while loops the
invariant closure is evaluated as an assertion at the start of each loop
iteration. For do-while loops it is evaluated after each body
execution instead (GROOVY-12128): the body runs before the first condition
check, so the invariant only needs to be established by that first execution —
checking it at loop entry would reject valid loops. (A continue inside
a do-while jumps straight to the condition and therefore skips the
check for that pass.)
When @Invariant is placed on a class (its original usage), this
transform returns immediately, letting the existing global contract pipeline
handle it.
Example:
int sum = 0
@Invariant({ 0 <= i && i <= 4 })
for (int i in 0..4) {
sum += i
}
| Type Params | Return Type | Name and description |
|---|---|---|
|
public void |
setCompilationUnit(CompilationUnit unit) |
|
public void |
visit(ASTNode[] nodes, SourceUnit source)Rewrites a loop-level Invariant annotation into assertion checks injected at the start of the loop body. |
Rewrites a loop-level Invariant annotation into assertion checks injected at the start of the loop body.
nodes - the annotated AST nodes supplied by the compilersource - the current source unit