JavascriptParserHelpers.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
  7. const ConstDependency = require("../dependencies/ConstDependency");
  8. const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
  9. /** @typedef {import("estree").Expression} Expression */
  10. /** @typedef {import("estree").SourceLocation} SourceLocation */
  11. /** @typedef {import("./JavascriptParser")} JavascriptParser */
  12. /** @typedef {import("./JavascriptParser").Range} Range */
  13. /** @typedef {import("./BasicEvaluatedExpression").GetMembers} GetMembers */
  14. module.exports.approve = () => true;
  15. /**
  16. * Returns plugin function.
  17. * @param {boolean} value the boolean value
  18. * @returns {(expression: Expression) => BasicEvaluatedExpression} plugin function
  19. */
  20. module.exports.evaluateToBoolean = (value) =>
  21. function booleanExpression(expr) {
  22. return new BasicEvaluatedExpression()
  23. .setBoolean(value)
  24. .setRange(/** @type {Range} */ (expr.range));
  25. };
  26. /**
  27. * Returns callback.
  28. * @param {string} identifier identifier
  29. * @param {string} rootInfo rootInfo
  30. * @param {GetMembers} getMembers getMembers
  31. * @param {boolean | null=} truthy is truthy, null if nullish
  32. * @returns {(expression: Expression) => BasicEvaluatedExpression} callback
  33. */
  34. module.exports.evaluateToIdentifier = (
  35. identifier,
  36. rootInfo,
  37. getMembers,
  38. truthy
  39. ) =>
  40. function identifierExpression(expr) {
  41. const evaluatedExpression = new BasicEvaluatedExpression()
  42. .setIdentifier(identifier, rootInfo, getMembers)
  43. .setSideEffects(false)
  44. .setRange(/** @type {Range} */ (expr.range));
  45. switch (truthy) {
  46. case true:
  47. evaluatedExpression.setTruthy();
  48. break;
  49. case null:
  50. evaluatedExpression.setNullish(true);
  51. break;
  52. case false:
  53. evaluatedExpression.setFalsy();
  54. break;
  55. }
  56. return evaluatedExpression;
  57. };
  58. /**
  59. * Returns plugin function.
  60. * @param {number} value the number value
  61. * @returns {(expression: Expression) => BasicEvaluatedExpression} plugin function
  62. */
  63. module.exports.evaluateToNumber = (value) =>
  64. function stringExpression(expr) {
  65. return new BasicEvaluatedExpression()
  66. .setNumber(value)
  67. .setRange(/** @type {Range} */ (expr.range));
  68. };
  69. /**
  70. * Returns plugin function.
  71. * @param {string} value the string value
  72. * @returns {(expression: Expression) => BasicEvaluatedExpression} plugin function
  73. */
  74. module.exports.evaluateToString = (value) =>
  75. function stringExpression(expr) {
  76. return new BasicEvaluatedExpression()
  77. .setString(value)
  78. .setRange(/** @type {Range} */ (expr.range));
  79. };
  80. /**
  81. * Returns callback to handle unsupported expression.
  82. * @param {JavascriptParser} parser the parser
  83. * @param {string} message the message
  84. * @returns {(expression: Expression) => boolean | undefined} callback to handle unsupported expression
  85. */
  86. module.exports.expressionIsUnsupported = (parser, message) =>
  87. function unsupportedExpression(expr) {
  88. const dep = new ConstDependency(
  89. "(void 0)",
  90. /** @type {Range} */ (expr.range),
  91. null
  92. );
  93. dep.loc = /** @type {SourceLocation} */ (expr.loc);
  94. parser.state.module.addPresentationalDependency(dep);
  95. if (!parser.state.module) return;
  96. parser.state.module.addWarning(
  97. new UnsupportedFeatureWarning(
  98. message,
  99. /** @type {SourceLocation} */ (expr.loc)
  100. )
  101. );
  102. return true;
  103. };
  104. module.exports.skipTraversal = () => true;
  105. /**
  106. * Returns plugin function.
  107. * @param {JavascriptParser} parser the parser
  108. * @param {string} value the const value
  109. * @param {(string[] | null)=} runtimeRequirements runtime requirements
  110. * @returns {(expression: Expression) => true} plugin function
  111. */
  112. module.exports.toConstantDependency = (parser, value, runtimeRequirements) =>
  113. function constDependency(expr) {
  114. const dep = new ConstDependency(
  115. value,
  116. /** @type {Range} */
  117. (expr.range),
  118. runtimeRequirements
  119. );
  120. dep.loc = /** @type {SourceLocation} */ (expr.loc);
  121. parser.state.module.addPresentationalDependency(dep);
  122. return true;
  123. };