Added boolean trus and false to the list of @default values recognised from the code source. Added support for invalid variable name characters in the keys of objectliterals, plus tests.

This commit is contained in:
Michael Mathews 2011-04-10 00:31:54 +02:00
parent 20416aa65c
commit 2b3553dd64
9 changed files with 56 additions and 7 deletions

View File

@ -95,7 +95,7 @@
*/
exports.Doclet.prototype.setLongname = function(name) {
if (/^<global>\.?/.test(name)) { name = name.replace(/^<global>\.?/, ''); }
/**
The fully resolved symbol name.
@type string

View File

@ -24,7 +24,7 @@
memberof = doclet.memberof || '',
about = {},
parentDoc;
name = name? (''+name).replace(/\.prototype\.?/g, '#') : '';
// member of a var in an outer scope?
@ -172,6 +172,7 @@
scope = scope.replace('@{'+i+'}@', atoms[i]);
name = name.replace('@{'+i+'}@', atoms[i]);
}
////
return {longname: longname, memberof: memberof, scope: scope, name: name, variation: variation};
}

View File

@ -268,7 +268,7 @@
currentParser.refs['astnode'+e.code.node.hashCode()] = e.doclet; // allow lookup from value => doclet
}
}
else if (node.type === Token.COLON) {
else if (node.type === Token.COLON) { // assignment within an object literal
e = {
id: 'astnode'+node.hashCode(), // the id of the COLON node
comment: String(node.left.jsDoc||'@undocumented'),
@ -376,8 +376,9 @@
function aboutNode(node) {
about = {};
if (node.type == Token.FUNCTION /*&& String(node.name) !== ''*/) {
if (node.type == Token.FUNCTION) {
about.name = '' + node.name;
about.type = 'function';
about.node = node;
@ -402,6 +403,13 @@
if (node.type === Token.ASSIGN || node.type === Token.COLON) {
about.name = nodeToString(node.left);
if (node.type === Token.COLON) {
// objlit keys with unsafe variable-name characters must be quoted
if (!/^[$_a-z][$_a-z0-9]*$/i.test(about.name) ) {
about.name = '"'+about.name.replace(/"/g, '\\"')+'"';
}
}
about.node = node.right;
about.value = nodeToString(about.node);
about.type = getTypeName(node.right);

View File

@ -123,12 +123,16 @@
doclet.defaultvalue = tag.value;
}
else if (doclet.meta && doclet.meta.code && typeof doclet.meta.code.value !== 'undefined') {
if (doclet.meta.code.type && /STRING|NUMBER|NAME/.test(doclet.meta.code.type)) {
if (doclet.meta.code.type && /STRING|NUMBER|NAME|TRUE|FALSE/.test(doclet.meta.code.type)) {
doclet.defaultvalue = doclet.meta.code.value;
if (doclet.meta.code.type === 'STRING') {
// TODO: handle escaped quotes in values
doclet.defaultvalue = '"'+doclet.defaultvalue.replace(/"/g, '\\"')+'"'
}
if (doclet.defaultvalue === 'TRUE' || doclet.defaultvalue == 'FALSE') {
doclet.defaultvalue = doclet.defaultvalue.toLowerCase();
}
}
else if (doclet.meta.code.type === 'NULL') {
// TODO: handle escaped quotes in values

View File

@ -1,6 +1,8 @@
/** @namespace */
var chat = {};
/**
@namespace
@name chat."#channel"
*/
chat["#channel"] = {};
@ -8,7 +10,7 @@ chat["#channel"] = {};
/**
@property
@type {boolean}
@name chat."#channel".open
@defaultvalue
*/
chat["#channel"].open = true;

10
test/cases/quotename2.js Normal file
View File

@ -0,0 +1,10 @@
/** @namespace */
var contacts = {
/** @namespace */
'say-"hello"@example.com': {
/** document me */
"username": 'Sue Smart'
}
}

View File

@ -130,6 +130,8 @@ testFile('test/t/cases/moduletag.js');
testFile('test/t/cases/moduletag2.js');
testFile('test/t/cases/paramtag.js');
testFile('test/t/cases/privatetag.js');
testFile('test/t/cases/quotename.js');
testFile('test/t/cases/quotename2.js');
testFile('test/t/cases/readonlytag.js');
testFile('test/t/cases/requirestag.js');
testFile('test/t/cases/returnstag.js');

11
test/t/cases/quotename.js Normal file
View File

@ -0,0 +1,11 @@
(function() {
var docSet = testhelpers.getDocSetFromFile('test/cases/quotename.js'),
found1 = docSet.getByLongname('chat.\"#channel\".open')[0];
// dump(docSet);
test('When a member is quoted in square brackets.', function() {
assert.equal(found1.name, 'open', 'The short name should be correct.');
assert.equal(found1.memberof, 'chat.\"#channel\"', 'The memberof should be correct.');
});
})();

View File

@ -0,0 +1,11 @@
(function() {
var docSet = testhelpers.getDocSetFromFile('test/cases/quotename2.js'),
found1 = docSet.getByLongname("contacts.\"say-\\\"hello\\\"@example.com\".username")[0];
// dump(docSet);
test('When a key name of a member of an objlit is quoted.', function() {
assert.equal(found1.name, 'username', 'The short name should be correct.');
assert.equal(found1.memberof, "contacts.\"say-\\\"hello\\\"@example.com\"", 'The memberof should be correct.');
});
})();