autodetect default and repeatable parameters when a function is assigned to a variable (#1054)

This commit is contained in:
Jeff Williams 2017-07-07 13:24:19 -07:00
parent 0e4f1a9575
commit 6275e69e85
6 changed files with 41 additions and 4 deletions

View File

@ -362,7 +362,10 @@ Parser.prototype.astnodeToMemberof = function(node) {
else if (type === Syntax.MethodDefinition && node.kind === 'constructor') {
doclet = this._getDocletById(node.enclosingScope.nodeId);
result.memberof = doclet.memberof + jsdoc.name.SCOPE.PUNC.INNER;
// global classes aren't a member of anything
if (doclet.memberof) {
result.memberof = doclet.memberof + jsdoc.name.SCOPE.PUNC.INNER;
}
}
else {
// check local references for aliases

View File

@ -184,7 +184,10 @@ function makeRestParamFinisher() {
}
documentedParams = doclet.params = doclet.params || [];
restNode = findRestParam(e.code.node.params || e.code.node.value.params);
restNode = findRestParam(e.code.node.params ||
(e.code.node.value && e.code.node.value.params) ||
(e.code.node.init && e.code.node.init.params) ||
[]);
if (restNode) {
for (var i = documentedParams.length - 1; i >= 0; i--) {
@ -247,7 +250,7 @@ function makeDefaultParamFinisher() {
}
documentedParams = doclet.params = doclet.params || [];
params = e.code.node.params || e.code.node.value.params;
params = e.code.node.params || (e.code.node.value && e.code.node.value.params) || [];
defaultValues = findDefaultParams(params);
for (var i = 0, j = 0, l = params.length; i < l; i++) {
@ -314,7 +317,7 @@ function makeConstructorFinisher(parser) {
if (!parentDoclet.description && doclet.description) {
parentDoclet.description = doclet.description;
}
if (!parentDoclet.params && doclet.params) {
if ( (!parentDoclet.params || !parentDoclet.params.length) && doclet.params) {
parentDoclet.params = doclet.params.slice(0);
}
@ -794,6 +797,10 @@ Visitor.prototype.makeSymbolFoundEvent = function(node, parser, filename) {
// like: var i = 0;
case Syntax.VariableDeclarator:
extras.finishers = [
// handle cases where at least one parameter has a default value
makeDefaultParamFinisher(),
// handle rest parameters
makeRestParamFinisher(),
// handle async functions
makeAsyncFunctionFinisher(),
// handle generator functions

View File

@ -62,3 +62,10 @@ function setDogName(dogName = '') {}
* @param {PizzaToppings} toppings - The user's favorite toppings.
*/
function setPizzaToppings(toppings = PIZZA_TOPPING_DEFAULTS) {}
/**
* Set whether the user is a ninja.
*
* @param {boolean} isNinja - Set to `true` if the user is a ninja; otherwise, `false`.
*/
var setIsNinja = function(isNinja = true) {};

View File

@ -14,3 +14,10 @@ function setAdmins(...users) {}
* @param {User} users - The users who will receive rights to access the widget.
*/
function setWidgetAccess(widget, ...users) {}
/**
* Set the list of users who are managers.
*
* @param {User} users - The users who are managers.
*/
var setManagers = function(...users) {};

View File

@ -7,6 +7,7 @@ describe('default parameters', function() {
var setBirthYear = docSet.getByLongname('setBirthYear')[0];
var setDogName = docSet.getByLongname('setDogName')[0];
var setFirstName = docSet.getByLongname('setFirstName')[0];
var setIsNinja = docSet.getByLongname('setIsNinja')[0];
var setLastName = docSet.getByLongname('setLastName')[0];
var setName = docSet.getByLongname('setName')[0];
var setPizzaToppings = docSet.getByLongname('setPizzaToppings')[0];
@ -49,6 +50,10 @@ describe('default parameters', function() {
expect(setPizzaToppings.params[0].defaultvalue).toBeUndefined();
});
it('should work when the function is assigned to a variable', function() {
expect(setIsNinja.params[0].defaultvalue).toBe(true);
});
describe('ES2015 methods', function() {
var docSet2 = jasmine.getDocSetFromFile('test/fixtures/defaultparams2.js');

View File

@ -3,6 +3,7 @@
describe('rest parameters', function() {
var docSet = jasmine.getDocSetFromFile('test/fixtures/restparams.js');
var setAdmins = docSet.getByLongname('setAdmins')[0];
var setManagers = docSet.getByLongname('setManagers')[0];
var setWidgetAccess = docSet.getByLongname('setWidgetAccess')[0];
it('should automatically mark standalone rest parameters as repeatable', function() {
@ -19,6 +20,13 @@ describe('rest parameters', function() {
expect(restParam.variable).toBe(true);
});
it('should automatically mark rest parameters as repeatable when the function is assigned to a variable', function() {
var restParam = setManagers.params[0];
expect(restParam.name).toBe('users');
expect(restParam.variable).toBe(true);
});
describe('ES2015 methods', function() {
var docSet2 = jasmine.getDocSetFromFile('test/fixtures/restparams2.js');