@abstract/@virtual tag support.

This commit is contained in:
Rafał Wrzeszcz 2011-12-10 10:27:33 +01:00
parent d7e74062b1
commit fcc26990ca
7 changed files with 66 additions and 2 deletions

View File

@ -113,6 +113,11 @@ exports.jsdocSchema = {
"maxItems": 1, "maxItems": 1,
"enum": ["private", "protected", "public"] "enum": ["private", "protected", "public"]
}, },
"virtual": { // is a member left to be implemented during inheritance?
"type": "boolean",
"optional": true,
"default": false
},
"attrib": { // other attributes, like "readonly" "attrib": { // other attributes, like "readonly"
"type": "string", "type": "string",
"optional": true "optional": true

View File

@ -11,6 +11,15 @@
*/ */
exports.defineTags = function(dictionary) { exports.defineTags = function(dictionary) {
dictionary.defineTag('abstract', {
mustNotHaveValue: true,
onTagged: function(doclet, tag) {
// since "abstract" is reserved word in JavaScript let's use "virtual" in code
doclet.virtual = true;
}
})
.synonym('virtual');
dictionary.defineTag('access', { dictionary.defineTag('access', {
mustHaveValue: true, mustHaveValue: true,
onTagged: function(doclet, tag) { onTagged: function(doclet, tag) {

View File

@ -102,6 +102,10 @@
function addAttribs(f) { function addAttribs(f) {
var attribs = []; var attribs = [];
if (f.virtual) {
attribs.push('virtual');
}
if (f.access && f.access !== 'public') { if (f.access && f.access !== 'public') {
attribs.push(f.access); attribs.push(f.access);
} }

View File

@ -51,7 +51,8 @@
var thisNamespace = parentNode.namespaces[element.name] = { var thisNamespace = parentNode.namespaces[element.name] = {
'name': element.name, 'name': element.name,
'description': element.description || '', 'description': element.description || '',
'access': element.access || '' 'access': element.access || '',
'virtual': !!element.virtual
}; };
graft(thisNamespace, childNodes, element.longname, element.name); graft(thisNamespace, childNodes, element.longname, element.name);
@ -64,7 +65,8 @@
var thisMixin = parentNode.mixins[element.name] = { var thisMixin = parentNode.mixins[element.name] = {
'name': element.name, 'name': element.name,
'description': element.description || '', 'description': element.description || '',
'access': element.access || '' 'access': element.access || '',
'virtual': !!element.virtual
}; };
graft(thisMixin, childNodes, element.longname, element.name); graft(thisMixin, childNodes, element.longname, element.name);
@ -77,6 +79,7 @@
var thisFunction = parentNode.functions[element.name] = { var thisFunction = parentNode.functions[element.name] = {
'name': element.name, 'name': element.name,
'access': element.access || '', 'access': element.access || '',
'virtual': !!element.virtual,
'description': element.description || '', 'description': element.description || '',
'parameters': [ ] 'parameters': [ ]
}; };
@ -108,6 +111,7 @@
parentNode.properties[element.name] = { parentNode.properties[element.name] = {
'name': element.name, 'name': element.name,
'access': element.access || '', 'access': element.access || '',
'virtual': !!element.virtual,
'description': element.description || '', 'description': element.description || '',
'type': element.type? (element.type.length === 1? element.type[0] : element.type) : '' 'type': element.type? (element.type.length === 1? element.type[0] : element.type) : ''
}; };
@ -121,6 +125,7 @@
var thisEvent = parentNode.events[element.name] = { var thisEvent = parentNode.events[element.name] = {
'name': element.name, 'name': element.name,
'access': element.access || '', 'access': element.access || '',
'virtual': !!element.virtual,
'description': element.description || '', 'description': element.description || '',
'parameters': [ 'parameters': [
] ]
@ -156,6 +161,7 @@
'description': element.classdesc || '', 'description': element.classdesc || '',
'extends': element.augments || [], 'extends': element.augments || [],
'access': element.access || '', 'access': element.access || '',
'virtual': !!element.virtual,
'fires': element.fires || '', 'fires': element.fires || '',
'constructor': { 'constructor': {
'name': element.name, 'name': element.name,

17
test/cases/abstracttag.js Normal file
View File

@ -0,0 +1,17 @@
/** @constructor */
function Thingy() {
/** @abstract */
this.pez = 2;
}
// same as...
/** @constructor */
function OtherThingy() {
/** @virtual */
this.pez = 2;
}

View File

@ -103,6 +103,7 @@ testFile('test/t/cases/innerscope2.js');
testFile('test/t/cases/modules/data/mod-1.js'); testFile('test/t/cases/modules/data/mod-1.js');
testFile('test/t/cases/modules/data/mod-2.js'); testFile('test/t/cases/modules/data/mod-2.js');
testFile('test/t/cases/abstracttag.js');
testFile('test/t/cases/accesstag.js'); testFile('test/t/cases/accesstag.js');
testFile('test/t/cases/alias.js'); testFile('test/t/cases/alias.js');
testFile('test/t/cases/alias2.js'); testFile('test/t/cases/alias2.js');

View File

@ -0,0 +1,22 @@
(function() {
var docSet = testhelpers.getDocSetFromFile('test/cases/abstracttag.js'),
type = docSet.getByLongname('Thingy')[0]
pez = docSet.getByLongname('Thingy#pez')[0];
test('By default symbol has virtual=undefined property.', function() {
assert.equal(!!type.virtual, false);
});
test('When a symbol has a @abstract tag, the doclet has a virtual=true property.', function() {
assert.equal(pez.virtual, true);
});
// same as...
pez = docSet.getByLongname('OtherThingy#pez')[0];
test('When a symbol has a @virtual tag, the doclet has a virtual=true property.', function() {
assert.equal(pez.virtual, true);
});
})();