This is an automated email from the ASF dual-hosted git repository.
git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/groovy-dev-site.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 024cbd3 2026/04/14 05:42:19: Generated dev website from
groovy-website@e092dff
024cbd3 is described below
commit 024cbd3e5458508c475fc4bc21f891bc7e22dccb
Author: jenkins <[email protected]>
AuthorDate: Tue Apr 14 05:42:19 2026 +0000
2026/04/14 05:42:19: Generated dev website from groovy-website@e092dff
---
search/search-index.json | 2 +-
wiki/GEP-17.html | 126 +++++++++++++++++++++++++++++++++++++----------
2 files changed, 101 insertions(+), 27 deletions(-)
diff --git a/search/search-index.json b/search/search-index.json
index e6659e7..a108759 100644
--- a/search/search-index.json
+++ b/search/search-index.json
@@ -779,7 +779,7 @@
{
"id": "wiki/GEP-17.html",
"title": "The Apache Groovy programming language - Developer docs -
GEP-17",
- "content": "The Apache Groovy programming language - Developer docs -
GEP-17 Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky
Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on
GitHub Report issues in Jira Stack Overflow questions Slack Community You are
using an outdated browser. Please upgrade your browser to improve your
experience. Apache Groovy™ Learn Documentation Download Support
Contribute Ecosystem Blog posts Socialize GE [...]
+ "content": "The Apache Groovy programming language - Developer docs -
GEP-17 Socialize Discuss on the mailing list Groovy on X Groovy on Bluesky
Groovy on Mastodon Groovy on LinkedIn Events and conferences Source code on
GitHub Report issues in Jira Stack Overflow questions Slack Community You are
using an outdated browser. Please upgrade your browser to improve your
experience. Apache Groovy™ Learn Documentation Download Support
Contribute Ecosystem Blog posts Socialize GE [...]
"url": "wiki/GEP-17.html",
"site": "dev"
},
diff --git a/wiki/GEP-17.html b/wiki/GEP-17.html
index d52dece..971c934 100644
--- a/wiki/GEP-17.html
+++ b/wiki/GEP-17.html
@@ -79,7 +79,7 @@
<strong>Title</strong>
</td>
<td class="hdlist2">
-<p>Consistent handling of internal properties via <code>@Internal</code></p>
+<p>Design Note: Consistent handling of internal properties via
<code>@Internal</code></p>
</td>
</tr>
<tr>
@@ -127,7 +127,7 @@
<strong>Last modification</strong> 
</td>
<td class="hdlist2">
-<p>2026-04-13</p>
+<p>2026-04-14</p>
</td>
</tr>
<tr>
@@ -352,7 +352,7 @@ that only have a name string (e.g.
<code>java.beans.PropertyDescriptor</code>).<
<h2 id="_current_status">Current status</h2>
<div class="sectionbody">
<div class="sect2">
-<h3 id="_proposed_pr2467_targeting_groovy_6_0">Proposed (PR#2467 targeting
Groovy 6.0)</h3>
+<h3 id="_infrastructure_donepr2467">Infrastructure
(done — PR#2467)</h3>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 33.3333%;">
@@ -370,42 +370,82 @@ that only have a name string (e.g.
<code>java.beans.PropertyDescriptor</code>).<
<td class="tableblock halign-left valign-top"><p
class="tableblock">Done</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>AbstractASTTransformation.shouldSkip(node,
…​)</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Done — node-aware overloads</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Node-aware
<code>shouldSkip</code>/<code>shouldSkipUndefinedAware</code> overloads</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">Done — in
<code>AbstractASTTransformation</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>MetaClassImpl.getProperties()</code> — respects
<code>@Internal</code></p></td>
<td class="tableblock halign-left valign-top"><p
class="tableblock">Done</p></td>
</tr>
+</tbody>
+</table>
+</div>
+<div class="sect2">
+<h3
id="_consumerstransforms_that_iterate_properties_donepr2467">Consumers — transforms
that iterate properties (done — PR#2467)</h3>
+<div class="paragraph">
+<p>All use node-aware skip methods that check both <code>@Internal</code> and
<code>$</code> convention:
+<code>@ToString</code>, <code>@EqualsAndHashCode</code>,
<code>@TupleConstructor</code>, <code>@MapConstructor</code>,
+<code>@Builder</code>, <code>@Delegate</code>, <code>@Immutable</code>.</p>
+</div>
+</div>
+<div class="sect2">
+<h3
id="_producerstransforms_that_create_internal_fields">Producers — transforms
that create internal fields</h3>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 33.3333%;">
+<col style="width: 66.6667%;">
+</colgroup>
+<thead>
<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@EqualsAndHashCode</code> — marks
<code>$hash$code</code> as <code>@Internal</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Done</p></td>
+<th class="tableblock halign-left valign-top">Component</th>
+<th class="tableblock halign-left valign-top">Status</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@EqualsAndHashCode</code> — marks
<code>$hash$code</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Done
(PR#2467)</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@Lazy</code> — marks backing field
as <code>@Internal</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Done</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@Lazy</code> — marks backing
field</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Done
(PR#2467)</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@ReadWriteLock</code> — marks lock
fields as <code>@Internal</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Done</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@ReadWriteLock</code> — marks lock
fields</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Done
(PR#2467)</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@ToString</code>, <code>@EqualsAndHashCode</code>,
<code>@TupleConstructor</code>, <code>@MapConstructor</code>,
<code>@Builder</code>, <code>@Delegate</code></p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Done — use node-aware skip methods</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@ToString</code> — marks
<code>$to$string</code> cache field</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">Done</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@Immutable</code> — uses
<code>deemedInternal(fNode)</code></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>@Synchronized</code> — marks
<code>$LOCK</code> and <code>$lock</code></p></td>
<td class="tableblock halign-left valign-top"><p
class="tableblock">Done</p></td>
</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>TraitComposer</code> — marks trait
implementation fields</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock">Done — these fields (e.g.
<code>com_example_Named__name</code>) do not
+ contain <code>$</code>, so the name convention never caught them.
+ This was the only case where internal fields were leaking
+ into <code>metaClass.properties</code>.</p></td>
+</tr>
</tbody>
</table>
</div>
<div class="sect2">
-<h3 id="_future_work">Future work</h3>
+<h3 id="_cleanup">Cleanup</h3>
+<div class="paragraph">
+<p>Removed <code>markAsInternal</code> and <code>deemedInternal</code> wrapper
methods from
+<code>AbstractASTTransformation</code>. Call sites now import directly from
+<code>AnnotatedNodeUtils</code>, avoiding method shadowing issues.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_deferredcompiler_internals">Deferred — compiler
internals</h3>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
-<col style="width: 33.3333%;">
-<col style="width: 66.6667%;">
+<col style="width: 25%;">
+<col style="width: 75%;">
</colgroup>
<thead>
<tr>
@@ -415,20 +455,54 @@ that only have a name string (e.g.
<code>java.beans.PropertyDescriptor</code>).<
</thead>
<tbody>
<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Trait
system (<code>TraitComposer</code>)</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">Trait-generated <code>$Trait$</code> fields should be marked
<code>@Internal</code></p></td>
-</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Compiler
internals (<code>Verifier</code>)</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Audit
which compiler-generated <code>$</code> fields surface in
<code>getProperties()</code></p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>Verifier</code> (<code>__$stMC</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Adding
<code>@Internal</code> causes NPE in
<code>ExtendedVerifier.visitAnnotations</code>
+ during nested compilation contexts (triggered by
<code>evaluateExpression</code>
+ in static type checking) where <code>this.source</code> is null.
+ Needs a null guard in <code>ExtendedVerifier</code> or an alternative
mechanism.</p></td>
</tr>
<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>deemedInternalName</code> deprecation</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">Once all
producers annotate with <code>@Internal</code>, the <code>$</code> name check
- could be deprecated (not urgent — backward compat)</p></td>
+<td class="tableblock halign-left valign-top"><p
class="tableblock"><code>InnerClassVisitor</code> (<code>this$0</code>)</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Adding
<code>@Internal</code> causes duplicate annotation errors in some
+ inner class scenarios. Needs investigation of the annotation
+ duplication path.</p></td>
</tr>
</tbody>
</table>
+<div class="paragraph">
+<p>Both continue to rely on the <code>$</code> naming convention via
+<code>deemedInternal()</code> / <code>deemedInternalName()</code>.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_path_to_deprecating_the_fallback">Path to deprecating the
<code>$</code> fallback</h3>
+<div class="paragraph">
+<p>The <code>$</code> name convention (<code>deemedInternalName</code>) cannot
be deprecated
+immediately, even once all Groovy’s own producers use
<code>@Internal</code>.
+Third-party frameworks and AST transforms that generate <code>$</code>-named
+fields also rely on this convention. The deprecation path is:</p>
+</div>
+<div class="olist arabic">
+<ol class="arabic">
+<li>
+<p><strong>Document</strong> the <code>@Internal</code> annotation as the
recommended approach
+for framework authors (this GEP serves as that design note).</p>
+</li>
+<li>
+<p><strong>Allow time</strong> for framework authors to adopt
<code>@Internal</code> in their
+own transforms and generated code.</p>
+</li>
+<li>
+<p><strong>Deprecate</strong> <code>deemedInternalName()</code> in a future
version once
+adoption is sufficient.</p>
+</li>
+<li>
+<p><strong>Remove</strong> the <code>$</code> fallback eventually, potentially
retaining a
+more surgical check for specific known compiler fields
+(e.g. <code>__$stMC</code>) if they cannot be annotated.</p>
+</li>
+</ol>
+</div>
</div>
</div>
</div>