getFunctionExpression.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. module.exports = expr => {
  7. // <FunctionExpression>
  8. if (
  9. expr.type === "FunctionExpression" ||
  10. expr.type === "ArrowFunctionExpression"
  11. ) {
  12. return {
  13. fn: expr,
  14. expressions: [],
  15. needThis: false
  16. };
  17. }
  18. // <FunctionExpression>.bind(<Expression>)
  19. if (
  20. expr.type === "CallExpression" &&
  21. expr.callee.type === "MemberExpression" &&
  22. expr.callee.object.type === "FunctionExpression" &&
  23. expr.callee.property.type === "Identifier" &&
  24. expr.callee.property.name === "bind" &&
  25. expr.arguments.length === 1
  26. ) {
  27. return {
  28. fn: expr.callee.object,
  29. expressions: [expr.arguments[0]],
  30. needThis: undefined
  31. };
  32. }
  33. // (function(_this) {return <FunctionExpression>})(this) (Coffeescript)
  34. if (
  35. expr.type === "CallExpression" &&
  36. expr.callee.type === "FunctionExpression" &&
  37. expr.callee.body.type === "BlockStatement" &&
  38. expr.arguments.length === 1 &&
  39. expr.arguments[0].type === "ThisExpression" &&
  40. expr.callee.body.body &&
  41. expr.callee.body.body.length === 1 &&
  42. expr.callee.body.body[0].type === "ReturnStatement" &&
  43. expr.callee.body.body[0].argument &&
  44. expr.callee.body.body[0].argument.type === "FunctionExpression"
  45. ) {
  46. return {
  47. fn: expr.callee.body.body[0].argument,
  48. expressions: [],
  49. needThis: true
  50. };
  51. }
  52. };