MethodPatchResponsesConverter.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. #if ENABLE_MONO && (DEVELOPMENT_BUILD || UNITY_EDITOR)
  2. using System;
  3. using System.Collections.Generic;
  4. using SingularityGroup.HotReload.DTO;
  5. using SingularityGroup.HotReload.Newtonsoft.Json;
  6. namespace SingularityGroup.HotReload.JsonConverters {
  7. internal class MethodPatchResponsesConverter : JsonConverter {
  8. public override bool CanConvert(Type objectType) {
  9. return objectType == typeof(List<MethodPatchResponse>);
  10. }
  11. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
  12. var list = new List<MethodPatchResponse>();
  13. while (reader.Read()) {
  14. if (reader.TokenType == JsonToken.StartObject) {
  15. list.Add(ReadMethodPatchResponse(reader));
  16. } else if (reader.TokenType == JsonToken.EndArray) {
  17. break; // End of the SMethod list
  18. }
  19. }
  20. return list;
  21. }
  22. private MethodPatchResponse ReadMethodPatchResponse(JsonReader reader) {
  23. string id = null;
  24. CodePatch[] patches = null;
  25. string[] failures = null;
  26. SMethod[] removedMethod = null;
  27. SField[] alteredFields = null;
  28. SField[] addedFieldInitializerFields = null;
  29. SMethod[] addedFieldInitializerInitializers = null;
  30. SField[] removedFieldInitializers = null;
  31. SField[] newFieldDefinitions = null;
  32. while (reader.Read()) {
  33. if (reader.TokenType == JsonToken.EndObject) {
  34. break;
  35. }
  36. if (reader.TokenType != JsonToken.PropertyName) {
  37. continue;
  38. }
  39. var propertyName = (string)reader.Value;
  40. switch (propertyName) {
  41. case nameof(MethodPatchResponse.id):
  42. id = reader.ReadAsString();
  43. break;
  44. case nameof(MethodPatchResponse.patches):
  45. patches = ReadPatches(reader);
  46. break;
  47. case nameof(MethodPatchResponse.failures):
  48. failures = ReadStringArray(reader);
  49. break;
  50. case nameof(MethodPatchResponse.removedMethod):
  51. removedMethod = ReadSMethodArray(reader);
  52. break;
  53. case nameof(MethodPatchResponse.alteredFields):
  54. alteredFields = ReadSFields(reader);
  55. break;
  56. case nameof(MethodPatchResponse.addedFieldInitializerFields):
  57. addedFieldInitializerFields = ReadSFields(reader);
  58. break;
  59. case nameof(MethodPatchResponse.addedFieldInitializerInitializers):
  60. addedFieldInitializerInitializers = ReadSMethodArray(reader);
  61. break;
  62. case nameof(MethodPatchResponse.removedFieldInitializers):
  63. removedFieldInitializers = ReadSFields(reader);
  64. break;
  65. case nameof(MethodPatchResponse.newFieldDefinitions):
  66. newFieldDefinitions = ReadSFields(reader);
  67. break;
  68. default:
  69. reader.Skip(); // Skip unknown properties
  70. break;
  71. }
  72. }
  73. return new MethodPatchResponse(
  74. id ?? string.Empty,
  75. patches ?? Array.Empty<CodePatch>(),
  76. failures ?? Array.Empty<string>(),
  77. removedMethod ?? Array.Empty<SMethod>(),
  78. alteredFields ?? Array.Empty<SField>(),
  79. // Note: suggestions don't have to be persisted here
  80. Array.Empty<PartiallySupportedChange>(),
  81. Array.Empty<HotReloadSuggestionKind>(),
  82. addedFieldInitializerFields ?? Array.Empty<SField>(),
  83. addedFieldInitializerInitializers ?? Array.Empty<SMethod>(),
  84. removedFieldInitializers ?? Array.Empty<SField>(),
  85. newFieldDefinitions ?? Array.Empty<SField>()
  86. );
  87. }
  88. private CodePatch[] ReadPatches(JsonReader reader) {
  89. var patches = new List<CodePatch>();
  90. while (reader.Read()) {
  91. if (reader.TokenType == JsonToken.EndArray) {
  92. break;
  93. }
  94. if (reader.TokenType != JsonToken.StartObject) {
  95. continue;
  96. }
  97. string patchId = null;
  98. string assemblyName = null;
  99. byte[] patchAssembly = null;
  100. byte[] patchPdb = null;
  101. SMethod[] modifiedMethods = null;
  102. SMethod[] patchMethods = null;
  103. SMethod[] newMethods = null;
  104. SUnityJob[] unityJobs = null;
  105. SField[] newFields = null;
  106. SField[] deletedFields = null;
  107. SField[] renamedFieldsFrom = null;
  108. SField[] renamedFieldsTo = null;
  109. SField[] propertyAttributesFieldOriginal = null;
  110. SField[] propertyAttributesFieldUpdated = null;
  111. while (reader.Read()) {
  112. if (reader.TokenType == JsonToken.EndObject) {
  113. break;
  114. }
  115. if (reader.TokenType != JsonToken.PropertyName) {
  116. continue;
  117. }
  118. var propertyName = (string)reader.Value;
  119. switch (propertyName) {
  120. case nameof(CodePatch.patchId):
  121. patchId = reader.ReadAsString();
  122. break;
  123. case nameof(CodePatch.assemblyName):
  124. assemblyName = reader.ReadAsString();
  125. break;
  126. case nameof(CodePatch.patchAssembly):
  127. patchAssembly = Convert.FromBase64String(reader.ReadAsString());
  128. break;
  129. case nameof(CodePatch.patchPdb):
  130. patchPdb = Convert.FromBase64String(reader.ReadAsString());
  131. break;
  132. case nameof(CodePatch.modifiedMethods):
  133. modifiedMethods = ReadSMethodArray(reader);
  134. break;
  135. case nameof(CodePatch.patchMethods):
  136. patchMethods = ReadSMethodArray(reader);
  137. break;
  138. case nameof(CodePatch.newMethods):
  139. newMethods = ReadSMethodArray(reader);
  140. break;
  141. case nameof(CodePatch.unityJobs):
  142. unityJobs = ReadSUnityJobArray(reader);
  143. break;
  144. case nameof(CodePatch.newFields):
  145. newFields = ReadSFields(reader);
  146. break;
  147. case nameof(CodePatch.deletedFields):
  148. deletedFields = ReadSFields(reader);
  149. break;
  150. case nameof(CodePatch.renamedFieldsFrom):
  151. renamedFieldsFrom = ReadSFields(reader);
  152. break;
  153. case nameof(CodePatch.renamedFieldsTo):
  154. renamedFieldsTo = ReadSFields(reader);
  155. break;
  156. case nameof(CodePatch.propertyAttributesFieldOriginal):
  157. propertyAttributesFieldOriginal = ReadSFields(reader);
  158. break;
  159. case nameof(CodePatch.propertyAttributesFieldUpdated):
  160. propertyAttributesFieldUpdated = ReadSFields(reader);
  161. break;
  162. default:
  163. reader.Skip(); // Skip unknown properties
  164. break;
  165. }
  166. }
  167. patches.Add(new CodePatch(
  168. patchId: patchId ?? string.Empty,
  169. assemblyName: assemblyName ?? string.Empty,
  170. patchAssembly: patchAssembly ?? Array.Empty<byte>(),
  171. patchPdb: patchPdb ?? Array.Empty<byte>(),
  172. modifiedMethods: modifiedMethods ?? Array.Empty<SMethod>(),
  173. patchMethods: patchMethods ?? Array.Empty<SMethod>(),
  174. newMethods: newMethods ?? Array.Empty<SMethod>(),
  175. unityJobs: unityJobs ?? Array.Empty<SUnityJob>(),
  176. newFields: newFields ?? Array.Empty<SField>(),
  177. deletedFields: deletedFields ?? Array.Empty<SField>(),
  178. renamedFieldsFrom: renamedFieldsFrom ?? Array.Empty<SField>(),
  179. renamedFieldsTo: renamedFieldsTo ?? Array.Empty<SField>(),
  180. propertyAttributesFieldOriginal: propertyAttributesFieldOriginal ?? Array.Empty<SField>(),
  181. propertyAttributesFieldUpdated: propertyAttributesFieldUpdated ?? Array.Empty<SField>()
  182. ));
  183. }
  184. return patches.ToArray();
  185. }
  186. private string[] ReadStringArray(JsonReader reader) {
  187. var list = new List<string>();
  188. while (reader.Read()) {
  189. if (reader.TokenType == JsonToken.String) {
  190. list.Add((string)reader.Value);
  191. } else if (reader.TokenType == JsonToken.EndArray) {
  192. break; // End of the string list
  193. }
  194. }
  195. return list.ToArray();
  196. }
  197. private SMethod[] ReadSMethodArray(JsonReader reader) {
  198. var list = new List<SMethod>();
  199. while (reader.Read()) {
  200. if (reader.TokenType == JsonToken.StartObject) {
  201. list.Add(ReadSMethod(reader));
  202. } else if (reader.TokenType == JsonToken.EndArray) {
  203. break; // End of the SMethod list
  204. }
  205. }
  206. return list.ToArray();
  207. }
  208. private SType[] ReadSTypeArray(JsonReader reader) {
  209. var list = new List<SType>();
  210. while (reader.Read()) {
  211. if (reader.TokenType == JsonToken.StartObject) {
  212. list.Add(ReadSType(reader));
  213. } else if (reader.TokenType == JsonToken.EndArray) {
  214. break; // End of the SType list
  215. }
  216. }
  217. return list.ToArray();
  218. }
  219. private SUnityJob[] ReadSUnityJobArray(JsonReader reader) {
  220. var array = new List<SUnityJob>();
  221. while (reader.Read()) {
  222. if (reader.TokenType == JsonToken.StartObject) {
  223. array.Add(ReadSUnityJob(reader));
  224. } else if (reader.TokenType == JsonToken.EndArray) {
  225. break; // End of the SUnityJob array
  226. }
  227. }
  228. return array.ToArray();
  229. }
  230. private SField[] ReadSFields(JsonReader reader) {
  231. var array = new List<SField>();
  232. while (reader.Read()) {
  233. if (reader.TokenType == JsonToken.StartObject) {
  234. array.Add(ReadSField(reader));
  235. } else if (reader.TokenType == JsonToken.EndArray) {
  236. break; // End of the SUnityJob array
  237. }
  238. }
  239. return array.ToArray();
  240. }
  241. private SMethod ReadSMethod(JsonReader reader) {
  242. string assemblyName = null;
  243. string displayName = null;
  244. int metadataToken = default(int);
  245. string simpleName = null;
  246. while (reader.Read()) {
  247. if (reader.TokenType == JsonToken.EndObject) {
  248. break;
  249. }
  250. if (reader.TokenType != JsonToken.PropertyName) {
  251. continue;
  252. }
  253. var propertyName = (string)reader.Value;
  254. switch (propertyName) {
  255. case nameof(SMethod.assemblyName):
  256. assemblyName = reader.ReadAsString();
  257. break;
  258. case nameof(SMethod.displayName):
  259. displayName = reader.ReadAsString();
  260. break;
  261. case nameof(SMethod.metadataToken):
  262. metadataToken = reader.ReadAsInt32() ?? default(int);
  263. break;
  264. case nameof(SMethod.simpleName):
  265. simpleName = reader.ReadAsString();
  266. break;
  267. default:
  268. reader.Skip(); // Skip unknown properties
  269. break;
  270. }
  271. }
  272. return new SMethod(
  273. assemblyName ?? string.Empty,
  274. displayName ?? string.Empty,
  275. metadataToken,
  276. simpleName ?? string.Empty
  277. );
  278. }
  279. private SType ReadSType(JsonReader reader) {
  280. string assemblyName = null;
  281. string typeName = null;
  282. int? metadataToken = null;
  283. while (reader.Read()) {
  284. if (reader.TokenType == JsonToken.Null) {
  285. return null;
  286. }
  287. if (reader.TokenType == JsonToken.EndObject) {
  288. break;
  289. }
  290. if (reader.TokenType != JsonToken.PropertyName) {
  291. continue;
  292. }
  293. var propertyName = (string)reader.Value;
  294. switch (propertyName) {
  295. case nameof(SType.assemblyName):
  296. assemblyName = reader.ReadAsString();
  297. break;
  298. case nameof(SType.typeName):
  299. typeName = reader.ReadAsString();
  300. break;
  301. case nameof(SType.metadataToken):
  302. metadataToken = reader.ReadAsInt32();
  303. break;
  304. default:
  305. reader.Skip(); // Skip unknown properties
  306. break;
  307. }
  308. }
  309. return new SType(
  310. assemblyName ?? string.Empty,
  311. typeName ?? string.Empty,
  312. metadataToken ?? 0
  313. );
  314. }
  315. private SUnityJob ReadSUnityJob(JsonReader reader) {
  316. int metadataToken = default(int);
  317. UnityJobKind jobKind = default(UnityJobKind);
  318. while (reader.Read()) {
  319. if (reader.TokenType == JsonToken.EndObject) {
  320. break;
  321. }
  322. if (reader.TokenType != JsonToken.PropertyName) {
  323. continue;
  324. }
  325. var propertyName = (string)reader.Value;
  326. switch (propertyName) {
  327. case nameof(SUnityJob.metadataToken):
  328. metadataToken = reader.ReadAsInt32() ?? 0;
  329. break;
  330. case nameof(SUnityJob.jobKind):
  331. var jobKindStr = reader.ReadAsString();
  332. Enum.TryParse(jobKindStr, out jobKind);
  333. break;
  334. default:
  335. reader.Skip(); // Skip unknown properties
  336. break;
  337. }
  338. }
  339. return new SUnityJob(metadataToken, jobKind);
  340. }
  341. private SField ReadSField(JsonReader reader) {
  342. SType declaringType = null;
  343. string fieldName = null;
  344. string assemblyName = null;
  345. int? metadataToken = null;
  346. bool? serializable = null;
  347. bool? isStatic = null;
  348. while (reader.Read()) {
  349. if (reader.TokenType == JsonToken.EndObject) {
  350. break;
  351. }
  352. if (reader.TokenType != JsonToken.PropertyName) {
  353. continue;
  354. }
  355. var propertyName = (string)reader.Value;
  356. switch (propertyName) {
  357. case nameof(SField.declaringType):
  358. declaringType = ReadSType(reader);
  359. break;
  360. case nameof(SField.fieldName):
  361. fieldName = reader.ReadAsString();
  362. break;
  363. case nameof(SField.assemblyName):
  364. assemblyName = reader.ReadAsString();
  365. break;
  366. case nameof(SField.metadataToken):
  367. metadataToken = reader.ReadAsInt32();
  368. break;
  369. case nameof(SField.serializable):
  370. serializable = reader.ReadAsBoolean();
  371. break;
  372. case nameof(SField.isStatic):
  373. isStatic = reader.ReadAsBoolean();
  374. break;
  375. default:
  376. reader.Skip(); // Skip unknown properties
  377. break;
  378. }
  379. }
  380. return new SField(declaringType: declaringType, fieldName: fieldName, assemblyName: assemblyName, metadataToken ?? 0, isStatic ?? false, serializable ?? false);
  381. }
  382. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
  383. var responses = (List<MethodPatchResponse>)value;
  384. if (responses == null) {
  385. writer.WriteNull();
  386. return;
  387. }
  388. writer.WriteStartArray();
  389. foreach (var response in responses) {
  390. writer.WriteStartObject();
  391. writer.WritePropertyName(nameof(response.id));
  392. writer.WriteValue(response.id);
  393. if (response.patches != null) {
  394. writer.WritePropertyName(nameof(response.patches));
  395. writer.WriteStartArray();
  396. foreach (var responsePatch in response.patches) {
  397. writer.WriteStartObject();
  398. writer.WritePropertyName(nameof(responsePatch.patchId));
  399. writer.WriteValue(responsePatch.patchId);
  400. writer.WritePropertyName(nameof(responsePatch.assemblyName));
  401. writer.WriteValue(responsePatch.assemblyName);
  402. writer.WritePropertyName(nameof(responsePatch.patchAssembly));
  403. writer.WriteValue(Convert.ToBase64String(responsePatch.patchAssembly));
  404. writer.WritePropertyName(nameof(responsePatch.patchPdb));
  405. writer.WriteValue(Convert.ToBase64String(responsePatch.patchPdb));
  406. if (responsePatch.modifiedMethods != null) {
  407. writer.WritePropertyName(nameof(responsePatch.modifiedMethods));
  408. writer.WriteStartArray();
  409. foreach (var modifiedMethod in responsePatch.modifiedMethods) {
  410. WriteSMethod(writer, modifiedMethod);
  411. }
  412. writer.WriteEndArray();
  413. }
  414. if (responsePatch.patchMethods != null) {
  415. writer.WritePropertyName(nameof(responsePatch.patchMethods));
  416. writer.WriteStartArray();
  417. foreach (var patchMethod in responsePatch.patchMethods) {
  418. WriteSMethod(writer, patchMethod);
  419. }
  420. writer.WriteEndArray();
  421. }
  422. if (responsePatch.newMethods != null) {
  423. writer.WritePropertyName(nameof(responsePatch.newMethods));
  424. writer.WriteStartArray();
  425. foreach (var newMethod in responsePatch.newMethods) {
  426. WriteSMethod(writer, newMethod);
  427. }
  428. writer.WriteEndArray();
  429. }
  430. if (responsePatch.unityJobs != null) {
  431. writer.WritePropertyName(nameof(responsePatch.unityJobs));
  432. writer.WriteStartArray();
  433. foreach (var unityJob in responsePatch.unityJobs) {
  434. writer.WriteStartObject();
  435. writer.WritePropertyName(nameof(unityJob.metadataToken));
  436. writer.WriteValue(unityJob.metadataToken);
  437. writer.WritePropertyName(nameof(unityJob.jobKind));
  438. writer.WriteValue(unityJob.jobKind.ToString());
  439. writer.WriteEndObject();
  440. }
  441. writer.WriteEndArray();
  442. }
  443. if (responsePatch.newFields != null) {
  444. writer.WritePropertyName(nameof(responsePatch.newFields));
  445. writer.WriteStartArray();
  446. foreach (var newField in responsePatch.newFields) {
  447. WriteSField(writer, newField);
  448. }
  449. writer.WriteEndArray();
  450. }
  451. if (responsePatch.deletedFields != null) {
  452. writer.WritePropertyName(nameof(responsePatch.deletedFields));
  453. writer.WriteStartArray();
  454. foreach (var deletedField in responsePatch.deletedFields) {
  455. WriteSField(writer, deletedField);
  456. }
  457. writer.WriteEndArray();
  458. }
  459. if (responsePatch.renamedFieldsFrom != null) {
  460. writer.WritePropertyName(nameof(responsePatch.renamedFieldsFrom));
  461. writer.WriteStartArray();
  462. foreach (var removedFieldFrom in responsePatch.renamedFieldsFrom) {
  463. WriteSField(writer, removedFieldFrom);
  464. }
  465. writer.WriteEndArray();
  466. }
  467. if (responsePatch.renamedFieldsTo != null) {
  468. writer.WritePropertyName(nameof(responsePatch.renamedFieldsTo));
  469. writer.WriteStartArray();
  470. foreach (var removedFieldTo in responsePatch.renamedFieldsTo) {
  471. WriteSField(writer, removedFieldTo);
  472. }
  473. writer.WriteEndArray();
  474. }
  475. if (responsePatch.propertyAttributesFieldOriginal != null) {
  476. writer.WritePropertyName(nameof(responsePatch.propertyAttributesFieldOriginal));
  477. writer.WriteStartArray();
  478. foreach (var removedFieldFrom in responsePatch.propertyAttributesFieldOriginal) {
  479. WriteSField(writer, removedFieldFrom);
  480. }
  481. writer.WriteEndArray();
  482. }
  483. if (responsePatch.propertyAttributesFieldUpdated != null) {
  484. writer.WritePropertyName(nameof(responsePatch.propertyAttributesFieldUpdated));
  485. writer.WriteStartArray();
  486. foreach (var removedFieldTo in responsePatch.propertyAttributesFieldUpdated) {
  487. WriteSField(writer, removedFieldTo);
  488. }
  489. writer.WriteEndArray();
  490. }
  491. writer.WriteEndObject();
  492. }
  493. writer.WriteEndArray();
  494. }
  495. if (response.failures != null) {
  496. writer.WritePropertyName(nameof(response.failures));
  497. writer.WriteStartArray();
  498. foreach (var failure in response.failures) {
  499. writer.WriteValue(failure);
  500. }
  501. writer.WriteEndArray();
  502. }
  503. if (response.removedMethod != null) {
  504. writer.WritePropertyName(nameof(response.removedMethod));
  505. writer.WriteStartArray();
  506. foreach (var removedMethod in response.removedMethod) {
  507. WriteSMethod(writer, removedMethod);
  508. }
  509. writer.WriteEndArray();
  510. }
  511. if (response.alteredFields != null) {
  512. writer.WritePropertyName(nameof(response.alteredFields));
  513. writer.WriteStartArray();
  514. foreach (var alteredField in response.alteredFields) {
  515. WriteSField(writer, alteredField);
  516. }
  517. writer.WriteEndArray();
  518. }
  519. if (response.addedFieldInitializerFields != null) {
  520. writer.WritePropertyName(nameof(response.addedFieldInitializerFields));
  521. writer.WriteStartArray();
  522. foreach (var addedFieldInitializerField in response.addedFieldInitializerFields) {
  523. WriteSField(writer, addedFieldInitializerField);
  524. }
  525. writer.WriteEndArray();
  526. }
  527. if (response.addedFieldInitializerInitializers != null) {
  528. writer.WritePropertyName(nameof(response.addedFieldInitializerInitializers));
  529. writer.WriteStartArray();
  530. foreach (var addedFieldInitializerInitializer in response.addedFieldInitializerInitializers) {
  531. WriteSMethod(writer, addedFieldInitializerInitializer);
  532. }
  533. writer.WriteEndArray();
  534. }
  535. if (response.removedFieldInitializers != null) {
  536. writer.WritePropertyName(nameof(response.removedFieldInitializers));
  537. writer.WriteStartArray();
  538. foreach (var removedFieldInitializer in response.removedFieldInitializers) {
  539. WriteSField(writer, removedFieldInitializer);
  540. }
  541. writer.WriteEndArray();
  542. }
  543. if (response.newFieldDefinitions != null) {
  544. writer.WritePropertyName(nameof(response.newFieldDefinitions));
  545. writer.WriteStartArray();
  546. foreach (var newFieldDefinition in response.newFieldDefinitions) {
  547. WriteSField(writer, newFieldDefinition);
  548. }
  549. writer.WriteEndArray();
  550. }
  551. writer.WriteEndObject();
  552. }
  553. writer.WriteEndArray();
  554. }
  555. void WriteSMethod(JsonWriter writer, SMethod method) {
  556. writer.WriteStartObject();
  557. writer.WritePropertyName(nameof(method.assemblyName));
  558. writer.WriteValue(method.assemblyName);
  559. writer.WritePropertyName(nameof(method.displayName));
  560. writer.WriteValue(method.displayName);
  561. writer.WritePropertyName(nameof(method.metadataToken));
  562. writer.WriteValue(method.metadataToken);
  563. writer.WritePropertyName(nameof(method.simpleName));
  564. writer.WriteValue(method.simpleName);
  565. writer.WriteEndObject();
  566. }
  567. void WriteSField(JsonWriter writer, SField field) {
  568. writer.WriteStartObject();
  569. writer.WritePropertyName(nameof(field.declaringType));
  570. writer.WriteSType(field.declaringType);
  571. writer.WritePropertyName(nameof(field.fieldName));
  572. writer.WriteValue(field.fieldName);
  573. writer.WritePropertyName(nameof(field.assemblyName));
  574. writer.WriteValue(field.assemblyName);
  575. writer.WritePropertyName(nameof(field.metadataToken));
  576. writer.WriteValue(field.metadataToken);
  577. writer.WritePropertyName(nameof(field.serializable));
  578. writer.WriteValue(field.serializable);
  579. writer.WriteEndObject();
  580. }
  581. }
  582. internal static class MethodPatchResponsesConverterExtensions {
  583. public static void WriteSType(this JsonWriter writer, SType type) {
  584. if (type == null) {
  585. writer.WriteNull();
  586. return;
  587. }
  588. writer.WriteStartObject();
  589. writer.WritePropertyName(nameof(type.assemblyName));
  590. writer.WriteValue(type.assemblyName);
  591. writer.WritePropertyName(nameof(type.typeName));
  592. writer.WriteValue(type.typeName);
  593. writer.WritePropertyName(nameof(type.metadataToken));
  594. writer.WriteValue(type.metadataToken);
  595. writer.WriteEndObject();
  596. }
  597. }
  598. }
  599. #endif