Skip to content

Commit

Permalink
autodetect default and repeatable parameters when a function is assig…
Browse files Browse the repository at this point in the history
…ned to a variable (#1054)
  • Loading branch information
hegemonic committed Jul 7, 2017
1 parent 0e4f1a9 commit 6275e69
Show file tree
Hide file tree
Showing 6 changed files with 41 additions and 4 deletions.
5 changes: 4 additions & 1 deletion lib/jsdoc/src/parser.js
Expand Up @@ -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
Expand Down
13 changes: 10 additions & 3 deletions lib/jsdoc/src/visitor.js
Expand Up @@ -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--) {
Expand Down Expand Up @@ -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++) {
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions test/fixtures/defaultparams.js
Expand Up @@ -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) {};
7 changes: 7 additions & 0 deletions test/fixtures/restparams.js
Expand Up @@ -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) {};
5 changes: 5 additions & 0 deletions test/specs/documentation/defaultparams.js
Expand Up @@ -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];
Expand Down Expand Up @@ -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');

Expand Down
8 changes: 8 additions & 0 deletions test/specs/documentation/restparams.js
Expand Up @@ -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() {
Expand All @@ -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');

Expand Down

0 comments on commit 6275e69

Please sign in to comment.