public void addGetter(Method method, SerializerGen serializer, int added, int removed) { check(method.getGenericParameterTypes().length == 0); check(isPublic(method.getModifiers())); String fieldName = stripGet(method.getName(), method.getReturnType()); check(!fields.containsKey(fieldName), "Duplicate field '%s'", method); FieldGen fieldGen = new FieldGen(); fieldGen.method = method; fieldGen.serializer = serializer; fieldGen.versionAdded = added; fieldGen.versionDeleted = removed; fieldGen.offset = lastOffset; lastOffset += getType(method.getReturnType()).getSize(); fields.put(fieldName, fieldGen); }
public void addField(Field field, SerializerGen serializer, int added, int removed) { check(implInterface || !dataTypeIn.isInterface()); check(isPublic(field.getModifiers())); String fieldName = field.getName(); check(!fields.containsKey(fieldName), "Duplicate field '%s'", field); FieldGen fieldGen = new FieldGen(); fieldGen.field = field; fieldGen.serializer = serializer; fieldGen.versionAdded = added; fieldGen.versionDeleted = removed; fieldGen.offset = lastOffset; lastOffset += getType(field.getType()).getSize(); fields.put(fieldName, fieldGen); }
@Override public void prepareDeserializeStaticMethods( int version, SerializerBuilder.StaticMethods staticMethods, CompatibilityLevel compatibilityLevel) { if (staticMethods.startDeserializeStaticMethod(this, version)) { return; } if (!implInterface && dataTypeIn.isInterface()) { Expression expression = deserializeInterface(this.getRawType(), version, staticMethods, compatibilityLevel); staticMethods.registerStaticDeserializeMethod(this, version, expression); return; } if (!implInterface && constructor == null && factory == null && setters.isEmpty()) { Expression expression = deserializeClassSimple(version, staticMethods, compatibilityLevel); staticMethods.registerStaticDeserializeMethod(this, version, expression); return; } List<Expression> list = new ArrayList<>(); final Map<String, Expression> map = new HashMap<>(); for (String fieldName : fields.keySet()) { FieldGen fieldGen = fields.get(fieldName); if (!fieldGen.hasVersion(version)) continue; fieldGen.serializer.prepareDeserializeStaticMethods( version, staticMethods, compatibilityLevel); Expression expression = let( fieldGen.serializer.deserialize( fieldGen.getRawType(), version, staticMethods, compatibilityLevel)); list.add(expression); map.put(fieldName, cast(expression, fieldGen.getRawType())); } Expression constructor; if (factory == null) { constructor = callConstructor(this.getRawType(), map, version); } else { constructor = callFactory(map, version); } Expression local = let(constructor); list.add(local); for (Method method : setters.keySet()) { boolean found = false; for (String fieldName : setters.get(method)) { FieldGen fieldGen = fields.get(fieldName); Preconditions.checkNotNull(fieldGen, "Field '%s' is not found in '%s'", fieldName, method); if (fieldGen.hasVersion(version)) { found = true; break; } } if (found) { Expression[] temp = new Expression[method.getParameterTypes().length]; int i = 0; for (String fieldName : setters.get(method)) { FieldGen fieldGen = fields.get(fieldName); assert fieldGen != null; if (fieldGen.hasVersion(version)) { temp[i++] = map.get(fieldName); } else { temp[i++] = pushDefaultValue(fieldGen.getAsmType()); } } list.add(call(local, method.getName(), temp)); } } for (String fieldName : fields.keySet()) { FieldGen fieldGen = fields.get(fieldName); if (!fieldGen.hasVersion(version)) continue; if (fieldGen.field == null || isFinal(fieldGen.field.getModifiers())) continue; Variable field = field(local, fieldName); list.add(set(field, map.get(fieldName))); } list.add(local); staticMethods.registerStaticDeserializeMethod(this, version, sequence(list)); }