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

paulk-asert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/master by this push:
     new 53181454e0 GROOVY-12029: Graduate Macro and related classes from 
incubating to stable
53181454e0 is described below

commit 53181454e08716af1fb76927215775fb75084f56
Author: Paul King <[email protected]>
AuthorDate: Fri May 22 22:22:29 2026 +1000

    GROOVY-12029: Graduate Macro and related classes from incubating to stable
---
 src/spec/doc/core-metaprogramming.adoc              | 21 +++++++++++++++++++++
 .../groovy/macrolib/MacroLibGroovyMethods.java      |  4 +++-
 .../codehaus/groovy/macro/matcher/ASTMatcher.groovy |  9 ++++-----
 .../groovy/macro/matcher/MatchingConstraints.groovy |  1 +
 .../internal/MatchingConstraintsBuilder.groovy      |  3 +++
 .../org/codehaus/groovy/macro/runtime/Macro.java    |  3 ---
 .../codehaus/groovy/macro/runtime/MacroBuilder.java |  3 ---
 .../codehaus/groovy/macro/runtime/MacroContext.java |  3 ---
 .../codehaus/groovy/macro/transform/MacroClass.java |  3 ---
 9 files changed, 32 insertions(+), 18 deletions(-)

diff --git a/src/spec/doc/core-metaprogramming.adoc 
b/src/spec/doc/core-metaprogramming.adoc
index 17e21ce42a..41bac4bf5a 100644
--- a/src/spec/doc/core-metaprogramming.adoc
+++ b/src/spec/doc/core-metaprogramming.adoc
@@ -3324,6 +3324,27 @@ def nullObject = null
 assert null == safe(safe(nullObject.hashcode()).toString())
 ----
 
+===== Disabling macro methods
+
+The `groovy.macro.disable` system property suppresses selected `@Macro`
+methods from extension lookup before macro expansion runs. Its value is a
+comma-separated list of bare method names; any macro method whose name
+appears in the list is filtered out of the macro extension cache. For
+example, compiling with `-Dgroovy.macro.disable=DO,SVI` skips both the `DO`
+and `SVI` macros that ship with the `groovy-macro-library` module.
+
+A few details to be aware of:
+
+* *Bare-name matching only.* Every overload of a disabled name is filtered
+  together, and the same name in different modules collides globally. There
+  is no per-signature form (unlike `groovy.extension.disable`, which accepts
+  `name(type1,type2,...)` for regular extension methods).
+* *Read once at compiler startup.* The property is captured when the macro
+  extension cache is first initialised, so it must be set as a `-D` argument
+  to the JVM that runs the Groovy compiler.
+* *No whitespace trimming.* Entries are split on commas only, so write
+  `-Dgroovy.macro.disable=DO,SVI`, not `-Dgroovy.macro.disable=DO, SVI`.
+
 ==== Testing AST transformations
 ===== Separating source trees
 
diff --git 
a/subprojects/groovy-macro-library/src/main/groovy/org/apache/groovy/macrolib/MacroLibGroovyMethods.java
 
b/subprojects/groovy-macro-library/src/main/groovy/org/apache/groovy/macrolib/MacroLibGroovyMethods.java
index 5a7b08a061..fecdaa89bd 100644
--- 
a/subprojects/groovy-macro-library/src/main/groovy/org/apache/groovy/macrolib/MacroLibGroovyMethods.java
+++ 
b/subprojects/groovy-macro-library/src/main/groovy/org/apache/groovy/macrolib/MacroLibGroovyMethods.java
@@ -57,7 +57,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
 /**
  * Macro library helpers for string and named-value expansion.
  *
- * @since 2.5.0
+ * @since 4.0.0
  */
 public final class MacroLibGroovyMethods {
     private MacroLibGroovyMethods() {}
@@ -215,6 +215,7 @@ public final class MacroLibGroovyMethods {
      * @param ctx the current macro context
      * @param exps the generators (each {@code name in expression}) followed 
by the body closure
      * @return the nested bind-chain expression
+     * @since 6.0.0
      */
     @Macro
     public static Expression DO(MacroContext ctx, final Expression... exps) {
@@ -285,6 +286,7 @@ public final class MacroLibGroovyMethods {
      * @param self the receiver
      * @param args the runtime values
      * @return never returns normally
+     * @since 6.0.0
      */
     public static Object DO(Object self, Object... args) {
         throw new IllegalStateException("MacroLibGroovyMethods.DO(Object...) 
should never be called at runtime. Are you sure you are using it correctly?");
diff --git 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
index c6b85acb90..feb6c17faa 100644
--- 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
+++ 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/ASTMatcher.groovy
@@ -1052,15 +1052,14 @@ class ASTMatcher extends ContextualClassCodeVisitor {
     }
 
     /**
-     * TODO: experimental!
-     *
-     * Annotates an AST node with matching contraints. This method should be 
called
-     * on an AST intended to be used as a pattern only. It will put node 
metadata on
-     * the AST node allowing customized behavior in pattern matching.
+     * Annotates an AST node with matching constraints. Call this on an AST
+     * intended to be used as a pattern only; it attaches node metadata that
+     * customises behaviour during pattern matching.
      *
      * @param pattern a pattern AST
      * @param constraintsSpec a closure specification of matching constraints
      * @return the same pattern, annotated with constraints
+     * @since 2.5.0
      */
     static ASTNode withConstraints(ASTNode pattern, 
@DelegatesTo(value=MatchingConstraintsBuilder, strategy=Closure.DELEGATE_ONLY) 
Closure constraintsSpec) {
         def builder = new MatchingConstraintsBuilder()
diff --git 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/MatchingConstraints.groovy
 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/MatchingConstraints.groovy
index 2bdd033dcd..8b04c7a51c 100644
--- 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/MatchingConstraints.groovy
+++ 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/MatchingConstraints.groovy
@@ -38,6 +38,7 @@ class MatchingConstraints {
     public final static ConstraintPredicate<Token> ANY_TOKEN = 
AnyTokenMatch.INSTANCE
 
     final Set<String> placeholders
+    /** @since 5.0.0 */
     final Set<String> varargPlaceholders
     final ConstraintPredicate<Token> tokenPredicate
     final ConstraintPredicate<TreeContext> eventually
diff --git 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/internal/MatchingConstraintsBuilder.groovy
 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/internal/MatchingConstraintsBuilder.groovy
index 1816245f38..01ed129330 100644
--- 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/internal/MatchingConstraintsBuilder.groovy
+++ 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/matcher/internal/MatchingConstraintsBuilder.groovy
@@ -34,6 +34,8 @@ class MatchingConstraintsBuilder {
     Set<String> placeholders = new LinkedHashSet<>()
     /**
      * Placeholder names that can absorb multiple arguments.
+     *
+     * @since 5.0.0
      */
     Set<String> varargPlaceholders = new LinkedHashSet<>()
     /**
@@ -92,6 +94,7 @@ class MatchingConstraintsBuilder {
      *
      * @param names the vararg placeholder names
      * @return this builder
+     * @since 5.0.0
      */
     MatchingConstraintsBuilder varargPlaceholder(String... names) {
         names.each { String it -> varargPlaceholders.add(it) }
diff --git 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/Macro.java
 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/Macro.java
index 6d76564a5d..ce660c9b34 100644
--- 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/Macro.java
+++ 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/Macro.java
@@ -18,8 +18,6 @@
  */
 package org.codehaus.groovy.macro.runtime;
 
-import org.apache.groovy.lang.annotation.Incubating;
-
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -30,6 +28,5 @@ import java.lang.annotation.Target;
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.METHOD})
-@Incubating
 public @interface Macro {
 }
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 ed84ca97c5..4a329ed74f 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,7 +19,6 @@
 package org.codehaus.groovy.macro.runtime;
 
 import groovy.lang.Closure;
-import org.apache.groovy.lang.annotation.Incubating;
 import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.ClassCodeExpressionTransformer;
 import org.codehaus.groovy.ast.ClassNode;
@@ -43,8 +42,6 @@ import static 
org.codehaus.groovy.macro.methods.MacroGroovyMethods.DOLLAR_VALUE;
  *
  * @since 2.5.0
  */
-
-@Incubating
 public enum MacroBuilder {
     /** Shared macro builder instance. */
     INSTANCE;
diff --git 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroContext.java
 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroContext.java
index 4f210a24c3..31fe84510a 100644
--- 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroContext.java
+++ 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/runtime/MacroContext.java
@@ -18,7 +18,6 @@
  */
 package org.codehaus.groovy.macro.runtime;
 
-import org.apache.groovy.lang.annotation.Incubating;
 import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.control.CompilationUnit;
 import org.codehaus.groovy.control.SourceUnit;
@@ -28,8 +27,6 @@ import org.codehaus.groovy.control.SourceUnit;
  *
  * @since 2.5.0
  */
-
-@Incubating
 public class MacroContext {
 
     private final MethodCallExpression call;
diff --git 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroClass.java
 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroClass.java
index 5a3b031eaa..37745f3d4d 100644
--- 
a/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroClass.java
+++ 
b/subprojects/groovy-macro/src/main/groovy/org/codehaus/groovy/macro/transform/MacroClass.java
@@ -18,13 +18,10 @@
  */
 package org.codehaus.groovy.macro.transform;
 
-import org.apache.groovy.lang.annotation.Incubating;
-
 /**
  * Marker base class for anonymous classes expanded into {@link 
org.codehaus.groovy.ast.ClassNode} instances.
  *
  * @since 2.5.0
  */
-@Incubating
 public abstract class MacroClass {
 }

Reply via email to