From ddbe0315d43195f01c659c9de6c7f85c800a079b Mon Sep 17 00:00:00 2001 From: Jeff Williams Date: Mon, 29 Oct 2012 20:10:35 -0700 Subject: [PATCH] if a member name is the same as its namespace's name, set the member's longname correctly (#214) --- rhino_modules/jsdoc/name.js | 33 ++++++++++++++++++++++++--------- test/fixtures/memberoftag4.js | 16 ++++++++++++++++ test/specs/tags/memberoftag.js | 17 +++++++++++++++++ 3 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 test/fixtures/memberoftag4.js diff --git a/rhino_modules/jsdoc/name.js b/rhino_modules/jsdoc/name.js index d3d73b40..394f453e 100644 --- a/rhino_modules/jsdoc/name.js +++ b/rhino_modules/jsdoc/name.js @@ -14,7 +14,9 @@ var jsdoc = { 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,9 +96,9 @@ 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); } } diff --git a/test/fixtures/memberoftag4.js b/test/fixtures/memberoftag4.js new file mode 100644 index 00000000..521343d8 --- /dev/null +++ b/test/fixtures/memberoftag4.js @@ -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() {} \ No newline at end of file diff --git a/test/specs/tags/memberoftag.js b/test/specs/tags/memberoftag.js index aa67d910..15653a11 100644 --- a/test/specs/tags/memberoftag.js +++ b/test/specs/tags/memberoftag.js @@ -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],