use an index to find doclets with a specific memberof

This commit is contained in:
Jeff Williams 2017-07-15 13:18:27 -07:00
parent 9945ffe5ff
commit e370dc1fa9
2 changed files with 50 additions and 17 deletions

View File

@ -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.<string, Array.<module:jsdoc/doclet.Doclet>>} 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;

View File

@ -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) ) {