12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- "use strict";
- var isValue = require("../../object/is-value")
- , esniff = require("esniff")
- , validFunction = require("../valid-function");
- var classRe = /^\s*class[\s{/}]/;
- module.exports = function () {
- var str = String(validFunction(this));
- if (classRe.test(str)) throw new Error("Class methods are not supported");
- var argsStartIndex
- , argsEndIndex
- , bodyStartIndex
- , bodyEndReverseIndex = -1
- , shouldTrimArgs = false;
- esniff(str, function (emitter, accessor) {
- emitter.once("trigger:(", function () { argsStartIndex = accessor.index + 1; });
- emitter.once("trigger:=", function () {
- if (isValue(argsStartIndex)) return;
- argsStartIndex = 0;
- argsEndIndex = accessor.index;
- shouldTrimArgs = true;
- if (!accessor.skipCodePart("=>")) {
- throw new Error("Unexpected function string: " + str);
- }
- accessor.skipWhitespace();
- if (!accessor.skipCodePart("{")) bodyEndReverseIndex = Infinity;
- bodyStartIndex = accessor.index;
- });
- emitter.on("trigger:)", function () {
- if (accessor.scopeDepth) return;
- argsEndIndex = accessor.index;
- accessor.skipCodePart(")");
- accessor.skipWhitespace();
- if (accessor.skipCodePart("=>")) {
- accessor.skipWhitespace();
- if (!accessor.skipCodePart("{")) bodyEndReverseIndex = Infinity;
- } else if (!accessor.skipCodePart("{")) {
- throw new Error("Unexpected function string: " + str);
- }
- bodyStartIndex = accessor.index;
- accessor.stop();
- });
- });
- var argsString = str.slice(argsStartIndex, argsEndIndex);
- if (shouldTrimArgs) argsString = argsString.trim();
- return { args: argsString, body: str.slice(bodyStartIndex, bodyEndReverseIndex) };
- };
|