Skip to content

Commit

Permalink
Simplify collection type adapters slightly. (#2791)
Browse files Browse the repository at this point in the history
* Simplify collection type adapters slightly.

By moving some computations to the factory, we can pass fewer parameters
to the constructor.

* Fix formatting.
  • Loading branch information
eamonnmcmanus authored Jan 28, 2025
1 parent ab9c54f commit 10bdd6d
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,12 @@ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {

Type elementType = $Gson$Types.getCollectionElementType(type, rawType);
TypeAdapter<?> elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType));
TypeAdapter<?> wrappedTypeAdapter =
new TypeAdapterRuntimeTypeWrapper<>(gson, elementTypeAdapter, elementType);
ObjectConstructor<T> constructor = constructorConstructor.get(typeToken);

@SuppressWarnings({"unchecked", "rawtypes"}) // create() doesn't define a type parameter
TypeAdapter<T> result = new Adapter(gson, elementType, elementTypeAdapter, constructor);
TypeAdapter<T> result = new Adapter(wrappedTypeAdapter, constructor);
return result;
}

Expand All @@ -61,12 +63,8 @@ private static final class Adapter<E> extends TypeAdapter<Collection<E>> {
private final ObjectConstructor<? extends Collection<E>> constructor;

public Adapter(
Gson context,
Type elementType,
TypeAdapter<E> elementTypeAdapter,
ObjectConstructor<? extends Collection<E>> constructor) {
this.elementTypeAdapter =
new TypeAdapterRuntimeTypeWrapper<>(context, elementTypeAdapter, elementType);
TypeAdapter<E> elementTypeAdapter, ObjectConstructor<? extends Collection<E>> constructor) {
this.elementTypeAdapter = elementTypeAdapter;
this.constructor = constructor;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,15 +132,19 @@ public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
}

Type[] keyAndValueTypes = $Gson$Types.getMapKeyAndValueTypes(type, rawType);
TypeAdapter<?> keyAdapter = getKeyAdapter(gson, keyAndValueTypes[0]);
TypeAdapter<?> valueAdapter = gson.getAdapter(TypeToken.get(keyAndValueTypes[1]));
Type keyType = keyAndValueTypes[0];
Type valueType = keyAndValueTypes[1];
TypeAdapter<?> keyAdapter = getKeyAdapter(gson, keyType);
TypeAdapter<?> wrappedKeyAdapter =
new TypeAdapterRuntimeTypeWrapper<>(gson, keyAdapter, keyType);
TypeAdapter<?> valueAdapter = gson.getAdapter(TypeToken.get(valueType));
TypeAdapter<?> wrappedValueAdapter =
new TypeAdapterRuntimeTypeWrapper<>(gson, valueAdapter, valueType);
ObjectConstructor<T> constructor = constructorConstructor.get(typeToken);

@SuppressWarnings({"unchecked", "rawtypes"})
// we don't define a type parameter for the key or value types
TypeAdapter<T> result =
new Adapter(
gson, keyAndValueTypes[0], keyAdapter, keyAndValueTypes[1], valueAdapter, constructor);
TypeAdapter<T> result = new Adapter(wrappedKeyAdapter, wrappedValueAdapter, constructor);
return result;
}

Expand All @@ -157,15 +161,11 @@ private final class Adapter<K, V> extends TypeAdapter<Map<K, V>> {
private final ObjectConstructor<? extends Map<K, V>> constructor;

public Adapter(
Gson context,
Type keyType,
TypeAdapter<K> keyTypeAdapter,
Type valueType,
TypeAdapter<V> valueTypeAdapter,
ObjectConstructor<? extends Map<K, V>> constructor) {
this.keyTypeAdapter = new TypeAdapterRuntimeTypeWrapper<>(context, keyTypeAdapter, keyType);
this.valueTypeAdapter =
new TypeAdapterRuntimeTypeWrapper<>(context, valueTypeAdapter, valueType);
this.keyTypeAdapter = keyTypeAdapter;
this.valueTypeAdapter = valueTypeAdapter;
this.constructor = constructor;
}

Expand Down

0 comments on commit 10bdd6d

Please sign in to comment.