Package org.apache.groovy.contracts.ast
Class LoopVariantASTTransformation
java.lang.Object
org.apache.groovy.contracts.ast.LoopVariantASTTransformation
- All Implemented Interfaces:
CompilationUnitAware,ASTTransformation
public class LoopVariantASTTransformation
extends Object
implements ASTTransformation, CompilationUnitAware
Handles
Decreases annotations placed on loop statements (for,
while, do-while). The closure must return a value that is
non-negative at the start of each iteration and strictly decreases between
consecutive iterations.
The transformation injects code to:
- Evaluate the expression at the start of each iteration.
- On the first iteration, assert a scalar measure is non-negative at loop entry (well-foundedness).
- On subsequent iterations, assert it has strictly decreased since the
previous iteration start, and is non-negative (GROOVY-12128: comparing
iteration starts — rather than the start and end of one pass — sees
progress made by a classic
forloop's update expression, which runs after the body, and does not demand non-negativity after the final body execution).
Example:
int n = 10
@Decreases({ n })
while (n > 0) {
n--
}
- Since:
- 6.0.0
- See Also:
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidSets the compilation unit currently applying this transformation.voidvisit(ASTNode[] nodes, SourceUnit source) Rewrites a loop-levelDecreasesannotation into variant bookkeeping and runtime checks.
-
Constructor Details
-
LoopVariantASTTransformation
public LoopVariantASTTransformation()
-
-
Method Details
-
setCompilationUnit
Description copied from interface:CompilationUnitAwareSets the compilation unit currently applying this transformation.- Specified by:
setCompilationUnitin interfaceCompilationUnitAware- Parameters:
unit- the active compilation unit
-
visit
Rewrites a loop-levelDecreasesannotation into variant bookkeeping and runtime checks.- Specified by:
visitin interfaceASTTransformation- Parameters:
nodes- the annotated AST nodes supplied by the compilersource- the current source unit
-