08b35515d3da0dad9196971a569d2ebdf996b5d2fba74ee083294fd27b5b108a328f65050281605eb6cf1219a24c52e815521fdd0fa1411923b4906a1d954f 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. "use strict";
  2. module.exports = function(tokens, tt) {
  3. let curlyBrace = null;
  4. let templateTokens = [];
  5. const result = [];
  6. function addTemplateType() {
  7. const start = templateTokens[0];
  8. const end = templateTokens[templateTokens.length - 1];
  9. const value = templateTokens.reduce((result, token) => {
  10. if (token.value) {
  11. result += token.value;
  12. } else if (token.type !== tt.template) {
  13. result += token.type.label;
  14. }
  15. return result;
  16. }, "");
  17. result.push({
  18. type: "Template",
  19. value: value,
  20. start: start.start,
  21. end: end.end,
  22. loc: {
  23. start: start.loc.start,
  24. end: end.loc.end,
  25. },
  26. });
  27. templateTokens = [];
  28. }
  29. tokens.forEach(token => {
  30. switch (token.type) {
  31. case tt.backQuote:
  32. if (curlyBrace) {
  33. result.push(curlyBrace);
  34. curlyBrace = null;
  35. }
  36. templateTokens.push(token);
  37. if (templateTokens.length > 1) {
  38. addTemplateType();
  39. }
  40. break;
  41. case tt.dollarBraceL:
  42. templateTokens.push(token);
  43. addTemplateType();
  44. break;
  45. case tt.braceR:
  46. if (curlyBrace) {
  47. result.push(curlyBrace);
  48. }
  49. curlyBrace = token;
  50. break;
  51. case tt.template:
  52. if (curlyBrace) {
  53. templateTokens.push(curlyBrace);
  54. curlyBrace = null;
  55. }
  56. templateTokens.push(token);
  57. break;
  58. case tt.eof:
  59. if (curlyBrace) {
  60. result.push(curlyBrace);
  61. }
  62. break;
  63. default:
  64. if (curlyBrace) {
  65. result.push(curlyBrace);
  66. curlyBrace = null;
  67. }
  68. result.push(token);
  69. }
  70. });
  71. return result;
  72. };