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 strictly decreases on every iteration and remains non-negative.

The transformation injects code to:

  1. Save the expression value at the start of each iteration.
  2. Re-evaluate it at the end of the iteration.
  3. Assert the value has strictly decreased.
  4. Assert the value is non-negative.

Example:

 int n = 10
 @Decreases({ n })
 while (n > 0) {
     n--
 }
 
Since:
6.0.0
See Also:
  • Constructor Details

    • LoopVariantASTTransformation

      public LoopVariantASTTransformation()
  • Method Details

    • setCompilationUnit

      public void setCompilationUnit(CompilationUnit unit)
      Description copied from interface: CompilationUnitAware
      Sets the compilation unit currently applying this transformation.
      Specified by:
      setCompilationUnit in interface CompilationUnitAware
      Parameters:
      unit - the active compilation unit
    • visit

      public void visit(ASTNode[] nodes, SourceUnit source)
      Rewrites a loop-level Decreases annotation into variant bookkeeping and runtime checks.
      Specified by:
      visit in interface ASTTransformation
      Parameters:
      nodes - the annotated AST nodes supplied by the compiler
      source - the current source unit