From e370dc1fa95f5f5117965342abbe55c8bb136e51 Mon Sep 17 00:00:00 2001 From: Jeff Williams Date: Sat, 15 Jul 2017 13:18:27 -0700 Subject: [PATCH] use an index to find doclets with a specific memberof --- lib/jsdoc/augment.js | 56 +++++++++++++++++++++++++++++------------ lib/jsdoc/src/parser.js | 11 +++++++- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/lib/jsdoc/augment.js b/lib/jsdoc/augment.js index 7f63e94a..a55b5ffe 100644 --- a/lib/jsdoc/augment.js +++ b/lib/jsdoc/augment.js @@ -75,16 +75,14 @@ function sort(dependencies) { } function getMembers(longname, docs, scopes) { - var candidate; + var memberof = docs.index.memberof[longname] || []; var members = []; - for (var i = 0, l = docs.length; i < l; i++) { - candidate = docs[i]; - - if (candidate.memberof === longname && scopes.indexOf(candidate.scope) !== -1) { + memberof.forEach(function(candidate) { + if (scopes.indexOf(candidate.scope) !== -1) { members.push(candidate); } - } + }); return members; } @@ -162,6 +160,25 @@ function updateDocumentedDoclets(doclet, documented) { documented[doclet.longname].push(doclet); } +/** + * Update the index of doclets with a `memberof` value. + * + * @private + * @param {module:jsdoc/doclet.Doclet} doclet - The doclet to be added to the index. + * @param {Object.>} memberof - The index of doclets + * with a `memberof` value. + * @return {void} + */ +function updateMemberofDoclets(doclet, memberof) { + if (doclet.memberof) { + if ( !hasOwnProp.call(memberof, doclet.memberof) ) { + memberof[doclet.memberof] = []; + } + + memberof[doclet.memberof].push(doclet); + } +} + function explicitlyInherits(doclets) { var doclet; var inherits = false; @@ -178,7 +195,7 @@ function explicitlyInherits(doclets) { } // TODO: try to reduce overlap with similar methods -function getInheritedAdditions(doclets, docs, documented) { +function getInheritedAdditions(doclets, docs, index) { var additionIndexes; var additions = []; var doc; @@ -234,19 +251,21 @@ function getInheritedAdditions(doclets, docs, documented) { // Add the ancestor's docs unless the descendant overrides the ancestor AND // documents the override. - if ( !hasOwnProp.call(documented, member.longname) ) { + if ( !hasOwnProp.call(index.documented, member.longname) ) { updateAddedDoclets(member, additions, additionIndexes); - updateDocumentedDoclets(member, documented); + updateDocumentedDoclets(member, index.documented); + updateMemberofDoclets(member, index.memberof); } // If the descendant used an @inheritdoc or @override tag, add the ancestor's // docs, and ignore the existing doclets. - else if ( explicitlyInherits(documented[member.longname]) ) { + else if ( explicitlyInherits(index.documented[member.longname]) ) { // Ignore any existing doclets. (This is safe because we only get here if // `member.longname` is an own property of `documented`.) - addDocletProperty(documented[member.longname], 'ignore', true); + addDocletProperty(index.documented[member.longname], 'ignore', true); updateAddedDoclets(member, additions, additionIndexes); - updateDocumentedDoclets(member, documented); + updateDocumentedDoclets(member, index.documented); + updateMemberofDoclets(member, index.memberof); // Remove property that's no longer accurate. if (member.virtual) { @@ -263,7 +282,7 @@ function getInheritedAdditions(doclets, docs, documented) { // If the descendant overrides the ancestor and documents the override, // update the doclets to indicate what the descendant is overriding. else { - addDocletProperty(documented[member.longname], 'overrides', + addDocletProperty(index.documented[member.longname], 'overrides', members[k].longname); } } @@ -304,9 +323,10 @@ function updateMixes(mixedDoclet, mixedLongname) { } // TODO: try to reduce overlap with similar methods -function getMixedInAdditions(mixinDoclets, allDoclets, commentedDoclets) { +function getMixedInAdditions(mixinDoclets, allDoclets, index) { var additionIndexes; var additions = []; + var commentedDoclets = index.documented; var doclet; var mixedDoclet; var mixedDoclets; @@ -346,6 +366,7 @@ function getMixedInAdditions(mixinDoclets, allDoclets, commentedDoclets) { updateAddedDoclets(mixedDoclet, additions, additionIndexes); updateDocumentedDoclets(mixedDoclet, commentedDoclets); + updateMemberofDoclets(mixedDoclet, index.memberof); } } } @@ -371,9 +392,10 @@ function updateImplements(implDoclets, implementedLongname) { } // TODO: try to reduce overlap with similar methods -function getImplementedAdditions(implDoclets, allDoclets, commentedDoclets) { +function getImplementedAdditions(implDoclets, allDoclets, index) { var additionIndexes; var additions = []; + var commentedDoclets = index.documented; var doclet; var implementations; var implExists; @@ -416,6 +438,7 @@ function getImplementedAdditions(implDoclets, allDoclets, commentedDoclets) { if ( !hasOwnProp.call(commentedDoclets, implementationDoclet.longname) ) { updateAddedDoclets(implementationDoclet, additions, additionIndexes); updateDocumentedDoclets(implementationDoclet, commentedDoclets); + updateMemberofDoclets(implementationDoclet, index.memberof); } // If the implementation used an @inheritdoc or @override tag, add the // interface's docs, and ignore the existing doclets. @@ -428,6 +451,7 @@ function getImplementedAdditions(implDoclets, allDoclets, commentedDoclets) { updateAddedDoclets(implementationDoclet, additions, additionIndexes); updateDocumentedDoclets(implementationDoclet, commentedDoclets); + updateMemberofDoclets(implementationDoclet, index.memberof); // Remove property that's no longer accurate. if (implementationDoclet.virtual) { @@ -460,7 +484,7 @@ function augment(doclets, propertyName, docletFinder) { var dependencies = sort( mapDependencies(index, propertyName) ); dependencies.forEach(function(depName) { - var additions = docletFinder(index[depName], doclets, doclets.index.documented); + var additions = docletFinder(index[depName], doclets, doclets.index); additions.forEach(function(addition) { var longname = addition.longname; diff --git a/lib/jsdoc/src/parser.js b/lib/jsdoc/src/parser.js index 32cea28c..aa0697ef 100644 --- a/lib/jsdoc/src/parser.js +++ b/lib/jsdoc/src/parser.js @@ -119,7 +119,8 @@ Parser.prototype.clear = function() { this._resultBuffer.index = { borrowed: [], documented: {}, - longname: {} + longname: {}, + memberof: {} }; this._byNodeId = new DocletCache(); this._byLongname = new DocletCache(); @@ -220,6 +221,14 @@ Parser.prototype.addResult = function(doclet) { } index.longname[doclet.longname].push(doclet); + // track all doclets that have a memberof by memberof + if (doclet.memberof) { + if ( !hasOwnProp.call(index.memberof, doclet.memberof) ) { + index.memberof[doclet.memberof] = []; + } + index.memberof[doclet.memberof].push(doclet); + } + // track longnames of documented symbols if (!doclet.undocumented) { if ( !hasOwnProp.call(index.documented, doclet.longname) ) {