convertTokens.cjs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. "use strict";
  2. const ESLINT_VERSION = require("../utils/eslint-version.cjs");
  3. function convertTemplateType(tokens, tl) {
  4. let curlyBrace = null;
  5. let templateTokens = [];
  6. const result = [];
  7. function addTemplateType() {
  8. const start = templateTokens[0];
  9. const end = templateTokens[templateTokens.length - 1];
  10. const value = templateTokens.reduce((result, token) => {
  11. if (token.value) {
  12. result += token.value;
  13. } else if (token.type.label !== tl.template) {
  14. result += token.type.label;
  15. }
  16. return result;
  17. }, "");
  18. result.push({
  19. type: "Template",
  20. value: value,
  21. start: start.start,
  22. end: end.end,
  23. loc: {
  24. start: start.loc.start,
  25. end: end.loc.end
  26. }
  27. });
  28. templateTokens = [];
  29. }
  30. tokens.forEach(token => {
  31. switch (token.type.label) {
  32. case tl.backQuote:
  33. if (curlyBrace) {
  34. result.push(curlyBrace);
  35. curlyBrace = null;
  36. }
  37. templateTokens.push(token);
  38. if (templateTokens.length > 1) {
  39. addTemplateType();
  40. }
  41. break;
  42. case tl.dollarBraceL:
  43. templateTokens.push(token);
  44. addTemplateType();
  45. break;
  46. case tl.braceR:
  47. if (curlyBrace) {
  48. result.push(curlyBrace);
  49. }
  50. curlyBrace = token;
  51. break;
  52. case tl.template:
  53. if (curlyBrace) {
  54. templateTokens.push(curlyBrace);
  55. curlyBrace = null;
  56. }
  57. templateTokens.push(token);
  58. break;
  59. default:
  60. if (curlyBrace) {
  61. result.push(curlyBrace);
  62. curlyBrace = null;
  63. }
  64. result.push(token);
  65. }
  66. });
  67. return result;
  68. }
  69. function convertToken(token, source, tl) {
  70. const {
  71. type
  72. } = token;
  73. const {
  74. label
  75. } = type;
  76. const newToken = token;
  77. newToken.range = [token.start, token.end];
  78. if (label === tl.name) {
  79. if (token.value === "static") {
  80. newToken.type = "Keyword";
  81. } else {
  82. newToken.type = "Identifier";
  83. }
  84. } else if (label === tl.semi || label === tl.comma || label === tl.parenL || label === tl.parenR || label === tl.braceL || label === tl.braceR || label === tl.slash || label === tl.dot || label === tl.bracketL || label === tl.bracketR || label === tl.ellipsis || label === tl.arrow || label === tl.pipeline || label === tl.star || label === tl.incDec || label === tl.colon || label === tl.question || label === tl.template || label === tl.backQuote || label === tl.dollarBraceL || label === tl.at || label === tl.logicalOR || label === tl.logicalAND || label === tl.nullishCoalescing || label === tl.bitwiseOR || label === tl.bitwiseXOR || label === tl.bitwiseAND || label === tl.equality || label === tl.relational || label === tl.bitShift || label === tl.plusMin || label === tl.modulo || label === tl.exponent || label === tl.bang || label === tl.tilde || label === tl.doubleColon || label === tl.hash || label === tl.questionDot || label === tl.braceHashL || label === tl.braceBarL || label === tl.braceBarR || label === tl.bracketHashL || label === tl.bracketBarL || label === tl.bracketBarR || label === tl.doubleCaret || label === tl.doubleAt || type.isAssign) {
  85. var _newToken$value;
  86. newToken.type = "Punctuator";
  87. (_newToken$value = newToken.value) != null ? _newToken$value : newToken.value = label;
  88. } else if (label === tl.jsxTagStart) {
  89. newToken.type = "Punctuator";
  90. newToken.value = "<";
  91. } else if (label === tl.jsxTagEnd) {
  92. newToken.type = "Punctuator";
  93. newToken.value = ">";
  94. } else if (label === tl.jsxName) {
  95. newToken.type = "JSXIdentifier";
  96. } else if (label === tl.jsxText) {
  97. newToken.type = "JSXText";
  98. } else if (type.keyword === "null") {
  99. newToken.type = "Null";
  100. } else if (type.keyword === "false" || type.keyword === "true") {
  101. newToken.type = "Boolean";
  102. } else if (type.keyword) {
  103. newToken.type = "Keyword";
  104. } else if (label === tl.num) {
  105. newToken.type = "Numeric";
  106. newToken.value = source.slice(token.start, token.end);
  107. } else if (label === tl.string) {
  108. newToken.type = "String";
  109. newToken.value = source.slice(token.start, token.end);
  110. } else if (label === tl.regexp) {
  111. newToken.type = "RegularExpression";
  112. const value = token.value;
  113. newToken.regex = {
  114. pattern: value.pattern,
  115. flags: value.flags
  116. };
  117. newToken.value = `/${value.pattern}/${value.flags}`;
  118. } else if (label === tl.bigint) {
  119. newToken.type = "Numeric";
  120. newToken.value = `${token.value}n`;
  121. } else if (label === tl.privateName) {
  122. newToken.type = "PrivateIdentifier";
  123. } else if (label === tl.templateNonTail || label === tl.templateTail || label === tl.Template) {
  124. newToken.type = "Template";
  125. }
  126. return newToken;
  127. }
  128. module.exports = function convertTokens(tokens, code, tokLabels) {
  129. const result = [];
  130. const templateTypeMergedTokens = convertTemplateType(tokens, tokLabels);
  131. for (let i = 0, {
  132. length
  133. } = templateTypeMergedTokens; i < length - 1; i++) {
  134. const token = templateTypeMergedTokens[i];
  135. const tokenType = token.type;
  136. if (tokenType === "CommentLine" || tokenType === "CommentBlock") {
  137. continue;
  138. }
  139. {
  140. if (ESLINT_VERSION >= 8 && i + 1 < length && tokenType.label === tokLabels.hash) {
  141. const nextToken = templateTypeMergedTokens[i + 1];
  142. if (nextToken.type.label === tokLabels.name && token.end === nextToken.start) {
  143. i++;
  144. nextToken.type = "PrivateIdentifier";
  145. nextToken.start -= 1;
  146. nextToken.loc.start.column -= 1;
  147. nextToken.range = [nextToken.start, nextToken.end];
  148. result.push(nextToken);
  149. continue;
  150. }
  151. }
  152. }
  153. result.push(convertToken(token, code, tokLabels));
  154. }
  155. return result;
  156. };
  157. //# sourceMappingURL=convertTokens.cjs.map