Merge pull request #634 from rassilon/issue-631

Fix issue #631: Virtual comments inside modules
This commit is contained in:
Jeff Williams 2014-04-14 08:05:27 -07:00
commit 48fa2fd320
4 changed files with 87 additions and 12 deletions

View File

@ -111,7 +111,7 @@ exports.resolve = function(doclet) {
doclet.setMemberof(about.memberof);
}
if (about.longname && !doclet.longname) {
if (about.longname && (!doclet.longname || doclet.longname === doclet.name)) {
doclet.setLongname(about.longname);
}

View File

@ -33,6 +33,20 @@ function setCurrentModule(doclet) {
}
}
function setDefaultScopeMemberOf(doclet) {
// add @inner and @memberof tags unless the current module exports only this symbol
if (currentModule && currentModule !== doclet.name) {
// add @inner unless the current module exports only this symbol
if (!doclet.scope) {
doclet.addTag('inner');
}
if (!doclet.memberof && doclet.scope !== 'global') {
doclet.addTag('memberof', currentModule);
}
}
}
/**
* Attach these event handlers to a particular instance of a parser.
* @param parser
@ -48,6 +62,8 @@ exports.attachTo = function(parser) {
return false; // only interested in virtual comments (with a @name) here
}
setDefaultScopeMemberOf(newDoclet);
newDoclet.postProcess();
addDoclet.call(parser, newDoclet);
e.doclet = newDoclet;
@ -149,17 +165,7 @@ exports.attachTo = function(parser) {
}
}
else {
// add @inner and @memberof tags unless the current module exports only this symbol
if (currentModule && currentModule !== newDoclet.name) {
// add @inner unless the current module exports only this symbol
if (!newDoclet.scope) {
newDoclet.addTag('inner');
}
if (!newDoclet.memberof && newDoclet.scope !== 'global') {
newDoclet.addTag('memberof', currentModule);
}
}
setDefaultScopeMemberOf(newDoclet);
}
}

37
test/fixtures/moduletag4.js vendored Normal file
View File

@ -0,0 +1,37 @@
/** @module M1 */
/**
* The differnet kind of mouse buttons.
*
* @summary Blah blah
* @readonly
* @enum {string}
*/
exports.MouseButtons = {
Left: "Left",
Middle: "Middle",
Right: "Right"
};
/**
* @typedef ClickProperties
* @type {object}
* @property {MouseButtons} Button - Which mouse button is clicking.
*/
/**
* Virtual comment function
*
* @function VirtualComment
* @static
* @param {string} comment - comment
*
*/
/**
* Virtual comment function 2
* @function VirtualComment2
* @instance
* @param {string} comment - comment
*/

View File

@ -38,4 +38,36 @@ describe("@module tag", function() {
expect(darken.kind).toBe('function');
});
});
describe("virtual comments", function() {
var docSet = jasmine.getDocSetFromFile('test/fixtures/moduletag4.js'),
m1 = docSet.getByLongname('module:M1').filter(function($) {
return ! $.undocumented;
})[0],
clickProperties = docSet.getByLongname('module:M1~ClickProperties')[0],
virtFunc = docSet.getByLongname('module:M1.VirtualComment')[0],
virtFunc2 = docSet.getByLongname('module:M1#VirtualComment2')[0];
it('When a virtual comment typedef is inside a module, the typedef is a memberof the module', function () {
expect(clickProperties.memberof).toBe('module:M1');
});
it('When a virtual comment typedef is inside a module, the typedef longname contains the module name', function() {
expect(clickProperties.longname).toBe('module:M1~ClickProperties');
});
it('When a virtual comment typedef is inside a module, the typedef scope is "inner"', function() {
expect(clickProperties.scope).toBe('inner');
});
it('When a virtual comment function is inside a module with a static scope, the function has the correct memberof and longname', function () {
expect(virtFunc.longname).toBe('module:M1.VirtualComment');
expect(virtFunc.memberof).toBe('module:M1');
});
it('When a virtual comment function is inside a module with an instance scope, the function has the correct memberof and longname', function() {
expect(virtFunc2.longname).toBe('module:M1#VirtualComment2');
expect(virtFunc2.memberof).toBe('module:M1');
});
});
});