if a member name is the same as its namespace's name, set the member's longname correctly (#214)

This commit is contained in:
Jeff Williams 2012-10-29 20:10:35 -07:00
parent 44b2c364a0
commit ddbe0315d4
3 changed files with 57 additions and 9 deletions

View File

@ -15,6 +15,8 @@ var puncToScope = { '.': 'static', '~': 'inner', '#': 'instance' },
scopeToPunc = { 'static': '.', 'inner': '~', 'instance': '#' },
Token = Packages.org.mozilla.javascript.Token;
var DEFAULT_SCOPE = 'static';
/**
Resolves the longname, memberof, variation and name values of the given doclet.
@param {module:jsdoc/doclet.Doclet} doclet
@ -36,14 +38,27 @@ exports.resolve = function(doclet) {
memberof = ('' || memberof).replace(/\.prototype\.?/g, '#');
// the name is a fullname, like @name foo.bar, @memberof foo
if (name && name.indexOf(memberof) === 0) {
about = exports.shorten(name, (doclet.forceMemberof? memberof : undefined));
if (name && name.indexOf(memberof) === 0 && name !== memberof) {
about = exports.shorten(name, (doclet.forceMemberof ? memberof : undefined));
}
else if (name && /([#.~])$/.test(memberof) ) { // like @memberof foo# or @memberof foo~
about = exports.shorten(memberof + name, (doclet.forceMemberof? memberof : undefined));
// the name and memberof are identical and refer to a module,
// like @name module:foo, @memberof module:foo (probably a member like 'var exports')
else if (name && name === memberof && name.indexOf('module:') === 0) {
about = exports.shorten(name, (doclet.forceMemberof ? memberof : undefined));
}
else if (name && doclet.scope ) { // like @memberof foo# or @memberof foo~
about = exports.shorten(memberof + (scopeToPunc[doclet.scope]||'') + name, (doclet.forceMemberof? memberof : undefined));
// the name and memberof are identical, like @name foo, @memberof foo
else if (name && name === memberof) {
doclet.scope = doclet.scope || DEFAULT_SCOPE;
name = memberof + scopeToPunc[doclet.scope] + name;
about = exports.shorten(name, (doclet.forceMemberof ? memberof : undefined));
}
// like @memberof foo# or @memberof foo~
else if (name && /([#.~])$/.test(memberof) ) {
about = exports.shorten(memberof + name, (doclet.forceMemberof ? memberof : undefined));
}
else if (name && doclet.scope) {
about = exports.shorten(memberof + (scopeToPunc[doclet.scope] || '') + name,
(doclet.forceMemberof ? memberof : undefined));
}
}
else { // no @memberof
@ -81,7 +96,7 @@ exports.resolve = function(doclet) {
doclet.name = doclet.name.substr(1);
}
else {
doclet.scope = 'static'; // default scope when none is provided
doclet.scope = DEFAULT_SCOPE;
}
doclet.setLongname(doclet.memberof + scopeToPunc[doclet.scope] + doclet.name);

16
test/fixtures/memberoftag4.js vendored Normal file
View File

@ -0,0 +1,16 @@
/**
* Namespace doStuff.
* @namespace doStuff
*/
/**
* Function with the same name as its namespace.
* @memberof doStuff
*/
function doStuff() {}
/**
* Function with a different name than the namespace.
* @memberof doStuff
*/
function doOtherStuff() {}

View File

@ -1,3 +1,4 @@
/*global describe: true, expect: true, it: true, jasmine: true */
describe("@memberof tag", function() {
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() {
expect(Data.name).toEqual('Data');
});
it('A symbol within a namespace for which no scope is specified.', function() {
var docSet = jasmine.getDocSetFromFile('test/fixtures/memberoftag4.js'),
doOtherStuff = docSet.getByLongname('doStuff.doOtherStuff')[0];
expect(doOtherStuff).toBeDefined();
expect(doOtherStuff.scope).toEqual('static');
});
it('A symbol in which name === memberof.', function() {
var docSet = jasmine.getDocSetFromFile('test/fixtures/memberoftag4.js'),
doStuff = docSet.getByLongname('doStuff.doStuff')[0];
expect(doStuff).toBeDefined();
expect(doStuff.scope).toEqual('static');
});
describe ("static", function() {
var docSet = jasmine.getDocSetFromFile('test/fixtures/memberoftag2.js'),
publish = docSet.getByLongname('Observable#publish')[0],