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

emilles pushed a commit to branch GROOVY_5_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_5_0_X by this push:
     new a5a039e16d GROOVY-11862: add typecast to static field value
a5a039e16d is described below

commit a5a039e16d3547758bee4482f45141060deee48b
Author: Eric Milles <[email protected]>
AuthorDate: Wed Feb 25 10:18:13 2026 -0600

    GROOVY-11862: add typecast to static field value
---
 .../transform/trait/TraitASTTransformation.java    | 49 +++++++++----------
 .../groovy/transform/traitx/Groovy_7217.groovy     | 57 ----------------------
 .../traitx/TraitASTTransformationTest.groovy       | 32 ++++++++++++
 3 files changed, 56 insertions(+), 82 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
index b2478262d5..0fc1e881b3 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
@@ -519,13 +519,14 @@ public class TraitASTTransformation extends 
AbstractASTTransformation implements
             return;
         }
 
-        Expression initialExpression = field.getInitialExpression();
+        Expression initExpression = field.getInitialExpression();
         MethodNode selectedMethod = field.isStatic() ? staticInitializer : 
initializer;
         ClassNode target = field.isStatic() && staticFieldHelper != null ? 
staticFieldHelper : fieldHelper;
-        if (initialExpression != null) {
+        if (initExpression != null) {
             VariableExpression thisObject = 
varX(selectedMethod.getParameters()[0]);
-            ExpressionStatement initCode = new 
ExpressionStatement(initialExpression);
-            processBody(thisObject, initCode, trait, helper, fieldHelper, 
knownFields);
+            ExpressionStatement initValue = new 
ExpressionStatement(initExpression);
+            processBody(thisObject, initValue, trait, helper, fieldHelper, 
knownFields);
+            initExpression = initValue.getExpression(); // extract transformed 
expression
             if (field.isFinal()) {
                 String baseName = field.isStatic() ? Traits.STATIC_INIT_METHOD 
: Traits.INIT_METHOD;
                 MethodNode fieldInitializer = new MethodNode(
@@ -534,37 +535,35 @@ public class TraitASTTransformation extends 
AbstractASTTransformation implements
                         field.getOriginType(),
                         new Parameter[]{createSelfParameter(trait, 
field.isStatic())},
                         ClassNode.EMPTY_ARRAY,
-                        returnS(initCode.getExpression())
+                        returnS(initExpression)
                 );
                 helper.addMethod(fieldInitializer);
             } else {
-                BlockStatement code = (BlockStatement) 
selectedMethod.getCode();
-                MethodCallExpression mce;
+                initExpression = castX(field.getOriginType(), initExpression); 
// GROOVY-7217, GROOVY-11862
+
+                Expression receiver;
+                String methodTarget;
+                Expression callArgs;
                 if (field.isStatic()) {
-                    if (staticFieldHelper != null) {
-                        target = staticFieldHelper;
-                    }
-                    mce = callX(
-                            classX(InvokerHelper.class),
-                            "invokeStaticMethod",
-                            args(
-                                    thisObject,
-                                    constX(Traits.helperSetterName(field)),
-                                    initCode.getExpression()
-                            )
+                    receiver = classX(InvokerHelper.class);
+                    methodTarget = "invokeStaticMethod";
+                    callArgs = args(
+                            thisObject,
+                            constX(Traits.helperSetterName(field)),
+                            initExpression
                     );
                 } else {
-                    mce = callX(
-                            castX(createReceiverType(field.isStatic(), 
fieldHelper), thisObject),
-                            Traits.helperSetterName(field),
-                            castX(field.getOriginType(), 
initCode.getExpression())
-                    );
+                    receiver = castX(fieldHelper, thisObject);
+                    methodTarget = Traits.helperSetterName(field);
+                    callArgs = initExpression;
                 }
+                MethodCallExpression mce = callX(receiver, methodTarget, 
callArgs);
                 mce.setImplicitThis(false);
-                mce.setSourcePosition(initialExpression);
-                code.addStatement(stmt(mce));
+                mce.setSourcePosition(field.getInitialExpression());
+                
((BlockStatement)selectedMethod.getCode()).addStatement(stmt(mce));
             }
         }
+
         // define setter/getter helper methods (setter added even for final 
fields for legacy compatibility)
         addGeneratedMethod(target,
                 Traits.helperSetterName(field),
diff --git 
a/src/test/groovy/org/codehaus/groovy/transform/traitx/Groovy_7217.groovy 
b/src/test/groovy/org/codehaus/groovy/transform/traitx/Groovy_7217.groovy
deleted file mode 100644
index 7543ef24fc..0000000000
--- a/src/test/groovy/org/codehaus/groovy/transform/traitx/Groovy_7217.groovy
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  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.codehaus.groovy.transform.traitx
-
-import org.junit.jupiter.api.Test
-
-import static groovy.test.GroovyAssert.assertScript
-
-final class Groovy_7217 {
-
-    @Test
-    void testNumberInitializationInTrait() {
-        assertScript '''
-            trait Version {
-                Long version = 1
-            }
-            class HasVersion implements Version {
-            }
-
-            def v = new HasVersion()
-            assert v.version == 1'''
-    }
-
-    @Test
-    void testAnyInitializerInTrait() {
-        assertScript '''
-            class SomeA {}
-            trait DummyInit {
-                SomeA a = init()
-            }
-            class Dummy implements DummyInit {
-                def init() {
-                    new SomeA()
-                }
-            }
-
-            def d = new Dummy()
-            assert d.a instanceof SomeA
-        '''
-    }
-}
diff --git 
a/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
 
b/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index a20c020d71..259db64938 100644
--- 
a/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++ 
b/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -333,6 +333,38 @@ final class TraitASTTransformationTest {
         '''
     }
 
+    // GROOVY-7217
+    @ParameterizedTest
+    
@ValueSource(strings=['byte','short','int','long','float','double','Byte','Short','Integer','Long','Float','Double','Number'])
+    void testTraitWithProperty6(String type) {
+        assertScript shell, """
+            trait T {
+                $type n = 42
+            }
+            class C implements T {
+            }
+
+            def c = new C()
+            assert c.getN() == 42
+        """
+    }
+
+    // GROOVY-11862
+    @ParameterizedTest
+    
@ValueSource(strings=['byte','short','int','long','float','double','Byte','Short','Integer','Long','Float','Double','Number'])
+    void testTraitWithProperty7(String type) {
+        assertScript shell, """
+            trait T {
+                static $type n = 42
+            }
+            class C implements T {
+            }
+
+            def c = new C()
+            assert c.getN() == 42
+        """
+    }
+
     @Test
     void testUpdatePropertyFromSelf() {
         assertScript shell, '''

Reply via email to