From c9270a4fb5e4cb631c6f1555efa8fa05958736e1 Mon Sep 17 00:00:00 2001 From: Jeff Williams Date: Sat, 4 Jul 2020 18:31:08 -0700 Subject: [PATCH] fix(jsdoc): use the correct scope for exported classes with constructors Previously, if a module exported an ES2015 class, and the class had a constructor, the generated docs claimed that the class was in the `inner` scope. But `inner` means that the class is _not_ exported. This issue occurred because we generate separate doclets for the class declaration and constructor. When we merged the two, we incorrectly gave priority to properties in the constructor's doclet, rather than the class declaration's doclet. The constructor's doclet uses the `inner` scope; the class declaration's doclet uses the `static` scope. --- packages/jsdoc/lib/jsdoc/src/visitor.js | 2 +- packages/jsdoc/test/fixtures/aliasexports.js | 13 +++++++++++++ packages/jsdoc/test/specs/documentation/alias.js | 10 ++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 packages/jsdoc/test/fixtures/aliasexports.js diff --git a/packages/jsdoc/lib/jsdoc/src/visitor.js b/packages/jsdoc/lib/jsdoc/src/visitor.js index 8c88180a..26d28e7a 100644 --- a/packages/jsdoc/lib/jsdoc/src/visitor.js +++ b/packages/jsdoc/lib/jsdoc/src/visitor.js @@ -319,7 +319,7 @@ function makeConstructorFinisher(parser) { return; } - combined = combineDoclets(eventDoclet, parentDoclet); + combined = combineDoclets(parentDoclet, eventDoclet); combined.longname = parentDoclet.longname; if (parentDoclet.memberof) { combined.memberof = parentDoclet.memberof; diff --git a/packages/jsdoc/test/fixtures/aliasexports.js b/packages/jsdoc/test/fixtures/aliasexports.js new file mode 100644 index 00000000..e4aaf1ad --- /dev/null +++ b/packages/jsdoc/test/fixtures/aliasexports.js @@ -0,0 +1,13 @@ +/** @module foo */ + +/** + * Bar class. + * + * @alias module:foo.Bar + */ +class Bar { + /** Create a Bar. */ + constructor() {} +} + +exports.Bar = Bar; diff --git a/packages/jsdoc/test/specs/documentation/alias.js b/packages/jsdoc/test/specs/documentation/alias.js index bde6ee38..cd28119e 100644 --- a/packages/jsdoc/test/specs/documentation/alias.js +++ b/packages/jsdoc/test/specs/documentation/alias.js @@ -106,4 +106,14 @@ describe('aliases', () => { expect(method).toBeArrayOfSize(1); }); }); + + describe('class with constructor exported from module', () => { + it('When an exported class with a constructor has an alias, the exported class has the correct scope.', () => { + const docSet = jsdoc.getDocSetFromFile('test/fixtures/aliasexports.js'); + const klass = docSet.getByLongname('module:foo.Bar').filter(d => !d.undocumented); + + expect(klass).toBeArrayOfSize(1); + expect(klass[0].scope).toBe('static'); + }); + }); });