public class MethodVariantInheritanceASTTransformation
extends Object
implements ASTTransformation
Inherits a method-level Decreases termination measure onto an override that does not
redeclare it — mirroring how groovy-contracts inherits @Requires/@Ensures (Liskov
substitution). Because such an override carries no annotation of its own, the per-annotation
MethodVariantASTTransformation never fires on it; this global transform fills that gap.
For each concrete method that overrides a super-type method carrying @Decreases (and does
not declare its own), the ancestor's measure — re-mapped from the ancestor's parameter names to
the override's, since an override may rename parameters — is woven onto the override via
MethodVariantASTTransformation.weaveMeasure. An override is free to declare its own
@Decreases to refine the measure; in that case the local transform handles it and this one
skips it.
Limitation: the ancestor's measure must be available as source AST (same compilation unit). When the ancestor is a precompiled (binary) super-type, its measure closure survives only as a generated class, so the override degrades to no recursion check — sound (conservative), and a documented follow-up.