mirror of
https://github.com/jsdoc/jsdoc.git
synced 2025-12-08 19:46:11 +00:00
fix: use the correct name and longname for an exported symbol with a @memberof tag
This commit is contained in:
parent
4555ff0b68
commit
13cdfd18b7
@ -173,9 +173,9 @@ export function nodeToValue(node) {
|
|||||||
// Like the declaration in: `export const foo = 'bar';`
|
// Like the declaration in: `export const foo = 'bar';`
|
||||||
// We need a single value, so we use the first variable name.
|
// We need a single value, so we use the first variable name.
|
||||||
if (node.declaration.declarations) {
|
if (node.declaration.declarations) {
|
||||||
str = `${LONGNAMES.MODULE_EXPORT}.${nodeToValue(node.declaration.declarations[0])}`;
|
str = `${nodeToValue(node.declaration.declarations[0])}`;
|
||||||
} else {
|
} else {
|
||||||
str = `${LONGNAMES.MODULE_EXPORT}.${nodeToValue(node.declaration)}`;
|
str = `${nodeToValue(node.declaration)}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -139,6 +139,7 @@ function findAncestorWithType(node, ancestorType) {
|
|||||||
|
|
||||||
function setModuleScopeMemberOf(parser, doclet) {
|
function setModuleScopeMemberOf(parser, doclet) {
|
||||||
const moduleInfo = getModule();
|
const moduleInfo = getModule();
|
||||||
|
const node = doclet.meta?.code?.node;
|
||||||
let parentDoclet;
|
let parentDoclet;
|
||||||
let skipMemberof;
|
let skipMemberof;
|
||||||
|
|
||||||
@ -146,17 +147,17 @@ function setModuleScopeMemberOf(parser, doclet) {
|
|||||||
if (moduleInfo && !isModuleExports(moduleInfo, doclet)) {
|
if (moduleInfo && !isModuleExports(moduleInfo, doclet)) {
|
||||||
if (!doclet.scope) {
|
if (!doclet.scope) {
|
||||||
// is this a method definition? if so, we usually get the scope from the node directly
|
// is this a method definition? if so, we usually get the scope from the node directly
|
||||||
if (doclet.meta?.code?.node?.type === Syntax.MethodDefinition) {
|
if (node?.type === Syntax.MethodDefinition) {
|
||||||
parentDoclet = parser._getDocletById(doclet.meta.code.node.parent.parent.nodeId);
|
parentDoclet = parser._getDocletById(node.parent.parent.nodeId);
|
||||||
// special case for constructors of classes that have @alias tags
|
// special case for constructors of classes that have @alias tags
|
||||||
if (doclet.meta.code.node.kind === 'constructor' && parentDoclet?.alias) {
|
if (node.kind === 'constructor' && parentDoclet?.alias) {
|
||||||
// the constructor should use the same name as the class
|
// the constructor should use the same name as the class
|
||||||
doclet.addTag('alias', parentDoclet.alias);
|
doclet.addTag('alias', parentDoclet.alias);
|
||||||
doclet.addTag('name', parentDoclet.alias);
|
doclet.addTag('name', parentDoclet.alias);
|
||||||
// and we shouldn't try to set a memberof value
|
// and we shouldn't try to set a memberof value
|
||||||
skipMemberof = true;
|
skipMemberof = true;
|
||||||
} else {
|
} else {
|
||||||
doclet.addTag(doclet.meta.code.node.static ? 'static' : 'instance');
|
doclet.addTag(node.static ? 'static' : 'instance');
|
||||||
// The doclet should be a member of the parent doclet's alias.
|
// The doclet should be a member of the parent doclet's alias.
|
||||||
if (parentDoclet?.alias) {
|
if (parentDoclet?.alias) {
|
||||||
doclet.memberof = parentDoclet.alias;
|
doclet.memberof = parentDoclet.alias;
|
||||||
@ -164,7 +165,10 @@ function setModuleScopeMemberOf(parser, doclet) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Is this something that the module exports? if so, it's a static member.
|
// Is this something that the module exports? if so, it's a static member.
|
||||||
else if (findAncestorWithType(doclet.meta?.code?.node, Syntax.ExportNamedDeclaration)) {
|
else if (
|
||||||
|
node?.type === Syntax.ExportNamedDeclaration ||
|
||||||
|
findAncestorWithType(node, Syntax.ExportNamedDeclaration)
|
||||||
|
) {
|
||||||
doclet.addTag('static');
|
doclet.addTag('static');
|
||||||
}
|
}
|
||||||
// Otherwise, it must be an inner member.
|
// Otherwise, it must be an inner member.
|
||||||
|
|||||||
7
packages/jsdoc/test/fixtures/modulememberof.js
vendored
Normal file
7
packages/jsdoc/test/fixtures/modulememberof.js
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/**
|
||||||
|
* The bar namespace.
|
||||||
|
*
|
||||||
|
* @namespace
|
||||||
|
* @memberof module:foo
|
||||||
|
*/
|
||||||
|
export const bar = {};
|
||||||
26
packages/jsdoc/test/specs/documentation/modulememberof.js
Normal file
26
packages/jsdoc/test/specs/documentation/modulememberof.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2025 the JSDoc Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
describe('memberof a module', () => {
|
||||||
|
const docSet = jsdoc.getDocSetFromFile('test/fixtures/modulememberof.js');
|
||||||
|
|
||||||
|
it('uses the correct name and longname for an exported symbol with a @memberof tag', () => {
|
||||||
|
const bar = docSet.getByLongname('module:foo.bar').filter((d) => !d.undocumented)[0];
|
||||||
|
|
||||||
|
expect(bar).toBeObject();
|
||||||
|
expect(bar.name).toBe('bar');
|
||||||
|
});
|
||||||
|
});
|
||||||
Loading…
x
Reference in New Issue
Block a user