Package: org.apache.groovy.contracts.generation

## [Java] Class BaseGenerator

- org.apache.groovy.contracts.generation.BaseGenerator

-     public abstract class BaseGenerator
      extends Object

  Base class for groovy-contracts code generators.

- - ### Field Summary

    Fields
    Modifiers | Name | Description
    --- | --- | ---
    `static String` | `INVARIANT_CLOSURE_PREFIX` | Prefix used for synthetic methods that evaluate class invariants.
    `static String` | `META_DATA_USE_INLINE_MODE` | Node metadata flag indicating that assertions can be emitted in inline mode.
    `protected ReaderSource` | `source` | Reader source used by generators that need source-aware AST construction.

  - ### Constructor Summary

    Constructors
    Constructor and description
    `protected BaseGenerator(ReaderSource source)` Creates a generator bound to the supplied reader source.

  - ### Methods Summary

    Methods
    Type Params | Return Type | Name and description
    --- | --- | ---
    `` | `protected BooleanExpression` | `addCallsToSuperMethodNodeAnnotationClosure(ClassNode type, MethodNode methodNode, Class<? extends Annotation> annotationType, BooleanExpression booleanExpression, boolean isPostcondition)` Merges inherited contract closures into the supplied predicate for the given method.
    `` | `protected static void` | `ensureBlockBody(MethodNode method)` Ensures the given method's body is a BlockStatement so that contract code generators can weave assertions into it.
    `` | `protected BlockStatement` | `getInlineModeBlockStatement(BlockStatement blockStatement)` Extracts the inline-mode assertion block from the supplied wrapper block.
    `` | `public static String` | `getInvariantMethodName(ClassNode classNode)` Parameters: `classNode` - the ClassNode used to look up the invariant closure field
    `` | `public static MethodNode` | `getInvariantMethodNode(ClassNode classNode)` Parameters: `classNode` - the ClassNode used to look up the invariant closure field
    `` | `protected static String` | `inlineModeKey(Class<? extends Annotation> annotationType)` The inline-mode node-metadata key for one contract kind.
    `` | `protected BlockStatement` | `wrapAssertionBooleanExpression(ClassNode type, MethodNode methodNode, BooleanExpression classInvariantExpression, String assertionType)` Wraps a contract predicate with tracking, violation rethrowing, and execution guards.

  - ### Inherited Methods Summary

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

- - ### Field Detail

    - #### public static final String INVARIANT_CLOSURE_PREFIX

      Prefix used for synthetic methods that evaluate class invariants.

    - #### public static final String META_DATA_USE_INLINE_MODE

      Node metadata flag indicating that assertions can be emitted in inline mode.

    - #### protected final ReaderSource source

      Reader source used by generators that need source-aware AST construction.

  - ### Constructor Detail

    - #### protected BaseGenerator(ReaderSource source)

      Creates a generator bound to the supplied reader source.

      Parameters:
        `source` - the reader source backing the current source unit

  - ### Method Detail

    - #### protected BooleanExpression addCallsToSuperMethodNodeAnnotationClosure(ClassNode type, MethodNode methodNode, Class<? extends Annotation> annotationType, BooleanExpression booleanExpression, boolean isPostcondition)

      Merges inherited contract closures into the supplied predicate for the given method.

      Parameters:
        `type` - the declaring class
        `methodNode` - the method whose inherited contracts should be consulted
        `annotationType` - the contract meta-annotation to search for
        `booleanExpression` - the predicate built from the current declaration
        `isPostcondition` - whether postcondition calling conventions should be used
      Returns:
        the predicate augmented with inherited contract closures

    - #### protected static void ensureBlockBody(MethodNode method)

      Ensures the given method's body is a BlockStatement so that contract code generators can weave assertions into it. Earlier transforms (e.g. `@Synchronized`, which runs at CANONICALIZATION) may have replaced the body with a non-block statement such as a `SynchronizedStatement`; in that case the original statement is wrapped in a fresh block. A `null` body (e.g. an abstract method or a not-yet-populated synthetic body) is left untouched. Mirrors the body normalization the precondition path already performs (GROOVY-12066) so the post-condition and invariant generators see a consistent body shape (GROOVY-12084).

      Parameters:
        `method` - the method whose body should be normalized to a block

    - #### protected BlockStatement getInlineModeBlockStatement(BlockStatement blockStatement)

      Extracts the inline-mode assertion block from the supplied wrapper block.

      Parameters:
        `blockStatement` - the block containing generated assertion statements
      Returns:
        an inline-mode block guarded by the contracts-enabled flag

    - #### public static String getInvariantMethodName(ClassNode classNode)

      Parameters:
        `classNode` - the ClassNode used to look up the invariant closure field
      Returns:
        the field name of the invariant closure field of the given `classNode`

    - #### public static MethodNode getInvariantMethodNode(ClassNode classNode)

      Parameters:
        `classNode` - the ClassNode used to look up the invariant closure field
      Returns:
        the MethodNode which contains the invariant of the given `classNode`

    - #### protected static String inlineModeKey(Class<? extends Annotation> annotationType)

      The inline-mode node-metadata key for one contract kind. The flag is written while composing inherited contract calls and read when generating that kind's assertion; it MUST be qualified by kind — preconditions are processed before postconditions, and a single shared key let the precondition pass's "no inherited preconditions" verdict leak into the postcondition generator, whose inline path then dropped composed inherited postconditions.

      Parameters:
        `annotationType` - the contract kind's meta annotation (Precondition/Postcondition)
      Returns:
        the per-kind metadata key

    - #### protected BlockStatement wrapAssertionBooleanExpression(ClassNode type, MethodNode methodNode, BooleanExpression classInvariantExpression, String assertionType)

      Wraps a contract predicate with tracking, violation rethrowing, and execution guards.

      Parameters:
        `type` - the declaring class
        `methodNode` - the method whose assertion is being emitted
        `classInvariantExpression` - the predicate to evaluate
        `assertionType` - the logical assertion kind
      Returns:
        the generated wrapper block