docs: @SuppressWarnings("unchecked")
      private static void addPrivateFieldsAccessors(ClassNode node) {
          Set<ASTNode> accessedFields = (Set<ASTNode>) node.getNodeMetaData(StaticTypesMarker.PV_FIELDS_ACCESS);
          Set<ASTNode> mutatedFields = (Set<ASTNode>) node.getNodeMetaData(StaticTypesMarker.PV_FIELDS_MUTATION);
          if (accessedFields == null && mutatedFields == null) return;
          Map<String, MethodNode> privateFieldAccessors = (Map<String, MethodNode>) node.getNodeMetaData(PRIVATE_FIELDS_ACCESSORS);
          Map<String, MethodNode> privateFieldMutators = (Map<String, MethodNode>) node.getNodeMetaData(PRIVATE_FIELDS_MUTATORS);
          if (privateFieldAccessors != null || privateFieldMutators != null) {
              // already added
              return;
          }
          int acc = -1;
          privateFieldAccessors = accessedFields != null ? new HashMap<String, MethodNode>() : null;
          privateFieldMutators = mutatedFields != null ? new HashMap<String, MethodNode>() : null;
          final int access = Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC | Opcodes.ACC_SYNTHETIC;
          for (FieldNode fieldNode : node.getFields()) {
              boolean generateAccessor = accessedFields != null && accessedFields.contains(fieldNode);
              boolean generateMutator = mutatedFields != null && mutatedFields.contains(fieldNode);
              if (generateAccessor) {
                  acc++;
                  Parameter param = new Parameter(node.getPlainNodeReference(), "$that");
                  Expression receiver = fieldNode.isStatic() ? new ClassExpression(node) : new VariableExpression(param);
                  Statement stmt = new ExpressionStatement(new PropertyExpression(
                          receiver,
                          fieldNode.getName()
                  ));
                  MethodNode accessor = node.addMethod("pfaccess$" + acc, access, fieldNode.getOriginType(), new Parameter[]{param}, ClassNode.EMPTY_ARRAY, stmt);
                  privateFieldAccessors.put(fieldNode.getName(), accessor);
              }
  
              if (generateMutator) {
                  //increment acc if it hasn't been incremented in the current iteration
                  if (!generateAccessor) acc++;
                  Parameter param = new Parameter(node.getPlainNodeReference(), "$that");
                  Expression receiver = fieldNode.isStatic() ? new ClassExpression(node) : new VariableExpression(param);
                  Parameter value = new Parameter(fieldNode.getOriginType(), "$value");
                  Statement stmt = GeneralUtils.assignS(
                          new PropertyExpression(receiver, fieldNode.getName()),
                          new VariableExpression(value)
                  );
                  MethodNode mutator = node.addMethod("pfaccess$0" + acc, access, fieldNode.getOriginType(), new Parameter[]{param, value}, ClassNode.EMPTY_ARRAY, stmt);
                  privateFieldMutators.put(fieldNode.getName(), mutator);
              }
          }
          if (privateFieldAccessors != null) node.setNodeMetaData(PRIVATE_FIELDS_ACCESSORS, privateFieldAccessors);
          if (privateFieldMutators != null) node.setNodeMetaData(PRIVATE_FIELDS_MUTATORS, privateFieldMutators);
      }