You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by bl...@apache.org on 2026/08/06 23:23:22 UTC

(groovy) 01/01: GroovyABI annotation to mark mainly methods as used through the compiler and have special requirements for backwards compatibility

This is an automated email from the ASF dual-hosted git repository.

blackdrag pushed a commit to branch feature/Groovy_abi
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit ce12a74a721943d1c44a77c09378b9931674f180
Author: Jochen Theodorou <jo...@karakun.com>
AuthorDate: Fri Aug 7 01:19:47 2026 +0200

    GroovyABI annotation to mark mainly methods as used through the compiler and have special requirements for backwards compatibility
---
 src/main/java/groovy/concurrent/Awaitable.java     |   2 +
 src/main/java/groovy/lang/Closure.java             |   2 +
 src/main/java/groovy/lang/Reference.java           |   3 +
 .../groovy/ast/tools/ConstructorNodeUtils.java     |   2 +
 .../apache/groovy/lang/annotation/GroovyABI.java   |  61 ++++++++++++
 .../apache/groovy/runtime/async/AsyncSupport.java  |  13 +++
 .../transform/copywith/NestedCopyWithSupport.java  |   3 +
 src/main/java/org/apache/groovy/util/Maps.java     | 102 +++++++++++++++++++++
 .../classgen/asm/BinaryExpressionHelper.java       |   1 -
 .../groovy/classgen/asm/ClosureWriter.java         |   1 -
 .../classgen/asm/sc/StaticTypesCallSiteWriter.java |   3 +-
 .../org/codehaus/groovy/reflection/ClassInfo.java  |   3 +
 .../codehaus/groovy/runtime/CurriedClosure.java    |   2 +
 .../groovy/runtime/DefaultGroovyMethods.java       |  14 +++
 .../org/codehaus/groovy/runtime/FormatHelper.java  |   3 +
 .../org/codehaus/groovy/runtime/GStringImpl.java   |   2 +
 .../org/codehaus/groovy/runtime/InvokerHelper.java |  10 ++
 .../groovy/runtime/MultipleAssignmentSupport.java  |   3 +
 .../groovy/runtime/ScriptBytecodeAdapter.java      |   5 +
 .../groovy/runtime/StringGroovyMethods.java        |   2 +
 .../groovy/runtime/dgmimpl/NumberNumberDiv.java    |   2 +
 .../groovy/runtime/dgmimpl/NumberNumberMinus.java  |   2 +
 .../runtime/dgmimpl/NumberNumberMultiply.java      |   2 +
 .../runtime/powerassert/AssertionRenderer.java     |   2 +
 .../groovy/runtime/powerassert/ValueRecorder.java  |   4 +
 .../typehandling/DefaultTypeTransformation.java    |  18 ++++
 .../groovy/runtime/typehandling/NumberMath.java    |  10 ++
 .../transform/ImmutableASTTransformation.java      |   5 +-
 .../org/codehaus/groovy/util/HashCodeHelper.java   |  23 +++++
 .../codehaus/groovy/vmplugin/v7/IndyInterface.java |   2 +
 .../codehaus/groovy/vmplugin/v8/IndyInterface.java |   5 +
 .../codehaus/groovy/runtime/callsite/CallSite.java |  31 +++++++
 .../groovy/runtime/callsite/CallSiteArray.java     |   2 +
 .../apache/groovy/contracts/ViolationTracker.java  |  10 ++
 .../groovy/contracts/generation/Configurator.java  |   3 +
 .../generation/ContractExecutionTracker.java       |   3 +
 .../apache/groovy/contracts/util/FieldValues.java  |   4 +
 .../provider/collection/runtime/NamedRecord.groovy |   2 +
 .../provider/collection/runtime/Queryable.java     |   5 +
 .../collection/runtime/QueryableHelper.groovy      |   8 ++
 .../collection/runtime/WindowDefinition.java       |  12 +++
 .../groovy/macro/runtime/MacroBuilder.java         |   4 +
 42 files changed, 391 insertions(+), 5 deletions(-)

diff --git a/src/main/java/groovy/concurrent/Awaitable.java b/src/main/java/groovy/concurrent/Awaitable.java
index bb941cd1e7..782b899227 100644
--- a/src/main/java/groovy/concurrent/Awaitable.java
+++ b/src/main/java/groovy/concurrent/Awaitable.java
@@ -18,6 +18,7 @@
  */
 package groovy.concurrent;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.apache.groovy.runtime.async.AsyncSupport;
 import org.apache.groovy.runtime.async.GroovyPromise;
 
@@ -416,6 +417,7 @@ public interface Awaitable<T> {
      * @param sources the awaitables, futures, or adapted objects to wait for
      * @return an awaitable that resolves to a list of results
      */
+    @GroovyABI(since="6.0.0")
     static Awaitable<List<Object>> all(Object... sources) {
         return AsyncSupport.allAsync(sources);
     }
diff --git a/src/main/java/groovy/lang/Closure.java b/src/main/java/groovy/lang/Closure.java
index bb7f50010d..9a3b638f89 100644
--- a/src/main/java/groovy/lang/Closure.java
+++ b/src/main/java/groovy/lang/Closure.java
@@ -20,6 +20,7 @@ package groovy.lang;
 
 import org.apache.groovy.internal.util.UncheckedThrow;
 import org.apache.groovy.io.StringBuilderWriter;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.apache.groovy.util.Maps;
 import org.codehaus.groovy.reflection.ReflectionCache;
 import org.codehaus.groovy.reflection.stdclasses.CachedClosureClass;
@@ -345,6 +346,7 @@ public abstract class Closure<V> extends GroovyObjectSupport implements Cloneabl
      *
      * @return the lexical {@code this} object
      */
+    @GroovyABI(since = "1.0")
     public Object getThisObject() {
         return thisObject;
     }
diff --git a/src/main/java/groovy/lang/Reference.java b/src/main/java/groovy/lang/Reference.java
index f54f9b5c01..8fa5c759ba 100644
--- a/src/main/java/groovy/lang/Reference.java
+++ b/src/main/java/groovy/lang/Reference.java
@@ -18,6 +18,7 @@
  */
 package groovy.lang;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.runtime.InvokerHelper;
 
 import java.io.Serial;
@@ -96,6 +97,7 @@ public class Reference<T> extends GroovyObjectSupport implements Serializable {
      *
      * @return the referenced value
      */
+    @GroovyABI(since = "1.0")
     public T get() {
         return value;
     }
@@ -105,6 +107,7 @@ public class Reference<T> extends GroovyObjectSupport implements Serializable {
      *
      * @param value the new value
      */
+    @GroovyABI(since = "1.0")
     public void set(T value) {
         this.value = value;
     }
diff --git a/src/main/java/org/apache/groovy/ast/tools/ConstructorNodeUtils.java b/src/main/java/org/apache/groovy/ast/tools/ConstructorNodeUtils.java
index 63ca17af78..19636cbb5f 100644
--- a/src/main/java/org/apache/groovy/ast/tools/ConstructorNodeUtils.java
+++ b/src/main/java/org/apache/groovy/ast/tools/ConstructorNodeUtils.java
@@ -18,6 +18,7 @@
  */
 package org.apache.groovy.ast.tools;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.ast.ClassHelper;
 import org.codehaus.groovy.ast.ClassNode;
 import org.codehaus.groovy.ast.Parameter;
@@ -97,6 +98,7 @@ public class ConstructorNodeUtils {
      * @param props the properties accepted by the constructor
      * @return a statement that performs the validation
      */
+    @GroovyABI(since="4.0.0")
     public static Statement checkPropNamesS(final VariableExpression namedArgs, final boolean pojo, final List<PropertyNode> props) {
         if (!pojo) {
             return stmt(callX(IMMUTABLE_TYPE, "checkPropNames", args(varX("this"), namedArgs)));
diff --git a/src/main/java/org/apache/groovy/lang/annotation/GroovyABI.java b/src/main/java/org/apache/groovy/lang/annotation/GroovyABI.java
new file mode 100644
index 0000000000..e397df8d97
--- /dev/null
+++ b/src/main/java/org/apache/groovy/lang/annotation/GroovyABI.java
@@ -0,0 +1,61 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.groovy.lang.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+/**
+ * Marks a program element as part of Groovy's binary ABI.
+ * <p>
+ * Elements annotated with {@code @GroovyABI} may be referenced directly by
+ * bytecode generated by the Groovy compiler. Their signatures and semantics
+ * therefore form part of the compatibility contract between compiled Groovy
+ * classes and the Groovy runtime.
+ * <p>
+ * Changes to annotated elements must preserve binary compatibility with
+ * previously compiled Groovy code unless the corresponding compatibility
+ * guarantee is intentionally dropped.
+ * <p>
+ * This annotation is intended only for members that are referenced by
+ * bytecode which may outlive the compiler version that produced it. Members
+ * used exclusively by bytecode generated at runtime by the current Groovy
+ * version should not be annotated.
+ * <p>
+ * Notes:
+ * <li>groovy.*: These classes are not annotated, as they are part of public API
+ * <li>runtime packages: These classes are normally internal and subject
+ * to removal or change. These classes must use this annotation if any of their methods
+ * is referenced by the compiler.
+ * <li>AST helper classes not in runtime: Some AST transforms leverage helper classes, that
+ * are not in a runtime package. These classes must be annotated.
+ */
+@Documented
+@Target({TYPE, METHOD, CONSTRUCTOR, FIELD})
+@Retention(SOURCE)
+public @interface GroovyABI {
+    String since() default "";
+}
diff --git a/src/main/java/org/apache/groovy/runtime/async/AsyncSupport.java b/src/main/java/org/apache/groovy/runtime/async/AsyncSupport.java
index 6c78b0990b..0328ab6dd5 100644
--- a/src/main/java/org/apache/groovy/runtime/async/AsyncSupport.java
+++ b/src/main/java/org/apache/groovy/runtime/async/AsyncSupport.java
@@ -21,6 +21,7 @@ package org.apache.groovy.runtime.async;
 import groovy.concurrent.AwaitResult;
 import groovy.concurrent.Awaitable;
 import groovy.concurrent.AwaitableAdapterRegistry;
+import org.apache.groovy.lang.annotation.GroovyABI;
 
 import java.io.Closeable;
 import java.lang.reflect.InvocationTargetException;
@@ -120,6 +121,7 @@ public class AsyncSupport {
      * Blocks the calling thread until the computation completes.
      * The original exception is rethrown transparently.
      */
+    @GroovyABI(since="6.0.0")
     public static <T> T await(Awaitable<T> awaitable) {
         try {
             return awaitable.get();
@@ -131,6 +133,7 @@ public class AsyncSupport {
     }
 
     /** Awaits a {@link CompletableFuture} using non-interruptible {@code join()}. */
+    @GroovyABI(since="6.0.0")
     public static <T> T await(CompletableFuture<T> future) {
         try {
             return future.join();
@@ -142,11 +145,13 @@ public class AsyncSupport {
     }
 
     /** Awaits a {@link CompletionStage} by converting to CompletableFuture. */
+    @GroovyABI(since="6.0.0")
     public static <T> T await(CompletionStage<T> stage) {
         return await(stage.toCompletableFuture());
     }
 
     /** Awaits a {@link Future}. Delegates to the CF overload if applicable. */
+    @GroovyABI(since="6.0.0")
     public static <T> T await(Future<T> future) {
         if (future instanceof CompletableFuture<T> cf) {
             return await(cf);
@@ -171,6 +176,7 @@ public class AsyncSupport {
      * {@code CompletionStage}, and {@code Future} when a value implements more
      * than one of them (e.g. {@link CompletableFuture}).
      */
+    @GroovyABI(since="6.0.0")
     @SuppressWarnings("unchecked")
     public static <T> T await(Object source) {
         if (source == null) return null;
@@ -202,6 +208,7 @@ public class AsyncSupport {
     /**
      * Executes the given supplier asynchronously using the default executor.
      */
+    @GroovyABI(since="6.0.0")
     public static <T> Awaitable<T> async(Supplier<T> supplier) {
         return executeAsync(supplier, AsyncExecutors.getExecutor());
     }
@@ -221,6 +228,7 @@ public class AsyncSupport {
      * Called by compiler-generated code at the start of closures
      * containing {@code defer} statements.
      */
+    @GroovyABI(since="6.0.0")
     public static Deque<Callable<?>> createDeferScope() {
         return new ArrayDeque<>();
     }
@@ -229,6 +237,7 @@ public class AsyncSupport {
      * Registers a deferred action in the given scope. Actions execute in LIFO
      * order when {@link #executeDeferScope} is called (in the finally block).
      */
+    @GroovyABI(since="6.0.0")
     public static void defer(Deque<Callable<?>> scope,
                              Callable<?> action) {
         if (scope == null) {
@@ -287,6 +296,7 @@ public class AsyncSupport {
      * @param bridge the GeneratorBridge instance (injected as synthetic parameter)
      * @param value  the value to yield
      */
+    @GroovyABI(since="6.0.0")
     public static void yieldReturn(Object bridge, Object value) {
         if (!(bridge instanceof GeneratorBridge<?>)) {
             throw new IllegalStateException("yield return can only be used inside an async generator");
@@ -307,6 +317,7 @@ public class AsyncSupport {
      * @param <T>  the element type
      * @return an Iterable that yields values from the generator
      */
+    @GroovyABI(since="6.0.0")
     public static <T> Iterable<T> asyncGenerator(Consumer<Object> body) {
         Objects.requireNonNull(body, "body must not be null");
         GeneratorBridge<T> bridge = new GeneratorBridge<>();
@@ -335,6 +346,7 @@ public class AsyncSupport {
      * @param <T>    the element type
      * @return an iterable
      */
+    @GroovyABI(since="6.0.0")
     @SuppressWarnings("unchecked")
     public static <T> Iterable<T> toIterable(Object source) {
         if (source == null) return Collections.emptyList();
@@ -354,6 +366,7 @@ public class AsyncSupport {
      * cannot mask the original loop error; prefer robust {@code close()}
      * implementations.
      */
+    @GroovyABI(since="6.0.0")
     public static void closeIterable(Object source) {
         if (source instanceof Closeable c) {
             try {
diff --git a/src/main/java/org/apache/groovy/transform/copywith/NestedCopyWithSupport.java b/src/main/java/org/apache/groovy/transform/copywith/NestedCopyWithSupport.java
index 70f697b421..fe7ac4aab4 100644
--- a/src/main/java/org/apache/groovy/transform/copywith/NestedCopyWithSupport.java
+++ b/src/main/java/org/apache/groovy/transform/copywith/NestedCopyWithSupport.java
@@ -20,6 +20,7 @@ package org.apache.groovy.transform.copywith;
 
 import groovy.lang.Closure;
 import groovy.lang.GroovyRuntimeException;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.apache.groovy.lang.annotation.Incubating;
 import org.codehaus.groovy.runtime.InvokerHelper;
 
@@ -52,6 +53,7 @@ public final class NestedCopyWithSupport {
      * (nested-aware) {@code copyWith(Map)}. The block is thus pure sugar over
      * the map form, inheriting its closed-type-domain and identity guarantees.
      */
+    @GroovyABI(since="6.0.0")
     public static Object applyBlock(final Object self, final Closure<?> block) {
         Map<Object, Object> sink = new LinkedHashMap<>();
         Closure<?> c = (Closure<?>) block.clone();
@@ -63,6 +65,7 @@ public final class NestedCopyWithSupport {
     }
 
     @SuppressWarnings("unchecked")
+    @GroovyABI(since="6.0.0")
     public static Map<Object, Object> flatten(final Object self, final Map<Object, Object> raw) {
         if (raw == null) return new LinkedHashMap<>();
         Map<Object, Object> flat = new LinkedHashMap<>();
diff --git a/src/main/java/org/apache/groovy/util/Maps.java b/src/main/java/org/apache/groovy/util/Maps.java
index ff9c8b382b..0298ec5504 100644
--- a/src/main/java/org/apache/groovy/util/Maps.java
+++ b/src/main/java/org/apache/groovy/util/Maps.java
@@ -18,6 +18,8 @@
  */
 package org.apache.groovy.util;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
+
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -31,6 +33,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -42,6 +45,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -54,6 +58,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -67,6 +72,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -81,6 +87,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -96,6 +103,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -112,6 +120,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -129,6 +138,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -147,6 +157,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -166,6 +177,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -186,6 +198,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -207,6 +220,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -229,6 +243,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -252,6 +267,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -276,6 +292,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -301,6 +318,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -327,6 +345,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -354,6 +373,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -382,6 +402,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -411,6 +432,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -441,6 +463,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -472,6 +495,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -504,6 +528,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -537,6 +562,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -571,6 +597,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -606,6 +633,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -642,6 +670,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -679,6 +708,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -717,6 +747,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -756,6 +787,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -796,6 +828,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -837,6 +870,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -879,6 +913,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -922,6 +957,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v34) {
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -966,6 +1002,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1011,6 +1048,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1057,6 +1095,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1104,6 +1143,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1152,6 +1192,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1201,6 +1242,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1251,6 +1293,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1302,6 +1345,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1354,6 +1398,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1407,6 +1452,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1461,6 +1507,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1516,6 +1563,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1572,6 +1620,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1629,6 +1678,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1687,6 +1737,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1746,6 +1797,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1806,6 +1858,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1867,6 +1920,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1929,6 +1983,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -1992,6 +2047,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2056,6 +2112,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2121,6 +2178,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2187,6 +2245,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2254,6 +2313,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2322,6 +2382,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2391,6 +2452,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2461,6 +2523,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2532,6 +2595,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2604,6 +2668,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2677,6 +2742,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2751,6 +2817,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2826,6 +2893,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2902,6 +2970,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -2979,6 +3048,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3057,6 +3127,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3136,6 +3207,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3216,6 +3288,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3297,6 +3370,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3379,6 +3453,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3462,6 +3537,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3546,6 +3622,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3631,6 +3708,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3717,6 +3795,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3804,6 +3883,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3892,6 +3972,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -3981,6 +4062,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4071,6 +4153,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4162,6 +4245,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4254,6 +4338,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4347,6 +4432,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4441,6 +4527,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4536,6 +4623,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4632,6 +4720,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4729,6 +4818,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4827,6 +4917,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -4926,6 +5017,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5026,6 +5118,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5127,6 +5220,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5229,6 +5323,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5332,6 +5427,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5436,6 +5532,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5541,6 +5638,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5647,6 +5745,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5754,6 +5853,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5862,6 +5962,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
@@ -5971,6 +6072,7 @@ public class Maps {
     /**
      * Returns an immutable map containing the supplied key-value pairs in encounter order.
      */
+    @GroovyABI(since="2.5.0")
     public static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5, K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10, K k11, V v11, K k12, V v12, K k13, V v13, K k14, V v14, K k15, V v15, K k16, V v16, K k17, V v17, K k18, V v18, K k19, V v19, K k20, V v20, K k21, V v21, K k22, V v22, K k23, V v23, K k24, V v24, K k25, V v25, K k26, V v26, K k27, V v27, K k28, V v28, K k29, V v29, K k30, V v30, K k31, V v31, K k32, V v32, K k33, V v33, K k34, V v [...]
         Map<K, V> map = new LinkedHashMap<K, V>();
 
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
index 01c3e3dac3..b9401a52df 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/BinaryExpressionHelper.java
@@ -583,7 +583,6 @@ public class BinaryExpressionHelper {
             VariableExpression var = (VariableExpression) leftExpression;
             if (var.isClosureSharedVariable() && ClassHelper.isPrimitiveType(rhsType)) {
                 // GROOVY-5570: if a closure shared variable is a primitive type, it must be boxed
-                rhsType = ClassHelper.getWrapper(rhsType);
                 operandStack.box();
             }
 
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
index 4462f7aad5..8539725781 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/ClosureWriter.java
@@ -82,7 +82,6 @@ import java.util.Set;
 import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedMethod;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorSuperX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
index 577c09d23f..5d45251f28 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/sc/StaticTypesCallSiteWriter.java
@@ -584,9 +584,8 @@ public class StaticTypesCallSiteWriter extends CallSiteWriter {
                 writePowerCall(receiver, argument, rType, aType);
                 return;
               case "and":
-              case  "or":
+              case "or":
               case "xor":
-              case "implies":
               case "remainder":
               case "leftShift":
               case "rightShift":
diff --git a/src/main/java/org/codehaus/groovy/reflection/ClassInfo.java b/src/main/java/org/codehaus/groovy/reflection/ClassInfo.java
index ec2042012a..8c0d8e2688 100644
--- a/src/main/java/org/codehaus/groovy/reflection/ClassInfo.java
+++ b/src/main/java/org/codehaus/groovy/reflection/ClassInfo.java
@@ -26,6 +26,7 @@ import groovy.lang.MetaClass;
 import groovy.lang.MetaClassRegistry;
 import groovy.lang.MetaMethod;
 import groovy.transform.Internal;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.apache.groovy.runtime.indy.IndyInvalidation;
 import org.apache.groovy.runtime.indy.SwitchPointInvalidator;
 import org.apache.groovy.util.concurrent.ManagedIdentityConcurrentMap;
@@ -346,6 +347,7 @@ public class ClassInfo implements Finalizable {
      * @param cls the class to get information for
      * @return the class information, or {@code null} if {@code cls} is {@code null}
      */
+    @GroovyABI(since = "1.6.0")
     public static ClassInfo getClassInfo (Class cls) {
         return globalClassValue.get(cls);
     }
@@ -583,6 +585,7 @@ public class ClassInfo implements Finalizable {
      *
      * @return a {@code MetaClass} instance
      */
+    @GroovyABI(since = "1.6.0")
     public final MetaClass getMetaClass() {
         MetaClass answer = getMetaClassForClass();
         if (answer != null) return answer;
diff --git a/src/main/java/org/codehaus/groovy/runtime/CurriedClosure.java b/src/main/java/org/codehaus/groovy/runtime/CurriedClosure.java
index feaced7383..d31bd14d2b 100644
--- a/src/main/java/org/codehaus/groovy/runtime/CurriedClosure.java
+++ b/src/main/java/org/codehaus/groovy/runtime/CurriedClosure.java
@@ -19,6 +19,7 @@
 package org.codehaus.groovy.runtime;
 
 import groovy.lang.Closure;
+import org.apache.groovy.lang.annotation.GroovyABI;
 
 import java.io.ObjectStreamException;
 import java.io.Serial;
@@ -103,6 +104,7 @@ public final class CurriedClosure<V> extends Closure<V> {
         }
     }
 
+    @GroovyABI(since = "1.0")
     public CurriedClosure(final Closure<V> uncurriedClosure, final Object... arguments) {
         this(0, uncurriedClosure, arguments);
     }
diff --git a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
index e4e24804b3..e592bf4883 100644
--- a/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
+++ b/src/main/java/org/codehaus/groovy/runtime/DefaultGroovyMethods.java
@@ -57,6 +57,7 @@ import groovy.util.OrderBy;
 import groovy.util.PermutationGenerator;
 import groovy.util.ProxyGenerator;
 import org.apache.groovy.io.StringBuilderWriter;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.apache.groovy.lang.annotation.Incubating;
 import org.apache.groovy.util.ReversedList;
 import org.apache.groovy.util.SystemUtil;
@@ -1003,6 +1004,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @see #asUnmodifiable(java.util.Map)
      * @since 1.0
      */
+    @GroovyABI(since="3.0.0")
     public static <K,V> Map<K,V> asImmutable(Map<K,V> self) {
         return asUnmodifiable(new LinkedHashMap<>(self));
     }
@@ -1016,6 +1018,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @see #asUnmodifiable(java.util.SortedMap)
      * @since 1.0
      */
+    @GroovyABI(since="3.0.0")
     public static <K,V> SortedMap<K,V> asImmutable(SortedMap<K,V> self) {
         return asUnmodifiable(new TreeMap<>(self));
     }
@@ -1041,6 +1044,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @see #asUnmodifiable(java.util.List)
      * @since 1.0
      */
+    @GroovyABI(since="3.0.0")
     public static <T> List<T> asImmutable(List<T> self) {
         return asUnmodifiable(new ArrayList<>(self));
     }
@@ -1054,6 +1058,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @see #asUnmodifiable(java.util.Set)
      * @since 1.0
      */
+    @GroovyABI(since="3.0.0")
     public static <T> Set<T> asImmutable(Set<T> self) {
         return asUnmodifiable(new LinkedHashSet<>(self));
     }
@@ -1067,6 +1072,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @see #asUnmodifiable(java.util.SortedSet)
      * @since 1.0
      */
+    @GroovyABI(since="3.0.0")
     public static <T> SortedSet<T> asImmutable(SortedSet<T> self) {
         return asUnmodifiable(new TreeSet<>(self));
     }
@@ -1080,6 +1086,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @see #asUnmodifiable(java.util.Collection)
      * @since 1.5.0
      */
+    @GroovyABI(since="3.0.0")
     public static <T> Collection<T> asImmutable(Collection<T> self) {
         return asUnmodifiable((Collection<T>) new ArrayList<>(self));
     }
@@ -11645,6 +11652,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @see org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation#asCollection(java.lang.Object)
      * @since 1.0
      */
+    @GroovyABI(since="2.0.0")
     public static Iterator iterator(final Object self) {
         if (self instanceof Iterator) return (Iterator) self;
         return DefaultTypeTransformation.asCollection(self).iterator();
@@ -13818,6 +13826,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @return a Number to the power of a certain exponent
      * @since 1.0
      */
+    @GroovyABI(since="2.0.0")
     public static Number power(Number self, Number exponent) {
         double base, exp, answer;
         base = self.doubleValue();
@@ -13842,6 +13851,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @param exponent an Integer exponent
      * @return a Number to the power of the exponent
      */
+    @GroovyABI(since="2.0.0")
     public static Number power(BigDecimal self, Integer exponent) {
         if (exponent >= 0) {
             return self.pow(exponent);
@@ -13859,6 +13869,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      *  @param exponent an Integer exponent
      *  @return a Number to the power of the exponent
      */
+    @GroovyABI(since="2.0.0")
     public static Number power(BigInteger self, Integer exponent) {
         if (exponent >= 0) {
             return self.pow(exponent);
@@ -13877,6 +13888,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      *  @param exponent an Integer exponent
      *  @return a Number to the power of the exponent
      */
+    @GroovyABI(since="2.0.0")
     public static Number power(Integer self, Integer exponent) {
         if (exponent >= 0) {
             BigInteger answer = BigInteger.valueOf(self).pow(exponent);
@@ -13900,6 +13912,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @param exponent an Integer exponent
      * @return a Number to the power of the exponent
      */
+    @GroovyABI(since="2.0.0")
     public static Number power(Long self, Integer exponent) {
         if (exponent >= 0) {
             BigInteger answer = BigInteger.valueOf(self).pow(exponent);
@@ -13921,6 +13934,7 @@ public class DefaultGroovyMethods extends DefaultGroovyMethodsSupport {
      * @return a BigInteger to the power of the exponent
      * @since 2.3.8
      */
+    @GroovyABI(since="2.0.0")
     public static BigInteger power(BigInteger self, BigInteger exponent) {
         if ((exponent.signum() >= 0) && (exponent.compareTo(BI_INT_MAX) <= 0)) {
             return self.pow(exponent.intValue());
diff --git a/src/main/java/org/codehaus/groovy/runtime/FormatHelper.java b/src/main/java/org/codehaus/groovy/runtime/FormatHelper.java
index 866293d70a..be1bf3a7f3 100644
--- a/src/main/java/org/codehaus/groovy/runtime/FormatHelper.java
+++ b/src/main/java/org/codehaus/groovy/runtime/FormatHelper.java
@@ -27,6 +27,7 @@ import groovy.lang.Writable;
 import groovy.transform.NamedParam;
 import groovy.transform.NamedParams;
 import org.apache.groovy.io.StringBuilderWriter;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.control.ResolveVisitor;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 
@@ -45,6 +46,7 @@ import static java.util.Arrays.stream;
 
 /**
  * Formatting methods
+ * @since Groovy 4.0.0
  */
 public class FormatHelper {
 
@@ -96,6 +98,7 @@ public class FormatHelper {
      * @param arguments the object to convert to a string
      * @return a string representation
      */
+    @GroovyABI(since="5.0.0")
     public static String toString(Object arguments) {
         return format(arguments, false, -1, false);
     }
diff --git a/src/main/java/org/codehaus/groovy/runtime/GStringImpl.java b/src/main/java/org/codehaus/groovy/runtime/GStringImpl.java
index 4885ce650e..9012c48852 100644
--- a/src/main/java/org/codehaus/groovy/runtime/GStringImpl.java
+++ b/src/main/java/org/codehaus/groovy/runtime/GStringImpl.java
@@ -22,6 +22,7 @@ import groovy.lang.GString;
 import groovy.lang.GroovyObject;
 import groovy.transform.Pure;
 import org.apache.groovy.ast.tools.ImmutablePropertyUtils;
+import org.apache.groovy.lang.annotation.GroovyABI;
 
 import java.io.IOException;
 import java.io.Serial;
@@ -59,6 +60,7 @@ public class GStringImpl extends GString {
      * @param values  the value parts
      * @param strings the string parts
      */
+    @GroovyABI(since = "1.0")
     public GStringImpl(Object[] values, String[] strings) {
         this(values, strings, checkValuesStringConstant(values), null, false);
     }
diff --git a/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java b/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
index 9b06e98d6f..4d97d4cb89 100644
--- a/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
+++ b/src/main/java/org/codehaus/groovy/runtime/InvokerHelper.java
@@ -34,6 +34,7 @@ import groovy.lang.SpreadMap;
 import groovy.lang.SpreadMapEvaluatingException;
 import groovy.lang.Tuple;
 import groovy.util.regex.RegexGuard;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.reflection.ClassInfo;
 import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl;
 import org.codehaus.groovy.runtime.metaclass.MissingMethodExecutionFailed;
@@ -154,6 +155,7 @@ public class InvokerHelper {
         }
     }
 
+    @GroovyABI(since="2.5.0")
     public static Object getProperty(Object object, String property) {
         if (object == null) {
             object = NullObject.getNullObject();
@@ -168,6 +170,7 @@ public class InvokerHelper {
         }
     }
 
+    @GroovyABI(since="2.5.0")
     public static Object getPropertySafe(Object object, String property) {
         if (object != null) {
             return getProperty(object, property);
@@ -175,6 +178,7 @@ public class InvokerHelper {
         return null;
     }
 
+    @GroovyABI(since="?")
     public static void setProperty(Object object, String property, Object newValue) {
         if (object == null) {
             object = NullObject.getNullObject();
@@ -193,6 +197,7 @@ public class InvokerHelper {
      * This is so we don't have to reorder the stack when we call this method.
      * At some point a better name might be in order.
      */
+    @GroovyABI(since="?")
     public static void setProperty2(Object newValue, Object object, String property) {
         setProperty(object, property, newValue);
     }
@@ -201,10 +206,12 @@ public class InvokerHelper {
      * This is so we don't have to reorder the stack when we call this method.
      * At some point a better name might be in order.
      */
+    @GroovyABI(since="?")
     public static void setGroovyObjectProperty(Object newValue, GroovyObject object, String property) {
         object.setProperty(property, newValue);
     }
 
+    @GroovyABI(since="?")
     public static Object getGroovyObjectProperty(GroovyObject object, String property) {
         return object.getProperty(property);
     }
@@ -213,6 +220,7 @@ public class InvokerHelper {
      * This is so we don't have to reorder the stack when we call this method.
      * At some point a better name might be in order.
      */
+    @GroovyABI(since="?")
     public static void setPropertySafe2(Object newValue, Object object, String property) {
         if (object != null) {
             setProperty2(newValue, object, property);
@@ -584,6 +592,7 @@ public class InvokerHelper {
     /**
      * Invokes the given method on the object.
      */
+    @GroovyABI(since="5.0.0")
     public static Object invokeMethod(Object object, String methodName, Object arguments) {
         if (object == null) {
             object = NullObject.getNullObject();
@@ -686,6 +695,7 @@ public class InvokerHelper {
     }
 
     @Deprecated
+    @GroovyABI(since="1.0")
     public static String toString(Object arguments) {
         return FormatHelper.toString(arguments);
     }
diff --git a/src/main/java/org/codehaus/groovy/runtime/MultipleAssignmentSupport.java b/src/main/java/org/codehaus/groovy/runtime/MultipleAssignmentSupport.java
index 590dac543c..4b564b30ef 100644
--- a/src/main/java/org/codehaus/groovy/runtime/MultipleAssignmentSupport.java
+++ b/src/main/java/org/codehaus/groovy/runtime/MultipleAssignmentSupport.java
@@ -19,6 +19,7 @@
 package org.codehaus.groovy.runtime;
 
 import groovy.lang.IntRange;
+import org.apache.groovy.lang.annotation.GroovyABI;
 
 import java.lang.reflect.Array;
 import java.util.ArrayList;
@@ -80,6 +81,7 @@ public final class MultipleAssignmentSupport {
      * @param fromIndex the declarator position of the rest binding
      * @param seq       the iterator that has already yielded the preceding fixed-slot values
      */
+    @GroovyABI(since="6.0.0")
     public static Object tailRest(final Object rhs, final int fromIndex, final Iterator<?> seq) {
         if (rhs instanceof List) {
             if (fromIndex >= ((List<?>) rhs).size()) return createSimilarList((List<?>) rhs, 0);
@@ -144,6 +146,7 @@ public final class MultipleAssignmentSupport {
      * @param fromIndex positive index where the slice begins
      * @param toIndex   negative index where the slice ends (inclusive)
      */
+    @GroovyABI(since="6.0.0")
     public static Object nonTailRestSlice(final Object rhs, final int fromIndex, final int toIndex) {
         int size = -1;
         if (rhs instanceof List) size = ((List<?>) rhs).size();
diff --git a/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java b/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
index 9715301e3c..805e80d95f 100644
--- a/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
+++ b/src/main/java/org/codehaus/groovy/runtime/ScriptBytecodeAdapter.java
@@ -30,6 +30,7 @@ import groovy.lang.MissingPropertyException;
 import groovy.lang.NumberRange;
 import groovy.lang.ObjectRange;
 import groovy.lang.Tuple;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack;
 import org.codehaus.groovy.runtime.metaclass.MissingMethodExecutionFailed;
 import org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack;
@@ -52,6 +53,7 @@ import java.util.stream.BaseStream;
 /**
  * A static helper class to interface bytecode and runtime
  */
+@GroovyABI(since="1.0.0")
 public class ScriptBytecodeAdapter {
 
     /**
@@ -747,6 +749,7 @@ public class ScriptBytecodeAdapter {
         return (T) n;
     }
 
+    @GroovyABI(since = "1.0")
     public static MetaClass initMetaClass(final Object object) {
         return InvokerHelper.getMetaClass(object.getClass());
     }
@@ -1039,6 +1042,7 @@ public class ScriptBytecodeAdapter {
      *
      * @since 6.0.0
      */
+    @GroovyABI(since="6.0.0")
     public static Object compoundAssign(final Object receiver, final Object arg,
                                         final String assignName, final String baseName) throws Throwable {
         if (receiver != null) {
@@ -1071,6 +1075,7 @@ public class ScriptBytecodeAdapter {
      *
      * @since 6.0.0
      */
+    @GroovyABI(since="6.0.0")
     public static Closure<?> packedClosure(final Object owner, final Object dispatchers, final int id,
             final String method, final Object[] captured, final Class[] paramTypes,
             final boolean strict, final boolean implicit, final boolean vararg) {
diff --git a/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java b/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java
index bc424d871e..29b7e716f5 100644
--- a/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java
+++ b/src/main/java/org/codehaus/groovy/runtime/StringGroovyMethods.java
@@ -29,6 +29,7 @@ import groovy.transform.stc.PickFirstResolver;
 import groovy.util.regex.BalancedGroup;
 import groovy.util.regex.RegexGuard;
 import org.apache.groovy.io.StringBuilderWriter;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.apache.groovy.lang.annotation.Incubating;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 import org.codehaus.groovy.util.CharSequenceReader;
@@ -2448,6 +2449,7 @@ public class StringGroovyMethods extends DefaultGroovyMethodsSupport {
      *
      * @since 1.8.2
      */
+    @GroovyABI(since="3.0.0")
     public static String plus(final CharSequence left, final Object right) {
         return left + DefaultGroovyMethods.toString(right);
     }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberDiv.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberDiv.java
index 5a76e244d3..93bebf1d90 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberDiv.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberDiv.java
@@ -18,6 +18,7 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.runtime.typehandling.NumberMath;
 
 public final class NumberNumberDiv extends NumberNumberMetaMethod {
@@ -41,6 +42,7 @@ public final class NumberNumberDiv extends NumberNumberMetaMethod {
      * @param right another Number
      * @return a Number resulting of the divide operation
      */
+    @GroovyABI(since="2.0")
     public static Number div(Number left, Number right) {
         return NumberMath.divide(left, right);
     }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMinus.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMinus.java
index b0301b0335..d39f0593b7 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMinus.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMinus.java
@@ -18,6 +18,7 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.runtime.typehandling.NumberMath;
 
 public final class NumberNumberMinus extends NumberNumberMetaMethod {
@@ -38,6 +39,7 @@ public final class NumberNumberMinus extends NumberNumberMetaMethod {
      * @param right another Number to subtract to the first one
      * @return the subtraction
      */
+    @GroovyABI(since="2.0")
     public static Number minus(Number left, Number right) {
         return NumberMath.subtract(left, right);
     }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMultiply.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMultiply.java
index a040743db0..73f0b7b421 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMultiply.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMultiply.java
@@ -18,6 +18,7 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.runtime.typehandling.NumberMath;
 
 public final class NumberNumberMultiply extends NumberNumberMetaMethod {
@@ -31,6 +32,7 @@ public final class NumberNumberMultiply extends NumberNumberMetaMethod {
         return NumberMath.multiply((Number) object, (Number) arguments[0]);
     }
 
+    @GroovyABI(since="2.0")
     public static Number multiply(Number left, Number right) {
         return NumberMath.multiply(left, right);
     }
diff --git a/src/main/java/org/codehaus/groovy/runtime/powerassert/AssertionRenderer.java b/src/main/java/org/codehaus/groovy/runtime/powerassert/AssertionRenderer.java
index 759e747f5d..cb8b6fb507 100644
--- a/src/main/java/org/codehaus/groovy/runtime/powerassert/AssertionRenderer.java
+++ b/src/main/java/org/codehaus/groovy/runtime/powerassert/AssertionRenderer.java
@@ -18,6 +18,7 @@
  */
 package org.codehaus.groovy.runtime.powerassert;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.runtime.FormatHelper;
 
 import java.util.ArrayList;
@@ -53,6 +54,7 @@ public final class AssertionRenderer {
         return new AssertionRenderer(text, recorder).render();
     }
 
+    @GroovyABI(since="1.7.0")
     private String render() {
         renderText();
         sortValues();
diff --git a/src/main/java/org/codehaus/groovy/runtime/powerassert/ValueRecorder.java b/src/main/java/org/codehaus/groovy/runtime/powerassert/ValueRecorder.java
index 8e4194f50e..efa61ceec7 100644
--- a/src/main/java/org/codehaus/groovy/runtime/powerassert/ValueRecorder.java
+++ b/src/main/java/org/codehaus/groovy/runtime/powerassert/ValueRecorder.java
@@ -18,6 +18,8 @@
  */
 package org.codehaus.groovy.runtime.powerassert;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -31,6 +33,7 @@ public class ValueRecorder {
     /**
      * Removes all values recorded for the current assertion evaluation.
      */
+    @GroovyABI(since="1.7.0")
     public void clear() {
         values.clear();
     }
@@ -43,6 +46,7 @@ public class ValueRecorder {
      * non-positive value if the position is unknown
      * @return {@code value}
      */
+    @GroovyABI(since="1.7.0")
     public Object record(Object value, int anchor) {
         values.add(new Value(value, anchor));
         return value;
diff --git a/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java b/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java
index 10d589b37c..ce601f51e4 100644
--- a/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java
+++ b/src/main/java/org/codehaus/groovy/runtime/typehandling/DefaultTypeTransformation.java
@@ -21,6 +21,7 @@ package org.codehaus.groovy.runtime.typehandling;
 import groovy.lang.Closure;
 import groovy.lang.GString;
 import groovy.lang.GroovyRuntimeException;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.classgen.asm.util.TypeUtil;
 import org.codehaus.groovy.reflection.stdclasses.CachedSAMClass;
 import org.codehaus.groovy.runtime.ArrayGroovyMethods;
@@ -63,6 +64,7 @@ import java.util.stream.LongStream;
 
 /**
  * Class providing various type conversions, coercions and boxing/unboxing operations.
+ * @since Groovy 1.8.0
  */
 public class DefaultTypeTransformation {
 
@@ -95,6 +97,7 @@ public class DefaultTypeTransformation {
      * @return the byte value
      * @throws GroovyCastException if the object cannot be converted to a number
      */
+    @GroovyABI(since = "1.8.0")
     public static byte byteUnbox(final Object value) {
         if (value instanceof Byte b) {
             return b;
@@ -113,6 +116,7 @@ public class DefaultTypeTransformation {
      * @return the char value, or null character if value is null
      * @throws GroovyCastException if the object cannot be converted to char
      */
+    @GroovyABI(since = "1.8.0")
     public static char charUnbox(final Object value) {
         if (value instanceof Character c) {
             return c;
@@ -130,6 +134,7 @@ public class DefaultTypeTransformation {
      * @return the short value
      * @throws GroovyCastException if the object cannot be converted to a number
      */
+    @GroovyABI(since = "1.8.0")
     public static short shortUnbox(final Object value) {
         if (value instanceof Short s) {
             return s;
@@ -147,6 +152,7 @@ public class DefaultTypeTransformation {
      * @return the int value
      * @throws GroovyCastException if the object cannot be converted to a number
      */
+    @GroovyABI(since = "1.8.0")
     public static int intUnbox(final Object value) {
         if (value instanceof Integer i) {
             return i;
@@ -163,6 +169,7 @@ public class DefaultTypeTransformation {
      * @param value the object to unbox (may be null for false, Boolean, or any object with asBoolean())
      * @return the boolean value
      */
+    @GroovyABI(since = "1.8.0")
     public static boolean booleanUnbox(final Object value) {
         if (value instanceof Boolean b) {
             return b;
@@ -179,6 +186,7 @@ public class DefaultTypeTransformation {
      * @return the long value
      * @throws GroovyCastException if the object cannot be converted to a number
      */
+    @GroovyABI(since = "1.8.0")
     public static long longUnbox(final Object value) {
         if (value instanceof Long l) {
             return l;
@@ -197,6 +205,7 @@ public class DefaultTypeTransformation {
      * @return the float value, or NaN if value is null
      * @throws GroovyCastException if the object cannot be converted to a number
      */
+    @GroovyABI(since = "1.8.0")
     public static float floatUnbox(final Object value) {
         if (value instanceof Float f) {
             return f;
@@ -216,6 +225,7 @@ public class DefaultTypeTransformation {
      * @return the double value, or NaN if value is null
      * @throws GroovyCastException if the object cannot be converted to a number
      */
+    @GroovyABI(since = "1.8.0")
     public static double doubleUnbox(final Object value) {
         if (value instanceof Double d) {
             return d;
@@ -237,6 +247,7 @@ public class DefaultTypeTransformation {
      * @deprecated since 2.3.0 - Java's auto-boxing is sufficient for this operation
      */
     @Deprecated(since = "2.3.0")
+    @GroovyABI(since = "1.8.0")
     public static Object box(boolean value) {
         return value ? Boolean.TRUE : Boolean.FALSE;
     }
@@ -249,6 +260,7 @@ public class DefaultTypeTransformation {
      * @deprecated since 2.3.0 - Java's auto-boxing is sufficient for this operation
      */
     @Deprecated(since = "2.3.0")
+    @GroovyABI(since = "1.8.0")
     public static Object box(byte value) {
         return value;
     }
@@ -261,6 +273,7 @@ public class DefaultTypeTransformation {
      * @deprecated since 2.3.0 - Java's auto-boxing is sufficient for this operation
      */
     @Deprecated(since = "2.3.0")
+    @GroovyABI(since = "1.8.0")
     public static Object box(char value) {
         return value;
     }
@@ -273,6 +286,7 @@ public class DefaultTypeTransformation {
      * @deprecated since 2.3.0 - Java's auto-boxing is sufficient for this operation
      */
     @Deprecated(since = "2.3.0")
+    @GroovyABI(since = "1.8.0")
     public static Object box(short value) {
         return value;
     }
@@ -285,6 +299,7 @@ public class DefaultTypeTransformation {
      * @deprecated since 2.3.0 - Java's auto-boxing is sufficient for this operation
      */
     @Deprecated(since = "2.3.0")
+    @GroovyABI(since = "1.8.0")
     public static Object box(int value) {
         return value;
     }
@@ -297,6 +312,7 @@ public class DefaultTypeTransformation {
      * @deprecated since 2.3.0 - Java's auto-boxing is sufficient for this operation
      */
     @Deprecated(since = "2.3.0")
+    @GroovyABI(since = "1.8.0")
     public static Object box(long value) {
         return value;
     }
@@ -309,6 +325,7 @@ public class DefaultTypeTransformation {
      * @deprecated since 2.3.0 - Java's auto-boxing is sufficient for this operation
      */
     @Deprecated(since = "2.3.0")
+    @GroovyABI(since = "1.8.0")
     public static Object box(float value) {
         return value;
     }
@@ -321,6 +338,7 @@ public class DefaultTypeTransformation {
      * @deprecated since 2.3.0 - Java's auto-boxing is sufficient for this operation
      */
     @Deprecated(since = "2.3.0")
+    @GroovyABI(since = "1.8.0")
     public static Object box(double value) {
         return value;
     }
diff --git a/src/main/java/org/codehaus/groovy/runtime/typehandling/NumberMath.java b/src/main/java/org/codehaus/groovy/runtime/typehandling/NumberMath.java
index 9fe7cf532c..15dd093c83 100644
--- a/src/main/java/org/codehaus/groovy/runtime/typehandling/NumberMath.java
+++ b/src/main/java/org/codehaus/groovy/runtime/typehandling/NumberMath.java
@@ -18,6 +18,8 @@
  */
 package org.codehaus.groovy.runtime.typehandling;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -121,6 +123,7 @@ public abstract class NumberMath {
      * @return the bitwise OR result
      * @throws UnsupportedOperationException if operands are not integral types
      */
+    @GroovyABI(since="2.5.0")
     public static Number or(Number left, Number right) {
         return getMath(left, right).orImpl(left, right);
     }
@@ -133,6 +136,7 @@ public abstract class NumberMath {
      * @return the bitwise AND result
      * @throws UnsupportedOperationException if operands are not integral types
      */
+    @GroovyABI(since="2.5.0")
     public static Number and(Number left, Number right) {
         return getMath(left, right).andImpl(left, right);
     }
@@ -145,6 +149,7 @@ public abstract class NumberMath {
      * @return the bitwise XOR result
      * @throws UnsupportedOperationException if operands are not integral types
      */
+    @GroovyABI(since="2.5.0")
     public static Number xor(Number left, Number right) {
         return getMath(left, right).xorImpl(left, right);
     }
@@ -173,6 +178,7 @@ public abstract class NumberMath {
      * @param right the divisor
      * @return the modulo result
      */
+    @GroovyABI(since = "2.0")
     public static Number mod(Number left, Number right) {
         return getMath(left, right).modImpl(left, right);
     }
@@ -187,6 +193,7 @@ public abstract class NumberMath {
      * @return the remainder
      * @throws UnsupportedOperationException if operands don't support remainder operation
      */
+    @GroovyABI(since="2.5.0")
     public static Number remainder(Number left, Number right) {
         return getMath(left, right).remainderImpl(left, right);
     }
@@ -202,6 +209,7 @@ public abstract class NumberMath {
      * @return the left-shifted value
      * @throws UnsupportedOperationException if shift distance is floating-point or BigDecimal
      */
+    @GroovyABI(since="2.5.0")
     public static Number leftShift(Number left, Number right) {
         if (isFloatingPoint(right) || isBigDecimal(right)) {
             throw new UnsupportedOperationException("Shift distance must be an integral type, but " + right + " (" + right.getClass().getName() + ") was supplied");
@@ -220,6 +228,7 @@ public abstract class NumberMath {
      * @return the right-shifted value
      * @throws UnsupportedOperationException if shift distance is floating-point or BigDecimal
      */
+    @GroovyABI(since="2.5.0")
     public static Number rightShift(Number left, Number right) {
         if (isFloatingPoint(right) || isBigDecimal(right)) {
             throw new UnsupportedOperationException("Shift distance must be an integral type, but " + right + " (" + right.getClass().getName() + ") was supplied");
@@ -238,6 +247,7 @@ public abstract class NumberMath {
      * @return the unsigned right-shifted value
      * @throws UnsupportedOperationException if shift distance is floating-point or BigDecimal
      */
+    @GroovyABI(since="2.5.0")
     public static Number rightShiftUnsigned(Number left, Number right) {
         if (isFloatingPoint(right) || isBigDecimal(right)) {
             throw new UnsupportedOperationException("Shift distance must be an integral type, but " + right + " (" + right.getClass().getName() + ") was supplied");
diff --git a/src/main/java/org/codehaus/groovy/transform/ImmutableASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/ImmutableASTTransformation.java
index a74d493ac4..09c6a6971c 100644
--- a/src/main/java/org/codehaus/groovy/transform/ImmutableASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/ImmutableASTTransformation.java
@@ -27,6 +27,7 @@ import groovy.transform.options.PropertyHandler;
 import org.apache.groovy.ast.tools.AnnotatedNodeUtils;
 import org.apache.groovy.ast.tools.CopyWithUtils;
 import org.apache.groovy.ast.tools.ImmutablePropertyUtils;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.AnnotatedNode;
 import org.codehaus.groovy.ast.AnnotationNode;
@@ -325,8 +326,10 @@ public class ImmutableASTTransformation extends AbstractASTTransformation implem
     }
 
     /**
-     * This method exists to be binary compatible with 1.7 - 1.8.6 compiled code.
+     * This method exists to be binary compatible with 1.7 - 1.8.6 compiled code and is since 2.5.0 used
+     * by code produced by ImmutablePropertyHandler
      */
+    @GroovyABI(since="1.7.0")
     public static Object checkImmutable(final String className, final String fieldName, final Object field) {
         if (field == null || field instanceof Enum || ImmutablePropertyUtils.isBuiltinImmutable(field.getClass().getName())) return field;
         if (field instanceof Collection) return DefaultGroovyMethods.asImmutable((Collection<?>) field);
diff --git a/src/main/java/org/codehaus/groovy/util/HashCodeHelper.java b/src/main/java/org/codehaus/groovy/util/HashCodeHelper.java
index a92511beaa..f3b9ce4d85 100644
--- a/src/main/java/org/codehaus/groovy/util/HashCodeHelper.java
+++ b/src/main/java/org/codehaus/groovy/util/HashCodeHelper.java
@@ -18,6 +18,8 @@
  */
 package org.codehaus.groovy.util;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
+
 import java.util.Arrays;
 
 /**
@@ -34,6 +36,7 @@ public class HashCodeHelper {
      *
      * @return the starting hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int initHash() {
         return SEED;
     }
@@ -45,6 +48,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, boolean var) {
         return shift(current) + (var ? 79 : 97);
     }
@@ -56,6 +60,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, char var) {
         return shift(current) + (int) var;
     }
@@ -67,6 +72,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, Character var) {
         return updateHash(current, var == null ? 0 : var.charValue());
     }
@@ -78,6 +84,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, int var) {
         return shift(current) + var;
     }
@@ -89,6 +96,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, Integer var) {
         return updateHash(current, var == null ? 0 : var);
     }
@@ -100,6 +108,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, long var) {
         return shift(current) + (int) (var ^ (var >>> 32));
     }
@@ -111,6 +120,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, Long var) {
         return updateHash(current, var == null ? 0L : var);
     }
@@ -122,6 +132,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, float var) {
         return updateHash(current, Float.floatToIntBits(var));
     }
@@ -133,6 +144,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, Float var) {
         return updateHash(current, var == null ? 0f : var);
     }
@@ -144,6 +156,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, double var) {
         return updateHash(current, Double.doubleToLongBits(var));
     }
@@ -155,6 +168,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, Double var) {
         return updateHash(current, var == null ? 0d : var);
     }
@@ -166,6 +180,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, Object var) {
         if (var == null) return updateHash(current, 0);
         if (var.getClass().isArray())
@@ -180,6 +195,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, boolean[] var) {
         if (var == null) return updateHash(current, 0);
         return shift(current) + Arrays.hashCode(var);
@@ -192,6 +208,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, char[] var) {
         if (var == null) return updateHash(current, 0);
         return shift(current) + Arrays.hashCode(var);
@@ -204,6 +221,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, byte[] var) {
         if (var == null) return updateHash(current, 0);
         return shift(current) + Arrays.hashCode(var);
@@ -216,6 +234,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, short[] var) {
         if (var == null) return updateHash(current, 0);
         return shift(current) + Arrays.hashCode(var);
@@ -228,6 +247,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, int[] var) {
         if (var == null) return updateHash(current, 0);
         return shift(current) + Arrays.hashCode(var);
@@ -240,6 +260,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, long[] var) {
         if (var == null) return updateHash(current, 0);
         return shift(current) + Arrays.hashCode(var);
@@ -252,6 +273,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, float[] var) {
         if (var == null) return updateHash(current, 0);
         return shift(current) + Arrays.hashCode(var);
@@ -264,6 +286,7 @@ public class HashCodeHelper {
      * @param var the value to mix in
      * @return the updated hash value
      */
+    @GroovyABI(since="1.6.0")
     public static int updateHash(int current, double[] var) {
         if (var == null) return updateHash(current, 0);
         return shift(current) + Arrays.hashCode(var);
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v7/IndyInterface.java b/src/main/java/org/codehaus/groovy/vmplugin/v7/IndyInterface.java
index f902783c01..aeea2138d5 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v7/IndyInterface.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v7/IndyInterface.java
@@ -18,6 +18,7 @@
  */
 package org.codehaus.groovy.vmplugin.v7;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.vmplugin.v8.CacheableCallSite;
 
 import java.lang.invoke.CallSite;
@@ -126,6 +127,7 @@ public class IndyInterface {
      * @return the produced CallSite
      * @since 2.1.0
      */
+    @GroovyABI(since="2.1.0")
     public static CallSite bootstrap(Lookup caller, String callType, MethodType type, String name, int flags) {
         return org.codehaus.groovy.vmplugin.v8.IndyInterface.bootstrap(caller, callType, type, name, flags);
     }
diff --git a/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyInterface.java b/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyInterface.java
index 05cd876150..31f8fdd5c3 100644
--- a/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyInterface.java
+++ b/src/main/java/org/codehaus/groovy/vmplugin/v8/IndyInterface.java
@@ -20,6 +20,7 @@ package org.codehaus.groovy.vmplugin.v8;
 
 import groovy.lang.GroovyRuntimeException;
 import groovy.lang.GroovySystem;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.apache.groovy.runtime.indy.IndyInvalidation;
 import org.apache.groovy.util.SystemUtil;
 import org.codehaus.groovy.GroovyBugError;
@@ -293,6 +294,7 @@ public class IndyInterface {
      *                   </ul>
      * @since 2.1.0
      */
+    @GroovyABI(since="2.1.0")
     public static CallSite bootstrap(final MethodHandles.Lookup caller, final String callType, final MethodType type, final String name, final int flags) {
         CallType ct = CallType.fromCallSiteName(callType);
         if (null == ct) throw new GroovyBugError("Unknown call type: " + callType);
@@ -631,6 +633,7 @@ public class IndyInterface {
     /**
      * @since 2.5.0
      */
+    @GroovyABI(since="2.5.0")
     public static CallSite staticArrayAccess(MethodHandles.Lookup lookup, String name, MethodType type) {
         if (type.parameterCount() == 2) {
             return new ConstantCallSite(IndyArrayAccess.arrayGet(type));
@@ -647,6 +650,7 @@ public class IndyInterface {
      *
      * @since 6.0.0
      */
+    @GroovyABI(since="6.0.0")
     public static CallSite packedDispatchers(MethodHandles.Lookup caller, String name, MethodType type) throws Throwable {
         return GeneratedDispatcher.bootstrap(caller, name, type);
     }
@@ -659,6 +663,7 @@ public class IndyInterface {
      *
      * @since 6.0.0
      */
+    @GroovyABI(since="6.0.0")
     public static Class<?>[] packedParamTypes(MethodHandles.Lookup caller, String name, Class<?> type, String descriptor) {
         return GeneratedDispatcher.paramTypes(caller, name, type, descriptor);
     }
diff --git a/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java
index d46b833a1f..b1e0329ae5 100644
--- a/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java
@@ -19,6 +19,7 @@
 package org.codehaus.groovy.runtime.callsite;
 
 import groovy.lang.GroovyObject;
+import org.apache.groovy.lang.annotation.GroovyABI;
 
 /**
  * Classic (non-{@code invokedynamic}) call site.
@@ -37,38 +38,68 @@ public interface CallSite {
     Object callGroovyObjectGetProperty (Object receiver) throws Throwable;
     Object callGroovyObjectGetPropertySafe (Object receiver) throws Throwable;
 
+    @GroovyABI(since = "1.6.0")
     Object call (Object receiver, Object[] args) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object call (Object receiver) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object call (Object receiver, Object arg1) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object call (Object receiver, Object arg1, Object arg2) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object call (Object receiver, Object arg1, Object arg2, Object arg3) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object call (Object receiver, Object arg1, Object arg2, Object arg3, Object arg4) throws Throwable;
 
+    @GroovyABI(since = "1.6.0")
     Object callSafe (Object receiver, Object[] args) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callSafe (Object receiver) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callSafe (Object receiver, Object arg1) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callSafe (Object receiver, Object arg1, Object arg2) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callSafe (Object receiver, Object arg1, Object arg2, Object arg3) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callSafe (Object receiver, Object arg1, Object arg2, Object arg3, Object arg4) throws Throwable;
 
+    @GroovyABI(since = "1.6.0")
     Object callCurrent (GroovyObject receiver, Object [] args) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callCurrent (GroovyObject receiver) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callCurrent (GroovyObject receiver, Object arg1) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callCurrent (GroovyObject receiver, Object arg1, Object arg2) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callCurrent (GroovyObject receiver, Object arg1, Object arg2, Object arg3) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callCurrent (GroovyObject receiver, Object arg1, Object arg2, Object arg3, Object arg4) throws Throwable;
 
+    @GroovyABI(since = "1.6.0")
     Object callStatic (Class receiver, Object [] args) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callStatic (Class receiver) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callStatic (Class receiver, Object arg1) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callStatic (Class receiver, Object arg1, Object arg2) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callStatic (Class receiver, Object arg1, Object arg2, Object arg3) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callStatic (Class receiver, Object arg1, Object arg2, Object arg3, Object arg4) throws Throwable;
 
+    @GroovyABI(since = "1.6.0")
     Object callConstructor (Object receiver, Object [] args) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callConstructor (Object receiver) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callConstructor (Object receiver, Object arg1) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callConstructor (Object receiver, Object arg1, Object arg2) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callConstructor (Object receiver, Object arg1, Object arg2, Object arg3) throws Throwable;
+    @GroovyABI(since = "1.6.0")
     Object callConstructor (Object receiver, Object arg1, Object arg2, Object arg3, Object arg4) throws Throwable;
 }
diff --git a/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
index b60630fb41..7539d9c860 100644
--- a/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
@@ -22,6 +22,7 @@ import groovy.lang.GroovyInterceptable;
 import groovy.lang.GroovyObject;
 import groovy.lang.MetaClass;
 import groovy.lang.MetaClassImpl;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.reflection.ClassInfo;
 import org.codehaus.groovy.runtime.GroovyCategorySupport;
 import org.codehaus.groovy.runtime.InvokerHelper;
@@ -39,6 +40,7 @@ public final class CallSiteArray {
     public final CallSite[] array;
     public final Class owner;
 
+    @GroovyABI(since = "1.6.0")
     public CallSiteArray(Class owner, final String[] names) {
         this.owner = owner;
         this.array = IntStream.range(0, names.length)
diff --git a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/ViolationTracker.java b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/ViolationTracker.java
index b4d4cb312e..a1c4f5acb4 100644
--- a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/ViolationTracker.java
+++ b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/ViolationTracker.java
@@ -19,6 +19,7 @@
 package org.apache.groovy.contracts;
 
 import org.apache.groovy.contracts.util.Validate;
+import org.apache.groovy.lang.annotation.GroovyABI;
 
 import java.util.NavigableMap;
 import java.util.TreeMap;
@@ -40,6 +41,7 @@ public class ViolationTracker {
     /**
      * Installs a fresh tracker for the current thread.
      */
+    @GroovyABI(since="4.0.0")
     public static void init() {
         INSTANCE.set(new ViolationTracker());
     }
@@ -47,6 +49,7 @@ public class ViolationTracker {
     /**
      * Removes the tracker associated with the current thread.
      */
+    @GroovyABI(since="4.0.0")
     public static void deinit() {
         INSTANCE.remove();
     }
@@ -56,6 +59,7 @@ public class ViolationTracker {
      *
      * @return {@code true} if a violation has been tracked for the current thread
      */
+    @GroovyABI(since="4.0.0")
     public static boolean violationsOccurred() {
         return INSTANCE.get().hasViolations();
     }
@@ -63,6 +67,7 @@ public class ViolationTracker {
     /**
      * Rethrows the earliest recorded violation for the current thread.
      */
+    @GroovyABI(since="4.0.0")
     public static void rethrowFirst() {
         throw INSTANCE.get().first();
     }
@@ -70,6 +75,7 @@ public class ViolationTracker {
     /**
      * Rethrows the most recently recorded violation for the current thread.
      */
+    @GroovyABI(since="4.0.0")
     public static void rethrowLast() {
         throw INSTANCE.get().last();
     }
@@ -81,6 +87,7 @@ public class ViolationTracker {
      *
      * @param assertionViolation the violation to store
      */
+    @GroovyABI(since="4.0.0")
     public void track(final AssertionViolation assertionViolation) {
         Validate.notNull(assertionViolation);
 
@@ -92,6 +99,7 @@ public class ViolationTracker {
      *
      * @return {@code true} if at least one violation has been recorded
      */
+    @GroovyABI(since="4.0.0")
     public boolean hasViolations() {
         return !violations.isEmpty();
     }
@@ -101,6 +109,7 @@ public class ViolationTracker {
      *
      * @return the first violation in encounter order
      */
+    @GroovyABI(since="4.0.0")
     public AssertionViolation first() {
         return violations.firstEntry().getValue();
     }
@@ -110,6 +119,7 @@ public class ViolationTracker {
      *
      * @return the last violation in encounter order
      */
+    @GroovyABI(since="4.0.0")
     public AssertionViolation last() {
         return violations.lastEntry().getValue();
     }
diff --git a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/generation/Configurator.java b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/generation/Configurator.java
index aef71bfd58..9f2802a8ed 100644
--- a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/generation/Configurator.java
+++ b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/generation/Configurator.java
@@ -18,6 +18,8 @@
  */
 package org.apache.groovy.contracts.generation;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
+
 import java.lang.management.ManagementFactory;
 import java.lang.management.RuntimeMXBean;
 import java.util.HashMap;
@@ -102,6 +104,7 @@ public final class Configurator {
      * @param className the class name to look up in the assertion configuration
      * @return whether assertion checking is enabled or not
      */
+    @GroovyABI(since="4.0.0")
     public static boolean checkAssertionsEnabled(final String className) {
         return internalMethod(className);
     }
diff --git a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/generation/ContractExecutionTracker.java b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/generation/ContractExecutionTracker.java
index 9e521d9bc7..546a353017 100644
--- a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/generation/ContractExecutionTracker.java
+++ b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/generation/ContractExecutionTracker.java
@@ -18,6 +18,8 @@
  */
 package org.apache.groovy.contracts.generation;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
+
 import java.util.HashSet;
 import java.util.Objects;
 import java.util.Set;
@@ -156,6 +158,7 @@ public class ContractExecutionTracker {
      * @param assertionType the logical contract kind
      * @param isStatic whether the executable is static
      */
+    @GroovyABI(since="4.0.0")
     public static void clear(String className, String methodIdentifier, String assertionType, boolean isStatic) {
         final Set<ContractExecution> contractExecutions = executions.get();
 
diff --git a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/util/FieldValues.java b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/util/FieldValues.java
index f9b6fd10e5..d22b0c36d7 100644
--- a/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/util/FieldValues.java
+++ b/subprojects/groovy-contracts/src/main/java/org/apache/groovy/contracts/util/FieldValues.java
@@ -18,6 +18,8 @@
  */
 package org.apache.groovy.contracts.util;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
+
 import java.lang.reflect.Field;
 
 /**
@@ -37,6 +39,7 @@ public class FieldValues {
      * @throws IllegalAccessException if reflective access fails
      */
     @SuppressWarnings("unchecked")
+    @GroovyABI(since="4.0.0")
     public static <T> T fieldValue(Object obj, String fieldName, Class<T> type) throws IllegalAccessException {
         Validate.notNull(obj);
         Validate.notNull(fieldName);
@@ -54,6 +57,7 @@ public class FieldValues {
         return (T) f.get(target);
     }
 
+    @GroovyABI(since="4.0.0")
     private static Field findField(Class<?> clazz, String name) {
         Class<?> next = clazz;
         while (!Object.class.equals(next) && next != null) {
diff --git a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/NamedRecord.groovy b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/NamedRecord.groovy
index 3f24b0a641..88eeb8f8e4 100644
--- a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/NamedRecord.groovy
+++ b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/NamedRecord.groovy
@@ -21,6 +21,7 @@ package org.apache.groovy.ginq.provider.collection.runtime
 import groovy.transform.AutoFinal
 import groovy.transform.CompileStatic
 import groovy.transform.stc.POJO
+import org.apache.groovy.lang.annotation.GroovyABI
 
 /**
  * Represents named record, which is constructed by clauses excluding {@code from} and joins
@@ -99,6 +100,7 @@ class NamedRecord<E, T> extends NamedTuple<E> {
      * @param sr the source record
      * @return this record
      */
+    @GroovyABI(since="4.0.0")
     NamedRecord<E, T> sourceRecord(T sr) {
         sourceRecord = new SourceRecord<>(sr, getAliasList())
         return this
diff --git a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/Queryable.java b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/Queryable.java
index a3b013b56f..9eb9b62f9e 100644
--- a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/Queryable.java
+++ b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/Queryable.java
@@ -20,6 +20,7 @@ package org.apache.groovy.ginq.provider.collection.runtime;
 
 import groovy.lang.Tuple2;
 import groovy.transform.Internal;
+import org.apache.groovy.lang.annotation.GroovyABI;
 
 import java.math.BigDecimal;
 import java.util.Arrays;
@@ -72,6 +73,7 @@ public interface Queryable<T> {
      * @return the {@link Queryable} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T> Queryable<T> from(Iterable<T> iterable) {
         return new QueryableCollection<>(iterable);
     }
@@ -84,6 +86,7 @@ public interface Queryable<T> {
      * @return the {@link Queryable} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T> Queryable<T> from(T[] array) {
         return new QueryableCollection<>(Arrays.asList(array));
     }
@@ -96,6 +99,7 @@ public interface Queryable<T> {
      * @return the {@link Queryable} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T> Queryable<T> from(Stream<T> sourceStream) {
         return new QueryableCollection<>(sourceStream);
     }
@@ -108,6 +112,7 @@ public interface Queryable<T> {
      * @return the {@link Queryable} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T> Queryable<T> from(Queryable<T> queryable) {
         return queryable;
     }
diff --git a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableHelper.groovy b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableHelper.groovy
index 40febc064b..f4a7cc5e27 100644
--- a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableHelper.groovy
+++ b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/QueryableHelper.groovy
@@ -21,6 +21,7 @@ package org.apache.groovy.ginq.provider.collection.runtime
 import groovy.transform.CompileDynamic
 import groovy.transform.CompileStatic
 import groovy.transform.Internal
+import org.apache.groovy.lang.annotation.GroovyABI
 import org.apache.groovy.util.SystemUtil
 
 import java.util.concurrent.Callable
@@ -54,6 +55,7 @@ class QueryableHelper {
      * @return the result {@link Queryable} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T> Queryable<SourceRecord<T>> navigate(Queryable<? extends T> queryable, List<String> aliasList) {
         List<SourceRecord<T>> sourceRecordList =
                 queryable.stream()
@@ -71,6 +73,7 @@ class QueryableHelper {
      * @throws TooManyValuesException if the {@link Queryable} instance contains more than one value
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T> T singleValue(final Queryable<? extends T> queryable) {
         List<? extends T> list = queryable.toList()
         int size = list.size()
@@ -91,6 +94,7 @@ class QueryableHelper {
      * @param supplier the supplier to execute
      * @return the asynchronous result
      */
+    @GroovyABI(since="4.0.0")
     static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
         return CompletableFuture.supplyAsync(supplier, ThreadPoolHolder.THREAD_POOL)
     }
@@ -112,6 +116,7 @@ class QueryableHelper {
      * @param callable the task to submit
      * @return the submitted task
      */
+    @GroovyABI(since="4.0.0")
     static <T> ForkJoinTask<T> submit(Callable<T> callable) {
         return ThreadPoolHolder.FORKJOIN_POOL.submit(callable)
     }
@@ -131,6 +136,7 @@ class QueryableHelper {
      * @param name the variable name
      * @param value the variable value
      */
+    @GroovyABI(since="4.0.0")
     static <T> void setVar(String name, T value) {
         VAR_HOLDER.get().put(name, value)
     }
@@ -141,6 +147,7 @@ class QueryableHelper {
      * @param name the variable name
      * @return the stored value
      */
+    @GroovyABI(since="4.0.0")
     static <T> T getVar(String name) {
         (T) VAR_HOLDER.get().get(name)
     }
@@ -151,6 +158,7 @@ class QueryableHelper {
      * @param name the variable name
      * @return the removed value
      */
+    @GroovyABI(since="4.0.0")
     static <T> T removeVar(String name) {
         (T) VAR_HOLDER.get().remove(name)
     }
diff --git a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/WindowDefinition.java b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/WindowDefinition.java
index f56cb14c86..ac3223ea6b 100644
--- a/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/WindowDefinition.java
+++ b/subprojects/groovy-ginq/src/main/groovy/org/apache/groovy/ginq/provider/collection/runtime/WindowDefinition.java
@@ -18,6 +18,8 @@
  */
 package org.apache.groovy.ginq.provider.collection.runtime;
 
+import org.apache.groovy.lang.annotation.GroovyABI;
+
 import java.util.Collections;
 import java.util.List;
 import java.util.function.Function;
@@ -39,6 +41,7 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return the {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T, U extends Comparable<? super U>> WindowDefinition<T, U> of() {
         return new WindowDefinitionImpl<>();
     }
@@ -52,6 +55,7 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return the {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T, U extends Comparable<? super U>> WindowDefinition<T, U> of(Function<? super T, ?> partitionBy) {
         return new WindowDefinitionImpl<>(partitionBy);
     }
@@ -65,6 +69,7 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return the {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T, U extends Comparable<? super U>> WindowDefinition<T, U> of(Queryable.Order<? super T, ? extends U> orderBy) {
         return new WindowDefinitionImpl<T, U>(Collections.singletonList(orderBy));
     }
@@ -78,6 +83,7 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return the {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T, U extends Comparable<? super U>> WindowDefinition<T, U> of(List<Queryable.Order<? super T, ? extends U>> orderBy) {
         return new WindowDefinitionImpl<>(orderBy);
     }
@@ -92,6 +98,7 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return the {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T, U extends Comparable<? super U>> WindowDefinition<T, U> of(Function<? super T, ?> partitionBy, List<Queryable.Order<? super T, ? extends U>> orderBy) {
         return new WindowDefinitionImpl<>(partitionBy, orderBy);
     }
@@ -107,6 +114,7 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return the {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T, U extends Comparable<? super U>> WindowDefinition<T, U> of(Function<? super T, ?> partitionBy, List<Queryable.Order<? super T, ? extends U>> orderBy, RowBound rows) {
         return new WindowDefinitionImpl<>(partitionBy, orderBy, rows);
     }
@@ -121,6 +129,7 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return the {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T, U extends Comparable<? super U>> WindowDefinition<T, U> of(List<Queryable.Order<? super T, ? extends U>> orderBy, RowBound rows) {
         return new WindowDefinitionImpl<>(orderBy, rows);
     }
@@ -136,6 +145,7 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return the {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T, U extends Comparable<? super U>> WindowDefinition<T, U> of(Function<? super T, ?> partitionBy, List<Queryable.Order<? super T, ? extends U>> orderBy, ValueBound<? extends U> range) {
         return new WindowDefinitionImpl<>(partitionBy, orderBy, range);
     }
@@ -150,6 +160,7 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return the {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     static <T, U extends Comparable<? super U>> WindowDefinition<T, U> of(List<Queryable.Order<? super T, ? extends U>> orderBy, ValueBound<? extends U> range) {
         return new WindowDefinitionImpl<>(orderBy, range);
     }
@@ -208,5 +219,6 @@ public interface WindowDefinition<T, U extends Comparable<? super U>> {
      * @return self, i.e. current {@link WindowDefinition} instance
      * @since 4.0.0
      */
+    @GroovyABI(since="4.0.0")
     WindowDefinition<T, U> setId(Object id);
 }
diff --git a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroBuilder.java b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroBuilder.java
index 4a329ed74f..88ba70db1a 100644
--- a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroBuilder.java
+++ b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroBuilder.java
@@ -19,6 +19,7 @@
 package org.codehaus.groovy.macro.runtime;
 
 import groovy.lang.Closure;
+import org.apache.groovy.lang.annotation.GroovyABI;
 import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.ClassCodeExpressionTransformer;
 import org.codehaus.groovy.ast.ClassNode;
@@ -55,6 +56,7 @@ public enum MacroBuilder {
      * @param <T> the expected result type
      * @return the built macro value
      */
+    @GroovyABI(since="2.5.0")
     public <T> T macro(String source, final List<Closure<Expression>> context, Class<T> resultClass) {
         return macro(false, source, context, resultClass);
     }
@@ -69,6 +71,7 @@ public enum MacroBuilder {
      * @param <T> the expected result type
      * @return the built macro value
      */
+    @GroovyABI(since="2.5.0")
     public <T> T macro(boolean asIs, String source, final List<Closure<Expression>> context, Class<T> resultClass) {
         return macro(null, asIs, source, context, resultClass);
     }
@@ -83,6 +86,7 @@ public enum MacroBuilder {
      * @param <T> the expected result type
      * @return the built macro value
      */
+    @GroovyABI(since="2.5.0")
     public <T> T macro(CompilePhase compilePhase, String source, final List<Closure<Expression>> context, Class<T> resultClass) {
         return macro(compilePhase, false, source, context, resultClass);
     }