web 3d图形渲染器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
16 KiB

  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const compare_1 = require("./compare");
  4. function emitForest(trees) {
  5. return emitForestLines(trees).join("\n");
  6. }
  7. exports.emitForest = emitForest;
  8. function emitForestLines(trees) {
  9. const colMap = getColMap(trees);
  10. const header = emitOffsets(colMap);
  11. return [header, ...trees.map(tree => emitTree(tree, colMap).join("\n"))];
  12. }
  13. exports.emitForestLines = emitForestLines;
  14. function getColMap(trees) {
  15. const eventSet = new Set();
  16. for (const tree of trees) {
  17. const stack = [tree];
  18. while (stack.length > 0) {
  19. const cur = stack.pop();
  20. eventSet.add(cur.start);
  21. eventSet.add(cur.end);
  22. for (const child of cur.children) {
  23. stack.push(child);
  24. }
  25. }
  26. }
  27. const events = [...eventSet];
  28. events.sort((a, b) => a - b);
  29. let maxDigits = 1;
  30. for (const event of events) {
  31. maxDigits = Math.max(maxDigits, event.toString(10).length);
  32. }
  33. const colWidth = maxDigits + 3;
  34. const colMap = new Map();
  35. for (const [i, event] of events.entries()) {
  36. colMap.set(event, i * colWidth);
  37. }
  38. return colMap;
  39. }
  40. function emitTree(tree, colMap) {
  41. const layers = [];
  42. let nextLayer = [tree];
  43. while (nextLayer.length > 0) {
  44. const layer = nextLayer;
  45. layers.push(layer);
  46. nextLayer = [];
  47. for (const node of layer) {
  48. for (const child of node.children) {
  49. nextLayer.push(child);
  50. }
  51. }
  52. }
  53. return layers.map(layer => emitTreeLayer(layer, colMap));
  54. }
  55. function parseFunctionRanges(text, offsetMap) {
  56. const result = [];
  57. for (const line of text.split("\n")) {
  58. for (const range of parseTreeLayer(line, offsetMap)) {
  59. result.push(range);
  60. }
  61. }
  62. result.sort(compare_1.compareRangeCovs);
  63. return result;
  64. }
  65. exports.parseFunctionRanges = parseFunctionRanges;
  66. /**
  67. *
  68. * @param layer Sorted list of disjoint trees.
  69. * @param colMap
  70. */
  71. function emitTreeLayer(layer, colMap) {
  72. const line = [];
  73. let curIdx = 0;
  74. for (const { start, end, count } of layer) {
  75. const startIdx = colMap.get(start);
  76. const endIdx = colMap.get(end);
  77. if (startIdx > curIdx) {
  78. line.push(" ".repeat(startIdx - curIdx));
  79. }
  80. line.push(emitRange(count, endIdx - startIdx));
  81. curIdx = endIdx;
  82. }
  83. return line.join("");
  84. }
  85. function parseTreeLayer(text, offsetMap) {
  86. const result = [];
  87. const regex = /\[(\d+)-*\)/gs;
  88. while (true) {
  89. const match = regex.exec(text);
  90. if (match === null) {
  91. break;
  92. }
  93. const startIdx = match.index;
  94. const endIdx = startIdx + match[0].length;
  95. const count = parseInt(match[1], 10);
  96. const startOffset = offsetMap.get(startIdx);
  97. const endOffset = offsetMap.get(endIdx);
  98. if (startOffset === undefined || endOffset === undefined) {
  99. throw new Error(`Invalid offsets for: ${JSON.stringify(text)}`);
  100. }
  101. result.push({ startOffset, endOffset, count });
  102. }
  103. return result;
  104. }
  105. function emitRange(count, len) {
  106. const rangeStart = `[${count.toString(10)}`;
  107. const rangeEnd = ")";
  108. const hyphensLen = len - (rangeStart.length + rangeEnd.length);
  109. const hyphens = "-".repeat(Math.max(0, hyphensLen));
  110. return `${rangeStart}${hyphens}${rangeEnd}`;
  111. }
  112. function emitOffsets(colMap) {
  113. let line = "";
  114. for (const [event, col] of colMap) {
  115. if (line.length < col) {
  116. line += " ".repeat(col - line.length);
  117. }
  118. line += event.toString(10);
  119. }
  120. return line;
  121. }
  122. function parseOffsets(text) {
  123. const result = new Map();
  124. const regex = /\d+/gs;
  125. while (true) {
  126. const match = regex.exec(text);
  127. if (match === null) {
  128. break;
  129. }
  130. result.set(match.index, parseInt(match[0], 10));
  131. }
  132. return result;
  133. }
  134. exports.parseOffsets = parseOffsets;
  135. //# sourceMappingURL=data:application/json;charset=utf8;base64,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