convert-ast.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const ts = require("typescript");
  4. const util_1 = require("./util");
  5. function convertAst(sourceFile) {
  6. const wrapped = {
  7. node: sourceFile,
  8. parent: undefined,
  9. kind: ts.SyntaxKind.SourceFile,
  10. children: [],
  11. next: undefined,
  12. skip: undefined,
  13. };
  14. const flat = [];
  15. let current = wrapped;
  16. let previous = current;
  17. ts.forEachChild(sourceFile, function wrap(node) {
  18. flat.push(node);
  19. const parent = current;
  20. previous.next = current = {
  21. node,
  22. parent,
  23. kind: node.kind,
  24. children: [],
  25. next: undefined,
  26. skip: undefined,
  27. };
  28. if (previous !== parent)
  29. setSkip(previous, current);
  30. previous = current;
  31. parent.children.push(current);
  32. if (util_1.isNodeKind(node.kind))
  33. ts.forEachChild(node, wrap);
  34. current = parent;
  35. });
  36. return {
  37. wrapped,
  38. flat,
  39. };
  40. }
  41. exports.convertAst = convertAst;
  42. function setSkip(node, skip) {
  43. do {
  44. node.skip = skip;
  45. node = node.parent;
  46. } while (node !== skip.parent);
  47. }