context.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.types = exports.TokContext = void 0;
  6. var _types = require("./types");
  7. class TokContext {
  8. constructor(token, isExpr, preserveSpace, override) {
  9. this.token = void 0;
  10. this.isExpr = void 0;
  11. this.preserveSpace = void 0;
  12. this.override = void 0;
  13. this.token = token;
  14. this.isExpr = !!isExpr;
  15. this.preserveSpace = !!preserveSpace;
  16. this.override = override;
  17. }
  18. }
  19. exports.TokContext = TokContext;
  20. const types = {
  21. braceStatement: new TokContext("{", false),
  22. braceExpression: new TokContext("{", true),
  23. recordExpression: new TokContext("#{", true),
  24. templateQuasi: new TokContext("${", false),
  25. parenStatement: new TokContext("(", false),
  26. parenExpression: new TokContext("(", true),
  27. template: new TokContext("`", true, true, p => p.readTmplToken()),
  28. functionExpression: new TokContext("function", true),
  29. functionStatement: new TokContext("function", false)
  30. };
  31. exports.types = types;
  32. _types.types.parenR.updateContext = _types.types.braceR.updateContext = function () {
  33. if (this.state.context.length === 1) {
  34. this.state.exprAllowed = true;
  35. return;
  36. }
  37. let out = this.state.context.pop();
  38. if (out === types.braceStatement && this.curContext().token === "function") {
  39. out = this.state.context.pop();
  40. }
  41. this.state.exprAllowed = !out.isExpr;
  42. };
  43. _types.types.name.updateContext = function (prevType) {
  44. let allowed = false;
  45. if (prevType !== _types.types.dot) {
  46. if (this.state.value === "of" && !this.state.exprAllowed && prevType !== _types.types._function && prevType !== _types.types._class) {
  47. allowed = true;
  48. }
  49. }
  50. this.state.exprAllowed = allowed;
  51. if (this.state.isIterator) {
  52. this.state.isIterator = false;
  53. }
  54. };
  55. _types.types.braceL.updateContext = function (prevType) {
  56. this.state.context.push(this.braceIsBlock(prevType) ? types.braceStatement : types.braceExpression);
  57. this.state.exprAllowed = true;
  58. };
  59. _types.types.dollarBraceL.updateContext = function () {
  60. this.state.context.push(types.templateQuasi);
  61. this.state.exprAllowed = true;
  62. };
  63. _types.types.parenL.updateContext = function (prevType) {
  64. const statementParens = prevType === _types.types._if || prevType === _types.types._for || prevType === _types.types._with || prevType === _types.types._while;
  65. this.state.context.push(statementParens ? types.parenStatement : types.parenExpression);
  66. this.state.exprAllowed = true;
  67. };
  68. _types.types.incDec.updateContext = function () {};
  69. _types.types._function.updateContext = _types.types._class.updateContext = function (prevType) {
  70. if (prevType.beforeExpr && prevType !== _types.types.semi && prevType !== _types.types._else && !(prevType === _types.types._return && this.hasPrecedingLineBreak()) && !((prevType === _types.types.colon || prevType === _types.types.braceL) && this.curContext() === types.b_stat)) {
  71. this.state.context.push(types.functionExpression);
  72. } else {
  73. this.state.context.push(types.functionStatement);
  74. }
  75. this.state.exprAllowed = false;
  76. };
  77. _types.types.backQuote.updateContext = function () {
  78. if (this.curContext() === types.template) {
  79. this.state.context.pop();
  80. } else {
  81. this.state.context.push(types.template);
  82. }
  83. this.state.exprAllowed = false;
  84. };
  85. _types.types.braceHashL.updateContext = function () {
  86. this.state.context.push(types.recordExpression);
  87. this.state.exprAllowed = true;
  88. };