10
0

JavascriptParserHelpers.js 3.7 KB

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