From ba70bb4d6bf9ba1186a1bc187c78ff1aa0e8d73a Mon Sep 17 00:00:00 2001 From: Jeff Williams Date: Sun, 12 Nov 2023 13:05:02 -0800 Subject: [PATCH] fix(jsdoc-doclet): don't track unused doclets by properties like `longname` --- packages/jsdoc-doclet/lib/doclet-store.js | 6 +++++- packages/jsdoc-doclet/test/specs/lib/doclet-store.js | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/jsdoc-doclet/lib/doclet-store.js b/packages/jsdoc-doclet/lib/doclet-store.js index 563bc27c..fe894f47 100644 --- a/packages/jsdoc-doclet/lib/doclet-store.js +++ b/packages/jsdoc-doclet/lib/doclet-store.js @@ -202,7 +202,11 @@ export class DocletStore { newKey = doclet[requestedProp]; } - if (wasVisible && oldKey) { + // If the doclet is no longer visible, we must always remove it from the set, using whatever key + // we have. + if (wasVisible && !isVisible) { + removeFromSet(map, oldKey ?? newKey, doclet); + } else if (wasVisible && oldKey) { removeFromSet(map, oldKey, doclet); } if (isVisible && newKey) { diff --git a/packages/jsdoc-doclet/test/specs/lib/doclet-store.js b/packages/jsdoc-doclet/test/specs/lib/doclet-store.js index b622b119..c8f98cbf 100644 --- a/packages/jsdoc-doclet/test/specs/lib/doclet-store.js +++ b/packages/jsdoc-doclet/test/specs/lib/doclet-store.js @@ -884,6 +884,16 @@ describe('@jsdoc/doclet/lib/doclet-store', () => { expect(store.allDocletsByLongname.get(true)).toBeUndefined(); }); + + it('does not track a doclet by longname if it is no longer visible', () => { + const doclet = makeDoclet(['@class', '@memberof foo', '@name Bar']); + + expect(store.docletsByLongname.get('foo.Bar')).toHave(doclet); + + doclet.undocumented = true; + + expect(store.docletsByLongname.get('foo.Bar')).toBeUndefined(); + }); }); describe('`memberof`', () => {