Package: org.apache.groovy.contracts.ast

## [Java] Class LoopVariantASTTransformation

- org.apache.groovy.contracts.ast.LoopVariantASTTransformation

- All Implemented Interfaces and Traits:
    ASTTransformation, CompilationUnitAware

      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:

  1. Evaluate the expression at the start of each iteration.
  2. On the first iteration, assert a scalar measure is non-negative at loop entry (well-foundedness).
  3. 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 `for` loop's update expression, which runs after the body, and does not demand non-negativity after the final body execution).
  The final iteration's decrease is intentionally unchecked: a loop that has exited needs no further termination evidence.

  Example:

       int n = 10
       @Decreases({ n })
       while (n > 0) {
           n--
       }

  Since:
    6.0.0
  See Also:
    Decreases
    VariantSupport
    LoopVariantViolation

- - ### Methods Summary

    Methods
    Type Params | Return Type | Name and description
    --- | --- | ---
    `` | `public void` | `setCompilationUnit(CompilationUnit unit)`
    `` | `public void` | `visit(ASTNode[] nodes, SourceUnit source)` Rewrites a loop-level Decreases annotation into variant bookkeeping and runtime checks.

  - ### Inherited Methods Summary

    Inherited Methods
    Methods inherited from class | Name
    --- | ---
    `class Object` | `equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Method Detail

    - #### public void setCompilationUnit(CompilationUnit unit)

    - #### public void visit(ASTNode[] nodes, SourceUnit source)

      Rewrites a loop-level Decreases annotation into variant bookkeeping and runtime checks.

      Parameters:
        `nodes` - the annotated AST nodes supplied by the compiler
        `source` - the current source unit