utils.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import {Token, TokenResult} from './parser';
  2. /**
  3. * Utility function to visit every Token node within an AST tree and apply
  4. * a transform to those nodes.
  5. */
  6. export function treeTransformer(
  7. tree: TokenResult<Token>[],
  8. transform: (token: TokenResult<Token>) => any
  9. ) {
  10. const nodeVisitor = (token: TokenResult<Token>) => {
  11. switch (token.type) {
  12. case Token.Filter:
  13. return transform({
  14. ...token,
  15. key: nodeVisitor(token.key),
  16. value: nodeVisitor(token.value),
  17. });
  18. case Token.KeyExplicitTag:
  19. return transform({
  20. ...token,
  21. key: nodeVisitor(token.key),
  22. });
  23. case Token.KeyAggregate:
  24. return transform({
  25. ...token,
  26. name: nodeVisitor(token.name),
  27. args: token.args ? nodeVisitor(token.args) : token.args,
  28. argsSpaceBefore: nodeVisitor(token.argsSpaceBefore),
  29. argsSpaceAfter: nodeVisitor(token.argsSpaceAfter),
  30. });
  31. case Token.LogicGroup:
  32. return transform({
  33. ...token,
  34. inner: token.inner.map(nodeVisitor),
  35. });
  36. case Token.KeyAggregateArgs:
  37. return transform({
  38. ...token,
  39. args: token.args.map(v => ({...v, value: nodeVisitor(v.value)})),
  40. });
  41. case Token.ValueNumberList:
  42. case Token.ValueTextList:
  43. return transform({
  44. ...token,
  45. // TODO(ts): Not sure why `v` cannot be inferred here
  46. items: token.items.map((v: any) => ({...v, value: nodeVisitor(v.value)})),
  47. });
  48. default:
  49. return transform(token);
  50. }
  51. };
  52. return tree.map(nodeVisitor);
  53. }