Package org.apache.groovy.contracts.ast
Class LoopVariantASTTransformation
java.lang.Object
org.apache.groovy.contracts.ast.LoopVariantASTTransformation
- All Implemented Interfaces:
ASTTransformation
Handles
Decreases annotations placed on loop statements (for,
while, do-while). The closure must return a value that
strictly decreases on every iteration and remains non-negative.
The transformation injects code to:
- Save the expression value at the start of each iteration.
- Re-evaluate it at the end of the iteration.
- Assert the value has strictly decreased.
- Assert the value is non-negative.
Example:
int n = 10
@Decreases({ n })
while (n > 0) {
n--
}
- Since:
- 6.0.0
- See Also:
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionstatic voidcheckDecreased(Object prev, Object curr) Runtime check called from generated code.voidvisit(ASTNode[] nodes, SourceUnit source) Rewrites a loop-levelDecreasesannotation into variant bookkeeping and runtime checks.
-
Constructor Details
-
LoopVariantASTTransformation
public LoopVariantASTTransformation()
-
-
Method Details
-
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
-
checkDecreased
Runtime check called from generated code. ThrowsLoopVariantViolationif the variant did not strictly decrease or became negative.If both values are
Lists, they are compared lexicographically: the first position where values differ must show a strict decrease; all earlier positions must be equal. If all positions are equal, the variant has not decreased and a violation is thrown.
-