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