GROOVY-7227: AST transformations relating to properties/fields should validate their includes/excludes lists (closes #22)
Project: http://git-wip-us.apache.org/repos/asf/incubator-groovy/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-groovy/commit/14a3a670 Tree: http://git-wip-us.apache.org/repos/asf/incubator-groovy/tree/14a3a670 Diff: http://git-wip-us.apache.org/repos/asf/incubator-groovy/diff/14a3a670 Branch: refs/heads/master Commit: 14a3a67003beca8cc7f4b2619a3b1af39ec6312b Parents: fd3ce1a Author: Paul King <pa...@asert.com.au> Authored: Fri May 22 23:50:14 2015 +1000 Committer: Paul King <pa...@asert.com.au> Committed: Sat May 23 09:24:22 2015 +1000 ---------------------------------------------------------------------- .../codehaus/groovy/ast/tools/GeneralUtils.java | 2 +- .../transform/ToStringASTTransformation.java | 2 + .../TupleConstructorASTTransformation.java | 2 + .../transform/CanonicalTransformTest.groovy | 51 -------------------- .../transform/ToStringTransformTest.groovy | 13 +++++ 5 files changed, 18 insertions(+), 52 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/14a3a670/src/main/org/codehaus/groovy/ast/tools/GeneralUtils.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/ast/tools/GeneralUtils.java b/src/main/org/codehaus/groovy/ast/tools/GeneralUtils.java index 16e8335..ce4b19e 100644 --- a/src/main/org/codehaus/groovy/ast/tools/GeneralUtils.java +++ b/src/main/org/codehaus/groovy/ast/tools/GeneralUtils.java @@ -383,7 +383,7 @@ public class GeneralUtils { } public static List<String> getInstancePropertyNames(ClassNode cNode) { - List<PropertyNode> pList = getInstanceProperties(cNode); + List<PropertyNode> pList = BeanUtils.getAllProperties(cNode, false, false, true); List<String> result = new ArrayList<String>(pList.size()); for (PropertyNode pNode : pList) { result.add(pNode.getName()); http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/14a3a670/src/main/org/codehaus/groovy/transform/ToStringASTTransformation.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/ToStringASTTransformation.java b/src/main/org/codehaus/groovy/transform/ToStringASTTransformation.java index e16ee63..977940f 100644 --- a/src/main/org/codehaus/groovy/transform/ToStringASTTransformation.java +++ b/src/main/org/codehaus/groovy/transform/ToStringASTTransformation.java @@ -82,6 +82,8 @@ public class ToStringASTTransformation extends AbstractASTTransformation { boolean allProperties = !memberHasValue(anno, "allProperties", false); if (!checkIncludeExclude(anno, excludes, includes, MY_TYPE_NAME)) return; + if (!checkPropertyList(cNode, includes, "includes", anno, MY_TYPE_NAME, includeFields)) return; + if (!checkPropertyList(cNode, excludes, "excludes", anno, MY_TYPE_NAME, includeFields)) return; createToString(cNode, includeSuper, includeFields, excludes, includes, includeNames, ignoreNulls, includePackage, cacheToString, includeSuperProperties, allProperties); } } http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/14a3a670/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java ---------------------------------------------------------------------- diff --git a/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java b/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java index cf9c0ee..9c1420e 100644 --- a/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java +++ b/src/main/org/codehaus/groovy/transform/TupleConstructorASTTransformation.java @@ -113,6 +113,8 @@ public class TupleConstructorASTTransformation extends AbstractASTTransformation List<String> excludes = getMemberList(anno, "excludes"); List<String> includes = getMemberList(anno, "includes"); if (!checkIncludeExclude(anno, excludes, includes, MY_TYPE_NAME)) return; + if (!checkPropertyList(cNode, includes, "includes", anno, MY_TYPE_NAME, includeFields)) return; + if (!checkPropertyList(cNode, excludes, "excludes", anno, MY_TYPE_NAME, includeFields)) return; // if @Immutable is found, let it pick up options and do work so we'll skip if (hasAnnotation(cNode, ImmutableASTTransformation.MY_TYPE)) return; createConstructor(this, cNode, includeFields, includeProperties, includeSuperFields, includeSuperProperties, callSuper, force, excludes, includes, useSetters, defaults); http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/14a3a670/src/test/org/codehaus/groovy/transform/CanonicalTransformTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/transform/CanonicalTransformTest.groovy b/src/test/org/codehaus/groovy/transform/CanonicalTransformTest.groovy index 04710c5..211e9c3 100644 --- a/src/test/org/codehaus/groovy/transform/CanonicalTransformTest.groovy +++ b/src/test/org/codehaus/groovy/transform/CanonicalTransformTest.groovy @@ -18,10 +18,6 @@ */ package org.codehaus.groovy.transform -/** - * @author Paulo Poiati - * @author Paul King - */ class CanonicalTransformTest extends GroovyShellTestCase { void testCanonical() { @@ -593,51 +589,4 @@ class CanonicalTransformTest extends GroovyShellTestCase { } """ } - - // GROOVY-7227 - void testIncludesAndExcludesTogetherResultsInError() { - def message = shouldFail { - evaluate(""" - import groovy.transform.Canonical - @Canonical(includes='surName', excludes='surName') - class Person { - String surName - } - new Person(surName: "Doe").toString() - """) - } - assert message.contains("Error during @Canonical processing: Only one of 'includes' and 'excludes' should be supplied not both.") - } - - // GROOVY-7227 - void testIncludesWithInvalidPropertyNameResultsInError() { - def message = shouldFail { - evaluate(""" - import groovy.transform.Canonical - @Canonical(includes='sirName') - class Person { - String surName - } - new Person(surName: "Doe").toString() - """) - } - assert message.contains("Error during @Canonical processing: 'includes' property 'sirName' does not exist.") - } - - // GROOVY-7227 - void testExcludesWithInvalidPropertyNameResultsInError() { - def message = shouldFail { - evaluate(""" - import groovy.transform.Canonical - @Canonical(excludes='sirName') - class Person { - String firstName - String surName - } - new Person(firstName: "John", surName: "Doe").toString() - """) - } - assert message.contains("Error during @Canonical processing: 'excludes' property 'sirName' does not exist.") - } - } http://git-wip-us.apache.org/repos/asf/incubator-groovy/blob/14a3a670/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy ---------------------------------------------------------------------- diff --git a/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy b/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy index 0df3b9d..237b6d4 100644 --- a/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy +++ b/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy @@ -423,4 +423,17 @@ class ToStringTransformTest extends GroovyShellTestCase { assert message.contains("Error during @ToString processing: 'excludes' property 'sirName' does not exist.") } + void testExcludesWithPseudoPropertyName() { + evaluate ''' + import groovy.transform.* + + @ToString(excludes='full') + class Person { + String first, last + String getFull() { "$first $last" } + } + assert new Person(first: 'John', last: 'Smith').toString() == 'Person(John, Smith)' + ''' + } + }