Skip to content

Commit 90aacf5

Browse files
committed
Merge branch 'master' into esrijs-sdk-3.6.0
* master: (95 commits) update dependencies and supported Node.js versions 3.5.5 changelog Prefer copyFileSync from here over native (jsdoc#1440) upgrade Babylon fix test breakage 3.5.4 changelog prevent crash when an anonymous class is passed as a parameter (jsdoc#1416) hide the signature in the heading for classes with hidden constructors (jsdoc#1397) chore(package): update nyc to version 11.1.0 (jsdoc#1417) add `templates.useShortNamesInLinks` config option (jsdoc#738) allow users to specify a highlighter for Markdown code blocks (jsdoc#1412) document `longnamesToTree`, plus other doc improvements (jsdoc#43) move namespaces and interfaces up in the nav (jsdoc#1410) don't pretty-print code blocks that begin with "```plain" (jsdoc#1361) improve comment make the `exports` tag work correctly when combined with the `enum` tag (jsdoc#970) fix Node.js 4.x update tested Node.js versions use the markdown-it Markdown parser by default (jsdoc#1243) enable more Babylon options (jsdoc#1411) ... # Conflicts: # .travis.yml # README.md # lib/jsdoc/src/astbuilder.js # lib/jsdoc/src/visitor.js # lib/jsdoc/util/markdown.js # lib/jsdoc/util/templateHelper.js # package.json
2 parents 0ec3bb6 + 7b304d8 commit 90aacf5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

91 files changed

+8688
-738
lines changed

.travis.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ node_js:
44
- "4"
55
- "6"
66
- "8"
7+
- "10"
8+
- "12"
79

810
install: npm install -g gulp; npm install

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ Want to contribute to JSDoc? Please read `CONTRIBUTING.md`.
1010
Installation and Usage
1111
----------------------
1212

13-
JSDoc supports Node.js 4.2.0 and later. You can install JSDoc globally or in your project's
14-
`node_modules` folder.
13+
JSDoc supports stable versions of Node.js 8.15.0 and later. You can install JSDoc globally or in
14+
your project's `node_modules` folder.
1515

1616
To install the latest version on npm globally (may require `sudo`; [learn how to fix
1717
this](https://docs.npmjs.com/getting-started/fixing-npm-permissions)):

cli.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,8 +374,6 @@ cli.parseFiles = function() {
374374
packageDocs.files = env.sourceFiles || [];
375375
docs.push(packageDocs);
376376

377-
logger.debug('Indexing doclets...');
378-
borrow.indexAll(docs);
379377
logger.debug('Adding inherited symbols, mixins, and interface implementations...');
380378
augment.augmentAll(docs);
381379
logger.debug('Adding borrowed doclets...');

gulpfile.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,31 +32,39 @@ var options = {
3232
nodePath: process.execPath
3333
};
3434

35-
gulp.task('bump', function() {
35+
function bump(cb) {
3636
gulp.src('./package.json')
3737
.pipe(jsonEditor({
3838
revision: String( Date.now() )
3939
}))
4040
.pipe(gulp.dest('./'));
41-
});
4241

43-
gulp.task('coverage', function(cb) {
42+
cb();
43+
}
44+
45+
function coverage(cb) {
4446
var cmd = util.format('./node_modules/.bin/nyc --reporter=html %s -T', options.nodeBin);
4547

4648
exec(cmd, execCb.bind(null, cb));
47-
});
49+
}
4850

49-
gulp.task('lint', function() {
50-
return gulp.src(options.lintPaths)
51+
function lint(cb) {
52+
gulp.src(options.lintPaths)
5153
.pipe(eslint())
5254
.pipe(eslint.formatEach())
5355
.pipe(eslint.failOnError());
54-
});
5556

56-
gulp.task('test', function(cb) {
57+
cb();
58+
}
59+
60+
function test(cb) {
5761
var cmd = util.format('%s "%s" -T', options.nodePath, options.nodeBin);
5862

5963
exec(cmd, execCb.bind(null, cb));
60-
});
64+
}
6165

62-
gulp.task('default', ['lint', 'test']);
66+
exports.bump = bump;
67+
exports.coverage = coverage;
68+
exports.default = gulp.series(lint, test);
69+
exports.lint = lint;
70+
exports.test = test;

lib/jsdoc/augment.js

Lines changed: 102 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
*/
77

88
var doop = require('jsdoc/util/doop');
9+
var jsdoc = {
10+
doclet: require('jsdoc/doclet')
11+
};
912
var name = require('jsdoc/name');
1013

1114
var hasOwnProp = Object.prototype.hasOwnProperty;
@@ -75,20 +78,24 @@ function sort(dependencies) {
7578
}
7679

7780
function getMembers(longname, docs, scopes) {
78-
var candidate;
81+
var memberof = docs.index.memberof[longname] || [];
7982
var members = [];
8083

81-
for (var i = 0, l = docs.length; i < l; i++) {
82-
candidate = docs[i];
83-
84-
if (candidate.memberof === longname && scopes.indexOf(candidate.scope) !== -1) {
84+
memberof.forEach(function(candidate) {
85+
if (scopes.indexOf(candidate.scope) !== -1) {
8586
members.push(candidate);
8687
}
87-
}
88+
});
8889

8990
return members;
9091
}
9192

93+
function getDocumentedLongname(longname, docs) {
94+
var doclets = docs.index.documented[longname] || [];
95+
96+
return doclets[doclets.length - 1];
97+
}
98+
9299
function addDocletProperty(doclets, propName, value) {
93100
for (var i = 0, l = doclets.length; i < l; i++) {
94101
doclets[i][propName] = value;
@@ -162,6 +169,25 @@ function updateDocumentedDoclets(doclet, documented) {
162169
documented[doclet.longname].push(doclet);
163170
}
164171

172+
/**
173+
* Update the index of doclets with a `memberof` value.
174+
*
175+
* @private
176+
* @param {module:jsdoc/doclet.Doclet} doclet - The doclet to be added to the index.
177+
* @param {Object.<string, Array.<module:jsdoc/doclet.Doclet>>} memberof - The index of doclets
178+
* with a `memberof` value.
179+
* @return {void}
180+
*/
181+
function updateMemberofDoclets(doclet, memberof) {
182+
if (doclet.memberof) {
183+
if ( !hasOwnProp.call(memberof, doclet.memberof) ) {
184+
memberof[doclet.memberof] = [];
185+
}
186+
187+
memberof[doclet.memberof].push(doclet);
188+
}
189+
}
190+
165191
function explicitlyInherits(doclets) {
166192
var doclet;
167193
var inherits = false;
@@ -177,13 +203,24 @@ function explicitlyInherits(doclets) {
177203
return inherits;
178204
}
179205

206+
function changeMemberof(longname, newMemberof) {
207+
var atoms = name.shorten(longname);
208+
209+
atoms.memberof = newMemberof;
210+
211+
return name.combine(atoms);
212+
}
213+
180214
// TODO: try to reduce overlap with similar methods
181-
function getInheritedAdditions(doclets, docs, documented) {
215+
function getInheritedAdditions(doclets, docs, index) {
182216
var additionIndexes;
183217
var additions = [];
218+
var childDoclet;
219+
var childLongname;
184220
var doc;
221+
var parentDoclet;
222+
var parentMembers;
185223
var parents;
186-
var members;
187224
var member;
188225
var parts;
189226

@@ -199,54 +236,64 @@ function getInheritedAdditions(doclets, docs, documented) {
199236
additionIndexes = {};
200237

201238
for (var j = 0, jj = parents.length; j < jj; j++) {
202-
members = getMembers(parents[j], docs, ['instance']);
239+
parentMembers = getMembers(parents[j], docs, ['instance']);
240+
241+
for (var k = 0, kk = parentMembers.length; k < kk; k++) {
242+
parentDoclet = parentMembers[k];
203243

204-
for (var k = 0, kk = members.length; k < kk; k++) {
205244
// We only care about symbols that are documented.
206-
if (members[k].undocumented) {
245+
if (parentDoclet.undocumented) {
207246
continue;
208247
}
209248

210-
member = doop(members[k]);
249+
childLongname = changeMemberof(parentDoclet.longname, doc.longname);
250+
childDoclet = getDocumentedLongname(childLongname, docs) || {};
251+
252+
// We don't want to fold in properties from the child doclet if it had an
253+
// `@inheritdoc` tag.
254+
if (hasOwnProp.call(childDoclet, 'inheritdoc')) {
255+
childDoclet = {};
256+
}
257+
258+
member = jsdoc.doclet.combine(childDoclet, parentDoclet);
211259

212260
if (!member.inherited) {
213261
member.inherits = member.longname;
214262
}
215263
member.inherited = true;
216264

217-
// TODO: this will fail on longnames like: MyClass#"quoted#Longname"
218-
// and nested instance members like: MyClass#MyOtherClass#myMethod;
219-
// switch to updateLongname()!
220265
member.memberof = doc.longname;
221-
parts = member.longname.split('#');
222-
parts[0] = doc.longname;
223-
member.longname = parts.join('#');
266+
parts = name.shorten(member.longname);
267+
parts.memberof = doc.longname;
268+
member.longname = name.combine(parts);
224269

225270
// Indicate what the descendant is overriding. (We only care about the closest
226271
// ancestor. For classes A > B > C, if B#a overrides A#a, and C#a inherits B#a,
227272
// we don't want the doclet for C#a to say that it overrides A#a.)
228273
if ( hasOwnProp.call(docs.index.longname, member.longname) ) {
229-
member.overrides = members[k].longname;
274+
member.overrides = parentDoclet.longname;
230275
}
231276
else {
232277
delete member.overrides;
233278
}
234279

235280
// Add the ancestor's docs unless the descendant overrides the ancestor AND
236281
// documents the override.
237-
if ( !hasOwnProp.call(documented, member.longname) ) {
282+
if ( !hasOwnProp.call(index.documented, member.longname) ) {
238283
updateAddedDoclets(member, additions, additionIndexes);
239-
updateDocumentedDoclets(member, documented);
284+
updateDocumentedDoclets(member, index.documented);
285+
updateMemberofDoclets(member, index.memberof);
240286
}
241287
// If the descendant used an @inheritdoc or @override tag, add the ancestor's
242288
// docs, and ignore the existing doclets.
243-
else if ( explicitlyInherits(documented[member.longname]) ) {
289+
else if ( explicitlyInherits(index.documented[member.longname]) ) {
244290
// Ignore any existing doclets. (This is safe because we only get here if
245291
// `member.longname` is an own property of `documented`.)
246-
addDocletProperty(documented[member.longname], 'ignore', true);
292+
addDocletProperty(index.documented[member.longname], 'ignore', true);
247293

248294
updateAddedDoclets(member, additions, additionIndexes);
249-
updateDocumentedDoclets(member, documented);
295+
updateDocumentedDoclets(member, index.documented);
296+
updateMemberofDoclets(member, index.memberof);
250297

251298
// Remove property that's no longer accurate.
252299
if (member.virtual) {
@@ -263,8 +310,8 @@ function getInheritedAdditions(doclets, docs, documented) {
263310
// If the descendant overrides the ancestor and documents the override,
264311
// update the doclets to indicate what the descendant is overriding.
265312
else {
266-
addDocletProperty(documented[member.longname], 'overrides',
267-
members[k].longname);
313+
addDocletProperty(index.documented[member.longname], 'overrides',
314+
parentDoclet.longname);
268315
}
269316
}
270317
}
@@ -304,9 +351,10 @@ function updateMixes(mixedDoclet, mixedLongname) {
304351
}
305352

306353
// TODO: try to reduce overlap with similar methods
307-
function getMixedInAdditions(mixinDoclets, allDoclets, commentedDoclets) {
354+
function getMixedInAdditions(mixinDoclets, allDoclets, index) {
308355
var additionIndexes;
309356
var additions = [];
357+
var commentedDoclets = index.documented;
310358
var doclet;
311359
var mixedDoclet;
312360
var mixedDoclets;
@@ -346,6 +394,7 @@ function getMixedInAdditions(mixinDoclets, allDoclets, commentedDoclets) {
346394

347395
updateAddedDoclets(mixedDoclet, additions, additionIndexes);
348396
updateDocumentedDoclets(mixedDoclet, commentedDoclets);
397+
updateMemberofDoclets(mixedDoclet, index.memberof);
349398
}
350399
}
351400
}
@@ -371,14 +420,18 @@ function updateImplements(implDoclets, implementedLongname) {
371420
}
372421

373422
// TODO: try to reduce overlap with similar methods
374-
function getImplementedAdditions(implDoclets, allDoclets, commentedDoclets) {
423+
function getImplementedAdditions(implDoclets, allDoclets, index) {
375424
var additionIndexes;
376425
var additions = [];
426+
var childDoclet;
427+
var childLongname;
428+
var commentedDoclets = index.documented;
377429
var doclet;
378430
var implementations;
379431
var implExists;
380432
var implementationDoclet;
381433
var interfaceDoclets;
434+
var parentDoclet;
382435

383436
// interfaceDoclets will be undefined if the implemented symbol isn't documented
384437
implDoclets = implDoclets || [];
@@ -395,15 +448,26 @@ function getImplementedAdditions(implDoclets, allDoclets, commentedDoclets) {
395448
interfaceDoclets = getMembers(implementations[j], allDoclets, ['instance']);
396449

397450
for (var k = 0, kk = interfaceDoclets.length; k < kk; k++) {
451+
parentDoclet = interfaceDoclets[k];
452+
398453
// We only care about symbols that are documented.
399-
if (interfaceDoclets[k].undocumented) {
454+
if (parentDoclet.undocumented) {
400455
continue;
401456
}
402457

403-
implementationDoclet = doop(interfaceDoclets[k]);
458+
childLongname = changeMemberof(parentDoclet.longname, doclet.longname);
459+
childDoclet = getDocumentedLongname(childLongname, allDoclets) || {};
460+
461+
// We don't want to fold in properties from the child doclet if it had an
462+
// `@inheritdoc` tag.
463+
if (hasOwnProp.call(childDoclet, 'inheritdoc')) {
464+
childDoclet = {};
465+
}
466+
467+
implementationDoclet = jsdoc.doclet.combine(childDoclet, parentDoclet);
404468

405469
reparentDoclet(doclet, implementationDoclet);
406-
updateImplements(implementationDoclet, interfaceDoclets[k].longname);
470+
updateImplements(implementationDoclet, parentDoclet.longname);
407471

408472
// If there's no implementation, move along.
409473
implExists = hasOwnProp.call(allDoclets.index.longname,
@@ -416,6 +480,7 @@ function getImplementedAdditions(implDoclets, allDoclets, commentedDoclets) {
416480
if ( !hasOwnProp.call(commentedDoclets, implementationDoclet.longname) ) {
417481
updateAddedDoclets(implementationDoclet, additions, additionIndexes);
418482
updateDocumentedDoclets(implementationDoclet, commentedDoclets);
483+
updateMemberofDoclets(implementationDoclet, index.memberof);
419484
}
420485
// If the implementation used an @inheritdoc or @override tag, add the
421486
// interface's docs, and ignore the existing doclets.
@@ -428,6 +493,7 @@ function getImplementedAdditions(implDoclets, allDoclets, commentedDoclets) {
428493

429494
updateAddedDoclets(implementationDoclet, additions, additionIndexes);
430495
updateDocumentedDoclets(implementationDoclet, commentedDoclets);
496+
updateMemberofDoclets(implementationDoclet, index.memberof);
431497

432498
// Remove property that's no longer accurate.
433499
if (implementationDoclet.virtual) {
@@ -445,7 +511,7 @@ function getImplementedAdditions(implDoclets, allDoclets, commentedDoclets) {
445511
// indicate what the implementation is implementing.
446512
else {
447513
updateImplements(commentedDoclets[implementationDoclet.longname],
448-
interfaceDoclets[k].longname);
514+
parentDoclet.longname);
449515
}
450516
}
451517
}
@@ -460,7 +526,7 @@ function augment(doclets, propertyName, docletFinder) {
460526
var dependencies = sort( mapDependencies(index, propertyName) );
461527

462528
dependencies.forEach(function(depName) {
463-
var additions = docletFinder(index[depName], doclets, doclets.index.documented);
529+
var additions = docletFinder(index[depName], doclets, doclets.index);
464530

465531
additions.forEach(function(addition) {
466532
var longname = addition.longname;
@@ -481,7 +547,7 @@ function augment(doclets, propertyName, docletFinder) {
481547
* calling this method creates a new doclet for `ClassB#myMethod`.
482548
*
483549
* @param {!Array.<module:jsdoc/doclet.Doclet>} doclets - The doclets generated by JSDoc.
484-
* @param {!Object} doclets.index - The doclet index added by {@link module:jsdoc/borrow.indexAll}.
550+
* @param {!Object} doclets.index - The doclet index.
485551
* @return {void}
486552
*/
487553
exports.addInherited = function(doclets) {
@@ -500,7 +566,7 @@ exports.addInherited = function(doclets) {
500566
* creates a new doclet for the instance method `ClassA#myMethod`.
501567
*
502568
* @param {!Array.<module:jsdoc/doclet.Doclet>} doclets - The doclets generated by JSDoc.
503-
* @param {!Object} doclets.index - The doclet index added by {@link module:jsdoc/borrow.indexAll}.
569+
* @param {!Object} doclets.index - The doclet index.
504570
* @return {void}
505571
*/
506572
exports.addMixedIn = function(doclets) {
@@ -521,7 +587,7 @@ exports.addMixedIn = function(doclets) {
521587
* generate a new doclet that reflects the interface's documentation for `InterfaceA#myMethod`.
522588
*
523589
* @param {!Array.<module:jsdoc/doclet.Doclet>} docs - The doclets generated by JSDoc.
524-
* @param {!Object} doclets.index - The doclet index added by {@link module:jsdoc/borrow.indexAll}.
590+
* @param {!Object} doclets.index - The doclet index.
525591
* @return {void}
526592
*/
527593
exports.addImplemented = function(doclets) {

0 commit comments

Comments
 (0)