groovy git commit: GROOVY-8281: Final field is null in trait, but it has assigned value

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

groovy git commit: GROOVY-8281: Final field is null in trait, but it has assigned value

paulk
Repository: groovy
Updated Branches:
  refs/heads/master 49238eddd -> be7834c73


GROOVY-8281: Final field is null in trait, but it has assigned value


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/be7834c7
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/be7834c7
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/be7834c7

Branch: refs/heads/master
Commit: be7834c73ff967372f7714bad3ec1c5b662d1456
Parents: 49238ed
Author: Paul King <[hidden email]>
Authored: Tue Jul 10 21:51:57 2018 +1000
Committer: Paul King <[hidden email]>
Committed: Tue Jul 10 21:51:57 2018 +1000

----------------------------------------------------------------------
 .../transform/trait/TraitASTTransformation.java | 49 ++++++++++----------
 .../traitx/TraitASTTransformationTest.groovy    | 26 +++++++++--
 2 files changed, 46 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/be7834c7/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
----------------------------------------------------------------------
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 f52ee6c..55d894c 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
@@ -452,32 +452,33 @@ public class TraitASTTransformation extends AbstractASTTransformation implements
                         returnS(initCode.getExpression())
                 );
                 helper.addMethod(fieldInitializer);
-            }
-            BlockStatement code = (BlockStatement) selectedMethod.getCode();
-            MethodCallExpression mce;
-            if (field.isStatic()) {
-                if (staticFieldHelper != null) {
-                    target = staticFieldHelper;
-                }
-                mce = new MethodCallExpression(
-                        new ClassExpression(INVOKERHELPER_CLASSNODE),
-                        "invokeStaticMethod",
-                        new ArgumentListExpression(
-                                thisObject,
-                                new ConstantExpression(Traits.helperSetterName(field)),
-                                initCode.getExpression()
-                        )
-                );
             } else {
-                mce = new MethodCallExpression(
-                        new CastExpression(createReceiverType(field.isStatic(), fieldHelper), thisObject),
-                        Traits.helperSetterName(field),
-                        new CastExpression(field.getOriginType(),initCode.getExpression())
-                );
+                BlockStatement code = (BlockStatement) selectedMethod.getCode();
+                MethodCallExpression mce;
+                if (field.isStatic()) {
+                    if (staticFieldHelper != null) {
+                        target = staticFieldHelper;
+                    }
+                    mce = new MethodCallExpression(
+                            new ClassExpression(INVOKERHELPER_CLASSNODE),
+                            "invokeStaticMethod",
+                            new ArgumentListExpression(
+                                    thisObject,
+                                    new ConstantExpression(Traits.helperSetterName(field)),
+                                    initCode.getExpression()
+                            )
+                    );
+                } else {
+                    mce = new MethodCallExpression(
+                            new CastExpression(createReceiverType(field.isStatic(), fieldHelper), thisObject),
+                            Traits.helperSetterName(field),
+                            new CastExpression(field.getOriginType(),initCode.getExpression())
+                    );
+                }
+                mce.setImplicitThis(false);
+                mce.setSourcePosition(initialExpression);
+                code.addStatement(new ExpressionStatement(mce));
             }
-            mce.setImplicitThis(false);
-            mce.setSourcePosition(initialExpression);
-            code.addStatement(new ExpressionStatement(mce));
         }
         // define setter/getter helper methods (setter added even for final fields for legacy compatibility)
         target.addMethod(

http://git-wip-us.apache.org/repos/asf/groovy/blob/be7834c7/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
----------------------------------------------------------------------
diff --git a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index cd12aa3..439e680 100644
--- a/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -524,7 +524,7 @@ assert MyEnum.X.bar == 123 && MyEnum.Y.bar == 0
             @groovy.transform.CompileStatic
             class StringProvider implements Provider<String> {}
             def c = new StringProvider()
-            assert c.get('foo') == 'foo\'
+            assert c.get('foo') == 'foo'
         '''
     }
 
@@ -1344,7 +1344,8 @@ class Person implements ListTrait<String> {
 }
 def p = new Person()
 p.foo()
-assert p.get(0) == 'bar\''''
+assert p.get(0) == 'bar'
+'''
     }
 
     void testAnnotationShouldBeCarriedOver() {
@@ -2423,10 +2424,10 @@ assert c.b() == 2
                 String version
             }
             def module = configure(Module) {
-                name = 'test\'
-                version = '1.0\'
+                name = 'test'
+                version = '1.0'
             }
-            assert module.value == 'test-1.0\'
+            assert module.value == 'test-1.0'
         '''
 
         assertScript '''
@@ -2458,4 +2459,19 @@ assert c.b() == 2
         '''
     }
 
+    //GROOVY-8281
+    void testFinalFieldsDependency() {
+        assertScript '''
+            trait MyTrait {
+                private final String foo = 'foo'
+                private final String foobar = foo.toUpperCase() + 'bar'
+                int foobarSize() { foobar.size() }
+            }
+
+            class Baz implements MyTrait {}
+
+            assert new Baz().foobarSize() == 6
+        '''
+    }
+
 }