JavascriptParserHelpers.js 3.7 KB

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