"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) }; };