System.register(['https://lively-kernel.org/lively4/lively4-tom/src/external/babel/babel-helpers/classCallCheck.js'], function (_export, _context) {
    "use strict";

    var _classCallCheck, Trace;

    _export('default', function (_ref) {
        var t = _ref.types;

        function error(path, message) {
            throw path.buildCodeFrameError(message);
        }

        var returnVisitor = {
            ReturnStatement: function ReturnStatement(path) {
                if (path.node.alreadyVisited) {
                    return;
                }
                path.node.alreadyVisited = true;
                var log = t.stringLiteral('Leave by return');
                var returnValue = path.node.argument ? path.node.argument : t.identifier('undefined');
                path.node.argument = t.sequenceExpression([log, returnValue]);
            }
        };

        return {
            name: 'tracer',
            visitor: {
                CallExpression: function CallExpression(path) {
                    if (path.node.alreadyVisited) {
                        return;
                    }
                    path.node.alreadyVisited = true;
                    var log = t.stringLiteral('About to enter function');
                    var sequence = t.sequenceExpression([log, path.node]);
                    path.replaceWith(t.expressionStatement(sequence));
                },
                Function: function Function(path) {
                    var id = path.node.id;
                    var name = id ? id.name : 'anonymous function';
                    var body = path.get('body');
                    body.unshiftContainer('body', t.expressionStatement(t.stringLiteral('Enter function')));
                    body.pushContainer('body', t.expressionStatement(t.stringLiteral('Leave function')));
                    path.traverse(returnVisitor);
                }
            }
        };
    });

    return {
        setters: [function (_httpsLivelyKernelOrgLively4Lively4TomSrcExternalBabelBabelHelpersClassCallCheckJs) {
            _classCallCheck = _httpsLivelyKernelOrgLively4Lively4TomSrcExternalBabelBabelHelpersClassCallCheckJs.default;
        }],
        execute: function () {
            Trace = function Trace() {
                _classCallCheck(this, Trace);
            };
        }
    };
});