'use strict';
function nestTag(comment, tagName, target) {
if (!comment[target]) {
return comment;
}
var result = [],
index = {};
comment[target].forEach(function (tag) {
index[tag.name] = tag;
var parts = tag.name.split(/(\[\])?\./)
.filter(function (part) {
return part && part !== '[]';
});
if (parts.length > 1) {
var parent = index[parts.slice(0, -1).join('.')];
if (parent === undefined) {
comment.errors.push({
message: '@' + tagName + ' ' + tag.name + '\'s parent ' + parts[0] + ' not found',
commentLineNumber: tag.lineNumber
});
result.push(tag);
return;
}
parent.properties = parent.properties || [];
parent.properties.push(tag);
} else {
result.push(tag);
}
});
comment[target] = result;
return comment;
}
/**
* Nests
* [parameters with properties](http://usejsdoc.org/tags-param.html#parameters-with-properties).
*
* A parameter `employee.name` will be attached to the parent parameter `employee` in
* a `properties` array.
*
* This assumes that incoming comments have been flattened.
*
* @param {Object} comment input comment
* @return {Object} nested comment
*/
function nest(comment) {
return nestTag(nestTag(comment, 'param', 'params'),
'property', 'properties');
}
module.exports = nest;
|