@SuppressWarnings({ "rawtypes", "unchecked" }) @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { if (!TypeUtils.isEither(typeToken.getType())) { return null; } return new EitherTypeAdapter(gson, typeToken); }
@Override public Either<L, R> read(JsonReader in) throws IOException { JsonToken next = in.peek(); if (next == JsonToken.NULL) { in.nextNull(); return null; } return create(next, in); }
protected Either<L, R> create(JsonToken nextToken, JsonReader in) throws IOException { boolean matchesLeft = left.isAssignable(nextToken); boolean matchesRight = right.isAssignable(nextToken); if (matchesLeft && matchesRight) { if (leftChecker != null || rightChecker != null) { JsonElement element = new JsonParser().parse(in); if (leftChecker != null && leftChecker.test(element)) // Parse the left alternative from the JSON element tree return createLeft(left.read(element)); if (rightChecker != null && rightChecker.test(element)) // Parse the right alternative from the JSON element tree return createRight(right.read(element)); } throw new JsonParseException("Ambiguous Either type: token " + nextToken + " matches both alternatives."); } else if (matchesLeft) { // Parse the left alternative from the JSON stream return createLeft(left.read(in)); } else if (matchesRight) { // Parse the right alternative from the JSON stream return createRight(right.read(in)); } else { throw new JsonParseException("Unexpected token " + nextToken + ": expected " + left + " | " + right + " tokens."); } }
@SuppressWarnings({ "rawtypes", "unchecked" }) @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { if (!TypeUtils.isEither(typeToken.getType())) { return null; } return new EitherTypeAdapter(gson, typeToken); }
protected Either<L, R> create(JsonToken nextToken, JsonReader in) throws IOException { boolean matchesLeft = left.isAssignable(nextToken); boolean matchesRight = right.isAssignable(nextToken); if (matchesLeft && matchesRight) { if (leftChecker != null || rightChecker != null) { JsonElement element = new JsonParser().parse(in); if (leftChecker != null && leftChecker.test(element)) // Parse the left alternative from the JSON element tree return createLeft(left.read(element)); if (rightChecker != null && rightChecker.test(element)) // Parse the right alternative from the JSON element tree return createRight(right.read(element)); } throw new JsonParseException("Ambiguous Either type: token " + nextToken + " matches both alternatives."); } else if (matchesLeft) { // Parse the left alternative from the JSON stream return createLeft(left.read(in)); } else if (matchesRight) { // Parse the right alternative from the JSON stream return createRight(right.read(in)); } else { throw new JsonParseException("Unexpected token " + nextToken + ": expected " + left + " | " + right + " tokens."); } }
@Override public Either<L, R> read(JsonReader in) throws IOException { JsonToken next = in.peek(); if (next == JsonToken.NULL) { in.nextNull(); return null; } return create(next, in); }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Predicate<JsonElement> leftChecker = new PropertyChecker("start"); Predicate<JsonElement> rightChecker = new PropertyChecker("range"); TypeAdapter<Either<Range, PrepareRenameResult>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); } }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { PropertyChecker leftChecker = new PropertyChecker("location"); PropertyChecker rightChecker = new PropertyChecker("range"); TypeAdapter<Either<SymbolInformation, DocumentSymbol>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Predicate<JsonElement> leftChecker = new PropertyChecker("start"); Predicate<JsonElement> rightChecker = new PropertyChecker("range"); TypeAdapter<Either<Range, PrepareRenameResult>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); } }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { PropertyChecker leftChecker = new PropertyChecker("location"); PropertyChecker rightChecker = new PropertyChecker("range"); TypeAdapter<Either<SymbolInformation, DocumentSymbol>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Predicate<JsonElement> leftChecker = new PropertyChecker("command", JsonPrimitive.class); Predicate<JsonElement> rightChecker = new PropertyChecker("edit").or(new PropertyChecker("command", JsonObject.class)); TypeAdapter<Either<Command, CodeAction>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Predicate<JsonElement> leftChecker = new PropertyChecker("textDocument").and(new PropertyChecker("edits")); Predicate<JsonElement> rightChecker = new PropertyChecker("kind"); TypeAdapter<Either<TextDocumentEdit, ResourceOperation>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); } }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Predicate<JsonElement> leftChecker = new PropertyChecker("textDocument").and(new PropertyChecker("edits")); Predicate<JsonElement> rightChecker = new PropertyChecker("kind"); TypeAdapter<Either<TextDocumentEdit, ResourceOperation>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); } }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Predicate<JsonElement> leftChecker = new PropertyChecker("command", JsonPrimitive.class); Predicate<JsonElement> rightChecker = new PropertyChecker("edit").or(new PropertyChecker("command", JsonObject.class)); TypeAdapter<Either<Command, CodeAction>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Predicate<JsonElement> leftChecker = new PropertyChecker("current").or(new PropertyChecker("newUri")); Predicate<JsonElement> rightChecker = new PropertyChecker("textDocument").and(new PropertyChecker("edits")); TypeAdapter<Either<ResourceChange, TextDocumentEdit>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); }
@SuppressWarnings("unchecked") @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { Predicate<JsonElement> leftChecker = new PropertyChecker("current").or(new PropertyChecker("newUri")); Predicate<JsonElement> rightChecker = new PropertyChecker("textDocument").and(new PropertyChecker("edits")); TypeAdapter<Either<ResourceChange, TextDocumentEdit>> elementTypeAdapter = new EitherTypeAdapter<>(gson, ELEMENT_TYPE, leftChecker, rightChecker); return (TypeAdapter<T>) new CollectionTypeAdapter<>(gson, ELEMENT_TYPE.getType(), elementTypeAdapter, ArrayList::new); }