From 828f9e31ada1f6a1a764c459a3b877dcd92f7b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Endika=20Guti=C3=A9rrez?= Date: Thu, 23 Jun 2016 09:22:47 +0200 Subject: [PATCH 1/2] Added tests for nested lazy properties --- .../groovy/transform/LazyTransformTest.groovy | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/org/codehaus/groovy/transform/LazyTransformTest.groovy b/src/test/org/codehaus/groovy/transform/LazyTransformTest.groovy index 08a0b191ef8..b15e19ab0cb 100644 --- a/src/test/org/codehaus/groovy/transform/LazyTransformTest.groovy +++ b/src/test/org/codehaus/groovy/transform/LazyTransformTest.groovy @@ -181,4 +181,26 @@ class LazyTransformTest extends GroovyShellTestCase { assertTrue res.@'$list' instanceof SoftReference assertEquals([1,2,3], res.list) } + + void testNestedLazyCalls() { + def res = evaluate(""" + class X { + @Lazy def smallSet = [1, 2, 3] + @Lazy def biggerSet = (smallSet + [4, 5, 6]) + } + new X().biggerSet + """) + assertEquals([1,2,3,4,5,6], res) + } + + void testNestedStaticLazyCalls() { + def res = evaluate(""" + class X { + @Lazy static final SMALL_SET = [1, 2, 3] + @Lazy static final BIGGER_SET = (SMALL_SET + [4, 5, 6]) + } + X.BIGGER_SET + """) + assertEquals([1,2,3,4,5,6], res) + } } \ No newline at end of file From ef12fd447dba3d0a3a88e9b638529e9ddfa437af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Endika=20Guti=C3=A9rrez?= Date: Thu, 23 Jun 2016 11:35:36 +0200 Subject: [PATCH 2/2] Fixed nested calls between @Lazy static properties Variable expressions lost owner class context when they are wrapped into the holder class. Now variable initialization is handled by a private static method in the owning class. --- .../codehaus/groovy/transform/LazyASTTransformation.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/org/codehaus/groovy/transform/LazyASTTransformation.java b/src/main/org/codehaus/groovy/transform/LazyASTTransformation.java index 0216c47e268..480db410b04 100644 --- a/src/main/org/codehaus/groovy/transform/LazyASTTransformation.java +++ b/src/main/org/codehaus/groovy/transform/LazyASTTransformation.java @@ -115,7 +115,14 @@ private static void addHolderClassIdiomBody(BlockStatement body, FieldNode field final String fullName = declaringClass.getName() + "$" + fieldType.getNameWithoutPackage() + "Holder_" + fieldNode.getName().substring(1); final InnerClassNode holderClass = new InnerClassNode(declaringClass, fullName, visibility, ClassHelper.OBJECT_TYPE); final String innerFieldName = "INSTANCE"; - holderClass.addField(innerFieldName, ACC_PRIVATE | ACC_STATIC | ACC_FINAL, fieldType, initExpr); + + final String initializeMethodName = fullName + "_initExpr"; + declaringClass.addMethod(initializeMethodName, ACC_PRIVATE | ACC_STATIC | ACC_FINAL, fieldType, + Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, returnS(initExpr)); + + holderClass.addField(innerFieldName, ACC_PRIVATE | ACC_STATIC | ACC_FINAL, fieldType, + callX(declaringClass, initializeMethodName)); + final Expression innerField = propX(classX(holderClass), innerFieldName); declaringClass.getModule().addClass(holderClass); body.addStatement(returnS(innerField));