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