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'); + }); });