in commons/src/main/kotlin/org/jetbrains/bazel/commons/gson/BazelGson.kt [85:128]
override fun read(reader: JsonReader): T? {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull()
return null
}
// Only parse enough to get the type
if (reader.peek() != JsonToken.BEGIN_OBJECT) {
return delegateAdapter.read(reader)
}
reader.beginObject()
var className: String? = null
val jsonObject = com.google.gson.JsonObject()
while (reader.hasNext()) {
val name = reader.nextName()
if (name == TYPE_FIELD) {
className = reader.nextString()
} else {
// Read property value as JsonElement
val value =
com.google.gson.JsonParser
.parseReader(reader)
jsonObject.add(name, value)
}
}
reader.endObject()
if (className != null) {
val adapter = subclassAdapters[className]
if (adapter != null) {
// Add type info back
jsonObject.addProperty(TYPE_FIELD, className)
// Use the specifically fetched adapter, not going through gson.fromJson
@Suppress("UNCHECKED_CAST")
return adapter.fromJsonTree(jsonObject) as T
}
}
// Fallback: deserialize as the base type
@Suppress("UNCHECKED_CAST")
return delegateAdapter.fromJsonTree(jsonObject) as T
}