JavascriptParserHelpers.js 3.1 KB

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