blob: 2214f03de63435a29326c494d2b1673b41369018 [file] [log] [blame]
package org.eclipse.lsp4j.jsonrpc.json.adapters;
import java.io.IOException;
import java.lang.reflect.Type;
import org.eclipse.lsp4j.jsonrpc.messages.Tuple.Two;
import com.google.gson.Gson;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
public final class TupleTypeAdapters {
private TupleTypeAdapters() {}
public static class TwoTypeAdapter<F extends Object, S extends Object> extends TypeAdapter<Two<F, S>> {
protected final TypeAdapter<F> first;
protected final TypeAdapter<S> second;
@SuppressWarnings("unchecked")
public TwoTypeAdapter(Gson gson, TypeToken<Two<F, S>> typeToken) {
Type[] elementTypes = TypeUtils.getElementTypes(typeToken, Two.class);
this.first = gson.getAdapter((TypeToken<F>) TypeToken.get(elementTypes[0]));
this.second = gson.getAdapter((TypeToken<S>) TypeToken.get(elementTypes[1]));
}
@Override
public void write(final JsonWriter out, final Two<F, S> value) throws IOException {
if (value == null) {
out.nullValue();
} else {
out.beginArray();
first.write(out, value.getFirst());
second.write(out, value.getSecond());
out.endArray();
}
}
@Override
public Two<F, S> read(final JsonReader in) throws IOException {
JsonToken next = in.peek();
if (next == JsonToken.NULL) {
in.nextNull();
return null;
}
in.beginArray();
F f = first.read(in);
S s = second.read(in);
Two<F, S> result = new Two<F, S>(f, s);
in.endArray();
return result;
}
}
public static class TwoTypeAdapterFactory implements TypeAdapterFactory {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
if (!TypeUtils.isTwoTuple(typeToken.getType())) {
return null;
}
return new TwoTypeAdapter(gson, typeToken);
}
}
}