semanticTokensDto.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import { VSBuffer } from '../../../base/common/buffer.js';
  6. import * as platform from '../../../base/common/platform.js';
  7. function reverseEndianness(arr) {
  8. for (let i = 0, len = arr.length; i < len; i += 4) {
  9. // flip bytes 0<->3 and 1<->2
  10. const b0 = arr[i + 0];
  11. const b1 = arr[i + 1];
  12. const b2 = arr[i + 2];
  13. const b3 = arr[i + 3];
  14. arr[i + 0] = b3;
  15. arr[i + 1] = b2;
  16. arr[i + 2] = b1;
  17. arr[i + 3] = b0;
  18. }
  19. }
  20. function toLittleEndianBuffer(arr) {
  21. const uint8Arr = new Uint8Array(arr.buffer, arr.byteOffset, arr.length * 4);
  22. if (!platform.isLittleEndian()) {
  23. // the byte order must be changed
  24. reverseEndianness(uint8Arr);
  25. }
  26. return VSBuffer.wrap(uint8Arr);
  27. }
  28. export function encodeSemanticTokensDto(semanticTokens) {
  29. const dest = new Uint32Array(encodeSemanticTokensDtoSize(semanticTokens));
  30. let offset = 0;
  31. dest[offset++] = semanticTokens.id;
  32. if (semanticTokens.type === 'full') {
  33. dest[offset++] = 1 /* Full */;
  34. dest[offset++] = semanticTokens.data.length;
  35. dest.set(semanticTokens.data, offset);
  36. offset += semanticTokens.data.length;
  37. }
  38. else {
  39. dest[offset++] = 2 /* Delta */;
  40. dest[offset++] = semanticTokens.deltas.length;
  41. for (const delta of semanticTokens.deltas) {
  42. dest[offset++] = delta.start;
  43. dest[offset++] = delta.deleteCount;
  44. if (delta.data) {
  45. dest[offset++] = delta.data.length;
  46. dest.set(delta.data, offset);
  47. offset += delta.data.length;
  48. }
  49. else {
  50. dest[offset++] = 0;
  51. }
  52. }
  53. }
  54. return toLittleEndianBuffer(dest);
  55. }
  56. function encodeSemanticTokensDtoSize(semanticTokens) {
  57. let result = 0;
  58. result += (+1 // id
  59. + 1 // type
  60. );
  61. if (semanticTokens.type === 'full') {
  62. result += (+1 // data length
  63. + semanticTokens.data.length);
  64. }
  65. else {
  66. result += (+1 // delta count
  67. );
  68. result += (+1 // start
  69. + 1 // deleteCount
  70. + 1 // data length
  71. ) * semanticTokens.deltas.length;
  72. for (const delta of semanticTokens.deltas) {
  73. if (delta.data) {
  74. result += delta.data.length;
  75. }
  76. }
  77. }
  78. return result;
  79. }