diff --git a/lib/jsdoc/schema.js b/lib/jsdoc/schema.js index dd493d09f..3459874b1 100644 --- a/lib/jsdoc/schema.js +++ b/lib/jsdoc/schema.js @@ -269,7 +269,7 @@ var DOCLET_SCHEMA = exports.DOCLET_SCHEMA = { defaultvaluetype: { type: STRING, optional: true, - enum: [OBJECT] + enum: [OBJECT, ARRAY] }, // is usage of this symbol deprecated? deprecated: { diff --git a/lib/jsdoc/src/astnode.js b/lib/jsdoc/src/astnode.js index 36ecf5cea..0d5c3e8cc 100644 --- a/lib/jsdoc/src/astnode.js +++ b/lib/jsdoc/src/astnode.js @@ -123,6 +123,21 @@ var nodeToString = exports.nodeToString = function(node) { var str = ''; switch (node.type) { + case Syntax.ArrayExpression: + tempObject = []; + node.elements.forEach(function(el, i) { + // preserve literal values so that the JSON form shows the correct type + if (el.type === Syntax.Literal) { + tempObject[i] = el.value; + } + else { + tempObject[i] = nodeToString(el); + } + }); + + str = JSON.stringify(tempObject); + break; + case Syntax.AssignmentExpression: str = nodeToString(node.left); break; diff --git a/lib/jsdoc/tag/dictionary/definitions.js b/lib/jsdoc/tag/dictionary/definitions.js index 029896a09..66c051e4a 100644 --- a/lib/jsdoc/tag/dictionary/definitions.js +++ b/lib/jsdoc/tag/dictionary/definitions.js @@ -301,6 +301,11 @@ exports.defineTags = function(dictionary) { value = doclet.meta.code.value; switch(type) { + case Syntax.ArrayExpression: + doclet.defaultvalue = astnode.nodeToString(doclet.meta.code.node); + doclet.defaultvaluetype = 'array'; + break; + case Syntax.Literal: doclet.defaultvalue = String(value); break; diff --git a/templates/default/tmpl/details.tmpl b/templates/default/tmpl/details.tmpl index abe5e6517..1ee86d2ad 100644 --- a/templates/default/tmpl/details.tmpl +++ b/templates/default/tmpl/details.tmpl @@ -3,8 +3,8 @@ var data = obj; var self = this; var defaultObjectClass = ''; -// Check if the default value is an object, if so, apply code highlighting -if (data.defaultvalue && data.defaultvaluetype === 'object') { +// Check if the default value is an object or array; if so, apply code highlighting +if (data.defaultvalue && (data.defaultvaluetype === 'object' || data.defaultvaluetype === 'array')) { data.defaultvalue = "
" + data.defaultvalue + "
";
defaultObjectClass = ' class="object-value"';
}
diff --git a/test/fixtures/defaulttag.js b/test/fixtures/defaulttag.js
index 989bfadae..5c6d62378 100644
--- a/test/fixtures/defaulttag.js
+++ b/test/fixtures/defaulttag.js
@@ -46,3 +46,6 @@ var multilineObject = {
valueB : false,
valueC : 7
};
+
+/** @default */
+var arr = ['foo', true, 19];
diff --git a/test/specs/tags/defaulttag.js b/test/specs/tags/defaulttag.js
index d0f6d47ef..1798793f4 100644
--- a/test/specs/tags/defaulttag.js
+++ b/test/specs/tags/defaulttag.js
@@ -10,6 +10,7 @@ describe("@default tag", function() {
var header = (docSet.getByLongname('header') || [])[0];
var obj = docSet.getByLongname('obj')[0];
var multilineObject = docSet.getByLongname('multilineObject')[0];
+ var arr = docSet.getByLongname('arr')[0];
it('When symbol set to null has a @default tag with no text, the doclet\'s defaultValue property should be: null', function() {
expect(request.defaultvalue).toBe('null');
@@ -39,14 +40,25 @@ describe("@default tag", function() {
expect(header.defaultvalue).toBeUndefined();
});
- it('When symbol has a @default tag with an object, the doclet\'s defaultValue property should contain the stringified object', function() {
- var expected_value = '{"valueA":"a","valueB":false,"valueC":7}';
- expect(obj.defaultvalue).toEqual(expected_value);
+ it('When symbol has a @default tag with an object, the doclet should contain the stringified object', function() {
+ var testObj = { valueA: 'a', valueB: false, valueC: 7};
+ expect(obj.defaultvalue).toBe( JSON.stringify(testObj) );
+ expect(obj.defaultvaluetype).toBe('object');
});
- it('When symbol has a @default tag with a multiline object, the doclet\'s defaultValue property should contain the properly stringified object', function() {
- var expected_value = '{"valueA":"a","valueB":false,"valueC":7}';
- expect(obj.defaultvalue).toEqual(expected_value);
+ it('When symbol has a @default tag with a multiline object, the doclet should contain the stringified object', function() {
+ var testObj = {
+ valueA: 'a',
+ valueB: false,
+ valueC: 7
+ };
+ expect(obj.defaultvalue).toBe( JSON.stringify(testObj) );
+ expect(obj.defaultvaluetype).toBe('object');
});
+ it('When symbol has a @default tag with an array, the doclet should contain the stringified array', function() {
+ var testArray = ['foo', true, 19];
+ expect(arr.defaultvalue).toBe( JSON.stringify(testArray) );
+ expect(arr.defaultvaluetype).toBe('array');
+ });
});