/**
 * @module plugins/sourcetag
 */
'use strict';

var logger = require('jsdoc/util/logger');

exports.handlers = {
    /**
     * Support @source tag. Expected value like:
     *
     *     { "filename": "myfile.js", "lineno": 123 }
     *
     * Modifies the corresponding meta values on the given doclet.
     *
     * WARNING: If you are using a JSDoc template that generates pretty-printed source files,
     * such as JSDoc's default template, this plugin can cause JSDoc to crash. To fix this issue,
     * update your template settings to disable pretty-printed source files.
     *
     * @source { "filename": "sourcetag.js", "lineno": 9 }
     */
    newDoclet: function(e) {
        var tags = e.doclet.tags;
        var tag;
        var value;

        // any user-defined tags in this doclet?
        if (typeof tags !== 'undefined') {
            // only interested in the @source tags
            tags = tags.filter(function($) {
                return $.title === 'source';
            });

            if (tags.length) {
                // take the first one
                tag = tags[0];

                try {
                    value = JSON.parse(tag.value);
                }
                catch (ex) {
                    logger.error('@source tag expects a valid JSON value, like { "filename": "myfile.js", "lineno": 123 }.');

                    return;
                }

                e.doclet.meta = e.doclet.meta || {};
                e.doclet.meta.filename = value.filename || '';
                e.doclet.meta.lineno = value.lineno || '';
            }
        }
    }
};
