You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2020/09/20 05:00:34 UTC

[groovy] branch master updated: GROOVY-9744: PropertyNode should be enriched to support getter/setter names (closes #1370)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 3c02115  GROOVY-9744: PropertyNode should be enriched to support getter/setter names (closes #1370)
3c02115 is described below

commit 3c02115abd414f865d31e7dc146becf94c7310e5
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Sep 16 14:40:10 2020 +1000

    GROOVY-9744: PropertyNode should be enriched to support getter/setter names (closes #1370)
---
 .../groovy/beans/BindableASTTransformation.java    | 14 ++++----
 .../groovy/beans/VetoableASTTransformation.java    | 13 ++++----
 src/main/java/groovy/lang/MetaProperty.java        |  2 +-
 .../java/org/codehaus/groovy/ast/PropertyNode.java | 36 +++++++++++++++++++++
 .../codehaus/groovy/ast/tools/GeneralUtils.java    | 37 ++++++++++++++--------
 .../groovy/classgen/AsmClassGenerator.java         |  6 ++--
 .../groovy/classgen/ClassCompletionVerifier.java   | 10 +++---
 .../org/codehaus/groovy/classgen/Verifier.java     |  6 ++--
 .../groovy/control/StaticImportVisitor.java        |  3 +-
 .../EqualsAndHashCodeASTTransformation.java        |  5 ++-
 .../transform/ImmutableASTTransformation.java      |  5 ++-
 .../transform/trait/TraitASTTransformation.java    |  4 +--
 12 files changed, 90 insertions(+), 51 deletions(-)

diff --git a/src/main/java/groovy/beans/BindableASTTransformation.java b/src/main/java/groovy/beans/BindableASTTransformation.java
index f20dbc1..c0e863d 100644
--- a/src/main/java/groovy/beans/BindableASTTransformation.java
+++ b/src/main/java/groovy/beans/BindableASTTransformation.java
@@ -42,7 +42,6 @@ import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 
 import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedMethod;
-import static org.apache.groovy.util.BeanUtils.capitalize;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX;
@@ -51,7 +50,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.declS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.getSetterName;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.localVarX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.param;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.params;
@@ -172,9 +170,9 @@ public class BindableASTTransformation implements ASTTransformation, Opcodes {
     /*
      * Wrap an existing setter.
      */
-    private static void wrapSetterMethod(ClassNode classNode, String propertyName) {
-        String getterName = "get" + capitalize(propertyName);
-        MethodNode setter = classNode.getSetterMethod(getSetterName(propertyName));
+    private static void wrapSetterMethod(ClassNode classNode, PropertyNode propertyNode) {
+        String getterName = propertyNode.getGetterName();
+        MethodNode setter = classNode.getSetterMethod(propertyNode.getSetterName());
 
         if (setter != null) {
             // Get the existing code block
@@ -194,7 +192,7 @@ public class BindableASTTransformation implements ASTTransformation, Opcodes {
             block.addStatement(declS(newValue, callThisX(getterName)));
 
             // add the firePropertyChange method call
-            block.addStatement(stmt(callThisX("firePropertyChange", args(constX(propertyName), oldValue, newValue))));
+            block.addStatement(stmt(callThisX("firePropertyChange", args(constX(propertyNode.getName()), oldValue, newValue))));
 
             // replace the existing code block with our new one
             setter.setCode(block);
@@ -202,14 +200,14 @@ public class BindableASTTransformation implements ASTTransformation, Opcodes {
     }
 
     private void createListenerSetter(ClassNode classNode, PropertyNode propertyNode) {
-        String setterName = getSetterName(propertyNode.getName());
+        String setterName = propertyNode.getSetterName();
         if (classNode.getMethods(setterName).isEmpty()) {
             Statement setterBlock = createBindableStatement(propertyNode, fieldX(propertyNode.getField()));
 
             // create method void <setter>(<type> fieldName)
             createSetterMethod(classNode, propertyNode, setterName, setterBlock);
         } else {
-            wrapSetterMethod(classNode, propertyNode.getName());
+            wrapSetterMethod(classNode, propertyNode);
         }
     }
 
diff --git a/src/main/java/groovy/beans/VetoableASTTransformation.java b/src/main/java/groovy/beans/VetoableASTTransformation.java
index 32e3854..7b531dc 100644
--- a/src/main/java/groovy/beans/VetoableASTTransformation.java
+++ b/src/main/java/groovy/beans/VetoableASTTransformation.java
@@ -42,7 +42,6 @@ import java.beans.VetoableChangeListener;
 import java.beans.VetoableChangeSupport;
 
 import static org.apache.groovy.ast.tools.ClassNodeUtils.addGeneratedMethod;
-import static org.apache.groovy.util.BeanUtils.capitalize;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.args;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX;
@@ -51,7 +50,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.declS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.getSetterName;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.localVarX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.param;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.params;
@@ -156,9 +154,10 @@ public class VetoableASTTransformation extends BindableASTTransformation {
     /**
      * Wrap an existing setter.
      */
-    private static void wrapSetterMethod(ClassNode classNode, boolean bindable, String propertyName) {
-        String getterName = "get" + capitalize(propertyName);
-        MethodNode setter = classNode.getSetterMethod(getSetterName(propertyName));
+    private static void wrapSetterMethod(ClassNode classNode, boolean bindable, PropertyNode propertyNode) {
+        String getterName = propertyNode.getGetterName();
+        String propertyName = propertyNode.getName();
+        MethodNode setter = classNode.getSetterMethod(propertyNode.getSetterName());
 
         if (setter != null) {
             // Get the existing code block
@@ -199,7 +198,7 @@ public class VetoableASTTransformation extends BindableASTTransformation {
         if (needsVetoableChangeSupport(declaringClass, source)) {
             addVetoableChangeSupport(declaringClass);
         }
-        String setterName = getSetterName(propertyNode.getName());
+        String setterName = propertyNode.getSetterName();
         if (declaringClass.getMethods(setterName).isEmpty()) {
             Expression fieldExpression = fieldX(propertyNode.getField());
             BlockStatement setterBlock = new BlockStatement();
@@ -213,7 +212,7 @@ public class VetoableASTTransformation extends BindableASTTransformation {
             // create method void <setter>(<type> fieldName)
             createSetterMethod(declaringClass, propertyNode, setterName, setterBlock);
         } else {
-            wrapSetterMethod(declaringClass, bindable, propertyNode.getName());
+            wrapSetterMethod(declaringClass, bindable, propertyNode);
         }
     }
 
diff --git a/src/main/java/groovy/lang/MetaProperty.java b/src/main/java/groovy/lang/MetaProperty.java
index 5318b47..c52eee6 100644
--- a/src/main/java/groovy/lang/MetaProperty.java
+++ b/src/main/java/groovy/lang/MetaProperty.java
@@ -81,7 +81,7 @@ public abstract class MetaProperty {
     /**
      * Gets the name for the getter for this property
      *
-     * @return The name of the property. The name is "get"+ the capitalized propertyName
+     * @return The name of the property. The name is "get" + the capitalized propertyName
      *         or, in the case of boolean values, "is" + the capitalized propertyName
      */
     public static String getGetterName(String propertyName, Class type) {
diff --git a/src/main/java/org/codehaus/groovy/ast/PropertyNode.java b/src/main/java/org/codehaus/groovy/ast/PropertyNode.java
index 726aff5..8ed8959 100644
--- a/src/main/java/org/codehaus/groovy/ast/PropertyNode.java
+++ b/src/main/java/org/codehaus/groovy/ast/PropertyNode.java
@@ -18,6 +18,7 @@
  */
 package org.codehaus.groovy.ast;
 
+import groovy.lang.MetaProperty;
 import org.codehaus.groovy.ast.expr.Expression;
 import org.codehaus.groovy.ast.stmt.Statement;
 
@@ -25,6 +26,8 @@ import static org.objectweb.asm.Opcodes.ACC_PRIVATE;
 import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
 import static org.objectweb.asm.Opcodes.ACC_STATIC;
 
+import static org.apache.groovy.util.BeanUtils.capitalize;
+
 /**
  * Represents a property (member variable, a getter and setter)
  */
@@ -34,6 +37,8 @@ public class PropertyNode extends AnnotatedNode implements Variable {
 
     private Statement getterBlock;
     private Statement setterBlock;
+    private String getterName = null;
+    private String setterName = null;
     private final int modifiers;
 
     public PropertyNode(
@@ -66,6 +71,37 @@ public class PropertyNode extends AnnotatedNode implements Variable {
         this.setterBlock = setterBlock;
     }
 
+    public String getGetterName() {
+        if (getterName != null) return getterName;
+        String defaultName = "get" + capitalize(getName());
+        if (ClassHelper.boolean_TYPE.equals(getOriginType())
+                && getDeclaringClass().getMethod(defaultName, Parameter.EMPTY_ARRAY) == null) {
+            String altName = "is" + capitalize(getName());
+            if (getDeclaringClass().getMethod(altName, Parameter.EMPTY_ARRAY) != null) {
+                defaultName = altName;
+            }
+        }
+        return defaultName;
+    }
+
+    public void setGetterName(String getterName) {
+        if (getterName == null || getterName.isEmpty()) {
+            throw new IllegalArgumentException("A non-null non-empty getter name is required");
+        }
+        this.getterName = getterName;
+    }
+
+    public String getSetterName() {
+        return setterName != null ? setterName : MetaProperty.getSetterName(getName());
+    }
+
+    public void setSetterName(String setterName) {
+        if (setterName == null || setterName.isEmpty()) {
+            throw new IllegalArgumentException("A non-null non-empty setter name is required");
+        }
+        this.setterName = setterName;
+    }
+
     public int getModifiers() {
         return modifiers;
     }
diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
index 862ea4e..fd182e5 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
@@ -79,8 +79,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.Consumer;
 
-import static org.apache.groovy.util.BeanUtils.capitalize;
-
 /**
  * Handy methods when working with the Groovy AST
  */
@@ -519,7 +517,7 @@ public class GeneralUtils {
     public static Expression getterThisX(final ClassNode annotatedNode, final PropertyNode pNode) {
         ClassNode owner = pNode.getDeclaringClass();
         if (annotatedNode.equals(owner)) {
-            return callThisX(getterName(annotatedNode, pNode));
+            return callThisX(pNode.getGetterName());
         }
         return propX(varX("this"), pNode.getName());
     }
@@ -536,7 +534,7 @@ public class GeneralUtils {
     public static Expression getterX(final ClassNode annotatedNode, final Expression receiver, final PropertyNode pNode) {
         ClassNode owner = pNode.getDeclaringClass();
         if (annotatedNode.equals(owner)) {
-            return callX(receiver, getterName(annotatedNode, pNode));
+            return callX(receiver, pNode.getGetterName());
         }
         return propX(receiver, pNode.getName());
     }
@@ -555,7 +553,7 @@ public class GeneralUtils {
 
     @Deprecated
     public static BinaryExpression hasEqualPropertyX(final PropertyNode pNode, final Expression other) {
-        String getterName = getGetterName(pNode);
+        String getterName = pNode.getGetterName();
         return eqX(callThisX(getterName), callX(other, getterName));
     }
 
@@ -871,17 +869,28 @@ public class GeneralUtils {
         return ifElseS(equalsNullX(value), assignInit, assignS(fieldExpr, castX(fType, value)));
     }
 
-    private static String getterName(final ClassNode annotatedNode, final PropertyNode pNode) {
-        String getterName = getGetterName(pNode);
-        if (ClassHelper.boolean_TYPE.equals(pNode.getOriginType())
-                && annotatedNode.getMethod(getterName, Parameter.EMPTY_ARRAY) == null) {
-            getterName = "is" + capitalize(pNode.getName());
-        }
-        return getterName;
+    /**
+     * Generally preferred to use {@link PropertyNode#getGetterName()} directly.
+     */
+    public static String getGetterName(final PropertyNode pNode) {
+        return pNode.getGetterName();
     }
 
-    public static String getGetterName(final PropertyNode pNode) {
-        return "get" + capitalize(pNode.getName());
+    /**
+     * WARNING: Avoid this method unless just the name and type are available.
+     * Use {@link #getGetterName(PropertyNode)} if the propertyNode is available.
+     */
+    public static String getGetterName(final String name, final Class<?> type) {
+        return MetaProperty.getGetterName(name, type);
+    }
+
+    /**
+     * WARNING: Avoid this method unless just the name is available.
+     * Use {@link #getGetterName(PropertyNode)} if the propertyNode is available.
+     * Use {@link #getGetterName(String, Class)} if the type is available.
+     */
+    public static String getGetterName(final String name) {
+        return MetaProperty.getGetterName(name, Object.class);
     }
 
     public static String getSetterName(final String name) {
diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index 1f99040..72024f0 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -126,11 +126,11 @@ import java.util.Objects;
 import java.util.Optional;
 
 import static org.apache.groovy.ast.tools.ExpressionUtils.isThisOrSuper;
-import static org.apache.groovy.util.BeanUtils.capitalize;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.attrX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.classX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.getGetterName;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.getSetterName;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.propX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.thisPropX;
@@ -1022,7 +1022,7 @@ public class AsmClassGenerator extends ClassGenerator {
         ClassNode classNode = controller.getClassNode();
 
         if (!controller.getCompileStack().isLHS()) {
-            String methodName = "get" + capitalize(propertyName); // TODO: "is"
+            String methodName = getGetterName(propertyName); // TODO: "is"
             callX(pexp.getObjectExpression(), methodName).visit(this);
             return true;
         }
@@ -1037,7 +1037,7 @@ public class AsmClassGenerator extends ClassGenerator {
         }
 
         MethodNode setter = classNode.getSuperClass().getSetterMethod(getSetterName(propertyName));
-        MethodNode getter = classNode.getSuperClass().getGetterMethod("get" + capitalize(propertyName));
+        MethodNode getter = classNode.getSuperClass().getGetterMethod(getGetterName(propertyName));
 
         if (fieldNode.isPrivate() && (setter == null || getter == null || !setter.getDeclaringClass().equals(getter.getDeclaringClass()))) {
             throw new RuntimeParserException("Cannot access private field[" + propertyName + "] of " + classNode.getName() + "'s super class", pexp);
diff --git a/src/main/java/org/codehaus/groovy/classgen/ClassCompletionVerifier.java b/src/main/java/org/codehaus/groovy/classgen/ClassCompletionVerifier.java
index dff9da3..812da1c 100644
--- a/src/main/java/org/codehaus/groovy/classgen/ClassCompletionVerifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/ClassCompletionVerifier.java
@@ -61,7 +61,6 @@ import static java.lang.reflect.Modifier.isStrict;
 import static java.lang.reflect.Modifier.isSynchronized;
 import static java.lang.reflect.Modifier.isTransient;
 import static java.lang.reflect.Modifier.isVolatile;
-import static org.apache.groovy.util.BeanUtils.capitalize;
 import static org.codehaus.groovy.ast.ClassHelper.VOID_TYPE;
 import static org.objectweb.asm.Opcodes.ACC_ABSTRACT;
 import static org.objectweb.asm.Opcodes.ACC_FINAL;
@@ -541,12 +540,11 @@ public class ClassCompletionVerifier extends ClassCodeVisitorSupport {
     private void checkDuplicateProperties(PropertyNode node) {
         ClassNode cn = node.getDeclaringClass();
         String name = node.getName();
-        String getterName = "get" + capitalize(name);
+        String getterName = node.getGetterName();
         if (Character.isUpperCase(name.charAt(0))) {
-            for (PropertyNode propNode : cn.getProperties()) {
-                String otherName = propNode.getField().getName();
-                String otherGetterName = "get" + capitalize(otherName);
-                if (node != propNode && getterName.equals(otherGetterName)) {
+            for (PropertyNode otherNode : cn.getProperties()) {
+                String otherName = otherNode.getName();
+                if (node != otherNode && getterName.equals(otherNode.getGetterName())) {
                     String msg = "The field " + name + " and " + otherName + " on the class " +
                             cn.getName() + " will result in duplicate JavaBean properties, which is not allowed";
                     addError(msg, node);
diff --git a/src/main/java/org/codehaus/groovy/classgen/Verifier.java b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
index f6e5ff6..35e5f07 100644
--- a/src/main/java/org/codehaus/groovy/classgen/Verifier.java
+++ b/src/main/java/org/codehaus/groovy/classgen/Verifier.java
@@ -105,7 +105,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.castX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.declS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.getSetterName;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.getGetterName;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.localVarX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.param;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt;
@@ -679,8 +679,8 @@ public class Verifier implements GroovyClassVisitor, Opcodes {
         String name = node.getName();
         FieldNode field = node.getField();
 
-        String getterName = "get" + capitalize(name);
-        String setterName = getSetterName(name);
+        String getterName = getGetterName(name);
+        String setterName = node.getSetterName();
 
         int accessorModifiers = adjustPropertyModifiersForMethod(node);
 
diff --git a/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java b/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java
index de4e174..f92bde2 100644
--- a/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java
+++ b/src/main/java/org/codehaus/groovy/control/StaticImportVisitor.java
@@ -62,6 +62,7 @@ import static org.apache.groovy.ast.tools.ClassNodeUtils.isValidAccessorName;
 import static org.apache.groovy.ast.tools.ExpressionUtils.transformInlineConstants;
 import static org.apache.groovy.util.BeanUtils.capitalize;
 import static org.codehaus.groovy.ast.tools.ClosureUtils.getParametersSafe;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.getGetterName;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.getSetterName;
 
 /**
@@ -508,7 +509,7 @@ public class StaticImportVisitor extends ClassCodeExpressionTransformer {
     }
 
     private String getAccessorName(String name) {
-        return inLeftExpression ? getSetterName(name) : "get" + capitalize(name);
+        return inLeftExpression ? getSetterName(name) : getGetterName(name);
     }
 
     private Expression findStaticPropertyAccessorGivenArgs(ClassNode staticImportType, String propName, Expression args) {
diff --git a/src/main/java/org/codehaus/groovy/transform/EqualsAndHashCodeASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/EqualsAndHashCodeASTTransformation.java
index 928b400..76d72e0 100644
--- a/src/main/java/org/codehaus/groovy/transform/EqualsAndHashCodeASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/EqualsAndHashCodeASTTransformation.java
@@ -57,7 +57,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.declS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.equalsNullX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.getAllProperties;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.getGetterName;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.getInstanceNonPropertyFields;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.getterThisX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.hasClassX;
@@ -314,7 +313,7 @@ public class EqualsAndHashCodeASTTransformation extends AbstractASTTransformatio
     }
 
     private static BinaryExpression differentSelfRecursivePropertyX(PropertyNode pNode, Expression other) {
-        String getterName = getGetterName(pNode);
+        String getterName = pNode.getGetterName();
         Expression selfGetter = callThisX(getterName);
         Expression otherGetter = callX(other, getterName);
         return orX(
@@ -324,7 +323,7 @@ public class EqualsAndHashCodeASTTransformation extends AbstractASTTransformatio
     }
 
     private static BinaryExpression bothSelfRecursivePropertyX(PropertyNode pNode, Expression other) {
-        String getterName = getGetterName(pNode);
+        String getterName = pNode.getGetterName();
         Expression selfGetter = callThisX(getterName);
         Expression otherGetter = callX(other, getterName);
         return andX(
diff --git a/src/main/java/org/codehaus/groovy/transform/ImmutableASTTransformation.java b/src/main/java/org/codehaus/groovy/transform/ImmutableASTTransformation.java
index f21e50a..785a48a 100644
--- a/src/main/java/org/codehaus/groovy/transform/ImmutableASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/ImmutableASTTransformation.java
@@ -66,7 +66,6 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.declS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.eqX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.equalsNullX;
-import static org.codehaus.groovy.ast.tools.GeneralUtils.getGetterName;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.getInstanceProperties;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.hasDeclaredMethod;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ifElseS;
@@ -254,7 +253,7 @@ public class ImmutableASTTransformation extends AbstractASTTransformation implem
                                 ),
                                 declS(
                                         localVarX("oldValue", ClassHelper.OBJECT_TYPE),
-                                        callThisX(getGetterName(pNode))
+                                        callThisX(pNode.getGetterName())
                                 ),
                                 ifS(
                                         neX(
@@ -287,7 +286,7 @@ public class ImmutableASTTransformation extends AbstractASTTransformation implem
                                         "put",
                                         args(
                                                 constX(pNode.getName()),
-                                                callThisX(getGetterName(pNode))
+                                                callThisX(pNode.getGetterName())
                                         )
                                 ))
                         )
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 7b6328d..c07cd85 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/TraitASTTransformation.java
@@ -397,8 +397,8 @@ public class TraitASTTransformation extends AbstractASTTransformation implements
         FieldNode field = node.getField();
         int propNodeModifiers = node.getModifiers() & 0x1F; // GROOVY-3726
 
-        String getterName = GeneralUtils.getGetterName(node);
-        String setterName = GeneralUtils.getSetterName(name);
+        String getterName = node.getGetterName();
+        String setterName = node.getSetterName();
 
         Statement getterBlock = node.getGetterBlock();
         if (getterBlock == null) {