Skip to content

Commit ddbe031

Browse files
committed
if a member name is the same as its namespace's name, set the member's longname correctly (jsdoc#214)
1 parent 44b2c36 commit ddbe031

File tree

3 files changed

+57
-9
lines changed

3 files changed

+57
-9
lines changed

rhino_modules/jsdoc/name.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ var jsdoc = {
1414
var puncToScope = { '.': 'static', '~': 'inner', '#': 'instance' },
1515
scopeToPunc = { 'static': '.', 'inner': '~', 'instance': '#' },
1616
Token = Packages.org.mozilla.javascript.Token;
17-
17+
18+
var DEFAULT_SCOPE = 'static';
19+
1820
/**
1921
Resolves the longname, memberof, variation and name values of the given doclet.
2022
@param {module:jsdoc/doclet.Doclet} doclet
@@ -36,14 +38,27 @@ exports.resolve = function(doclet) {
3638
memberof = ('' || memberof).replace(/\.prototype\.?/g, '#');
3739

3840
// the name is a fullname, like @name foo.bar, @memberof foo
39-
if (name && name.indexOf(memberof) === 0) {
40-
about = exports.shorten(name, (doclet.forceMemberof? memberof : undefined));
41+
if (name && name.indexOf(memberof) === 0 && name !== memberof) {
42+
about = exports.shorten(name, (doclet.forceMemberof ? memberof : undefined));
43+
}
44+
// the name and memberof are identical and refer to a module,
45+
// like @name module:foo, @memberof module:foo (probably a member like 'var exports')
46+
else if (name && name === memberof && name.indexOf('module:') === 0) {
47+
about = exports.shorten(name, (doclet.forceMemberof ? memberof : undefined));
4148
}
42-
else if (name && /([#.~])$/.test(memberof) ) { // like @memberof foo# or @memberof foo~
43-
about = exports.shorten(memberof + name, (doclet.forceMemberof? memberof : undefined));
49+
// the name and memberof are identical, like @name foo, @memberof foo
50+
else if (name && name === memberof) {
51+
doclet.scope = doclet.scope || DEFAULT_SCOPE;
52+
name = memberof + scopeToPunc[doclet.scope] + name;
53+
about = exports.shorten(name, (doclet.forceMemberof ? memberof : undefined));
4454
}
45-
else if (name && doclet.scope ) { // like @memberof foo# or @memberof foo~
46-
about = exports.shorten(memberof + (scopeToPunc[doclet.scope]||'') + name, (doclet.forceMemberof? memberof : undefined));
55+
// like @memberof foo# or @memberof foo~
56+
else if (name && /([#.~])$/.test(memberof) ) {
57+
about = exports.shorten(memberof + name, (doclet.forceMemberof ? memberof : undefined));
58+
}
59+
else if (name && doclet.scope) {
60+
about = exports.shorten(memberof + (scopeToPunc[doclet.scope] || '') + name,
61+
(doclet.forceMemberof ? memberof : undefined));
4762
}
4863
}
4964
else { // no @memberof
@@ -81,9 +96,9 @@ exports.resolve = function(doclet) {
8196
doclet.name = doclet.name.substr(1);
8297
}
8398
else {
84-
doclet.scope = 'static'; // default scope when none is provided
99+
doclet.scope = DEFAULT_SCOPE;
85100
}
86-
101+
87102
doclet.setLongname(doclet.memberof + scopeToPunc[doclet.scope] + doclet.name);
88103
}
89104
}

test/fixtures/memberoftag4.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/**
2+
* Namespace doStuff.
3+
* @namespace doStuff
4+
*/
5+
6+
/**
7+
* Function with the same name as its namespace.
8+
* @memberof doStuff
9+
*/
10+
function doStuff() {}
11+
12+
/**
13+
* Function with a different name than the namespace.
14+
* @memberof doStuff
15+
*/
16+
function doOtherStuff() {}

test/specs/tags/memberoftag.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/*global describe: true, expect: true, it: true, jasmine: true */
12
describe("@memberof tag", function() {
23

34
it('When a symbol has an @member tag, the doclet has a long name that includes the parent.', function() {
@@ -12,6 +13,22 @@ describe("@memberof tag", function() {
1213
expect(Data.name).toEqual('Data');
1314
});
1415

16+
it('A symbol within a namespace for which no scope is specified.', function() {
17+
var docSet = jasmine.getDocSetFromFile('test/fixtures/memberoftag4.js'),
18+
doOtherStuff = docSet.getByLongname('doStuff.doOtherStuff')[0];
19+
20+
expect(doOtherStuff).toBeDefined();
21+
expect(doOtherStuff.scope).toEqual('static');
22+
});
23+
24+
it('A symbol in which name === memberof.', function() {
25+
var docSet = jasmine.getDocSetFromFile('test/fixtures/memberoftag4.js'),
26+
doStuff = docSet.getByLongname('doStuff.doStuff')[0];
27+
28+
expect(doStuff).toBeDefined();
29+
expect(doStuff.scope).toEqual('static');
30+
});
31+
1532
describe ("static", function() {
1633
var docSet = jasmine.getDocSetFromFile('test/fixtures/memberoftag2.js'),
1734
publish = docSet.getByLongname('Observable#publish')[0],

0 commit comments

Comments
 (0)