/**
  * This method is similar to {@link #propX(Expression, Expression)} but will make sure that if the
  * property being accessed is defined inside the classnode provided as a parameter, then a getter
  * call is generated instead of a field access.
  *
  * @param annotatedNode the class node where the property node is accessed from
  * @param pNode the property being accessed
  * @return a method call expression or a property expression
  */
 public static Expression getterThisX(ClassNode annotatedNode, PropertyNode pNode) {
   ClassNode owner = pNode.getDeclaringClass();
   if (annotatedNode.equals(owner)) {
     String getterName = "get" + MetaClassHelper.capitalize(pNode.getName());
     boolean existingExplicitGetter =
         annotatedNode.getMethod(getterName, Parameter.EMPTY_ARRAY) != null;
     if (ClassHelper.boolean_TYPE.equals(pNode.getOriginType()) && !existingExplicitGetter) {
       getterName = "is" + MetaClassHelper.capitalize(pNode.getName());
     }
     return callThisX(getterName);
   }
   return propX(new VariableExpression("this"), pNode.getName());
 }
 private void checkDuplicateProperties(PropertyNode node) {
   ClassNode cn = node.getDeclaringClass();
   String name = node.getName();
   String getterName = "get" + MetaClassHelper.capitalize(name);
   if (Character.isUpperCase(name.charAt(0))) {
     for (PropertyNode propNode : cn.getProperties()) {
       String otherName = propNode.getField().getName();
       String otherGetterName = "get" + MetaClassHelper.capitalize(otherName);
       if (node != propNode && getterName.equals(otherGetterName)) {
         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);
       }
     }
   }
 }