You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by gi...@apache.org on 2026/04/14 05:42:22 UTC
(groovy-dev-site) branch asf-site updated: 2026/04/14 05:42:19: Generated dev website from groovy-website@e092dff
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 <bu...@apache.org>
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>