diff --git a/rhino_modules/jsdoc/augment.js b/rhino_modules/jsdoc/augment.js index 04f79e78..47a375c0 100644 --- a/rhino_modules/jsdoc/augment.js +++ b/rhino_modules/jsdoc/augment.js @@ -1,3 +1,4 @@ +var doop = require("jsdoc/util/doop").doop; (function() { var hasOwnProperty = Object.prototype.hasOwnProperty; @@ -74,20 +75,6 @@ return members; } - function doop(o) { - if (o instanceof Object && o.constructor != Function) { - var clone = o instanceof Array ? [] : {}, prop; - - for (prop in o){ - if ( hasOwnProperty.call(o, prop) ) { - clone[prop] = (o[prop] instanceof Object)? doop(o[prop]) : o[prop]; - } - } - return clone; - } - return o; - }; - var Sorter = function(dependencies) { this.dependencies = dependencies; this.visited = {}; diff --git a/rhino_modules/jsdoc/borrow.js b/rhino_modules/jsdoc/borrow.js index 54965b2d..12054639 100644 --- a/rhino_modules/jsdoc/borrow.js +++ b/rhino_modules/jsdoc/borrow.js @@ -5,6 +5,8 @@ @license Apache License 2.0 - See file 'LICENSE.md' in this project. */ +var doop = require("jsdoc/util/doop").doop; + // requires docs to have been indexed: docs.index must be defined here /** Take a copy of the docs for borrowed symbols and attach them to the @@ -47,22 +49,3 @@ exports.resolveBorrows = function(docs) { } }); } - -var hasOwnProperty = Object.prototype.hasOwnProperty; -/** - Deep clone a simple object. - @private - */ -function doop(o) { - if (o instanceof Object && o.constructor != Function) { - var clone = o instanceof Array ? [] : {}, prop; - - for (prop in o){ - if ( hasOwnProperty.call(o, prop) ) { - clone[prop] = (o[prop] instanceof Object)? doop(o[prop]) : o[prop]; - } - } - return clone; - } - return o; -}; diff --git a/rhino_modules/jsdoc/src/parser.js b/rhino_modules/jsdoc/src/parser.js index 18f4173d..3a05be7d 100644 --- a/rhino_modules/jsdoc/src/parser.js +++ b/rhino_modules/jsdoc/src/parser.js @@ -304,14 +304,17 @@ exports.Parser.prototype.addDocletRef = function(e) { } exports.Parser.prototype.resolveEnum = function(e) { - var parent = currentParser.resolvePropertyParent(e.code.node); + var doop = require("jsdoc/util/doop").doop, + parent = currentParser.resolvePropertyParent(e.code.node); if (parent && parent.doclet.isEnum) { if (!parent.doclet.properties) { parent.doclet.properties = []; } // members of an enum inherit the enum's type if (parent.doclet.type && !e.doclet.type) { e.doclet.type = parent.doclet.type; } delete e.doclet.undocumented; e.doclet.defaultvalue = e.doclet.meta.code.value; - parent.doclet.properties.push(e.doclet); + // add the doclet to the parent's properties + // use a copy of the doclet to avoid circular references + parent.doclet.properties.push( doop(e.doclet) ); } } diff --git a/rhino_modules/jsdoc/util/doop.js b/rhino_modules/jsdoc/util/doop.js new file mode 100644 index 00000000..74ab75fe --- /dev/null +++ b/rhino_modules/jsdoc/util/doop.js @@ -0,0 +1,20 @@ +/** + Deep clone a simple object. + @private + */ +var doop = exports.doop = function(o) { + var clone, + hasOwnProp = Object.prototype.hasOwnProperty, + prop; + if (o instanceof Object && o.constructor != Function) { + clone = o instanceof Array ? [] : {}; + + for (prop in o){ + if ( hasOwnProp.call(o, prop) ) { + clone[prop] = (o[prop] instanceof Object)? doop(o[prop]) : o[prop]; + } + } + return clone; + } + return o; +}; diff --git a/test/specs/tags/enumtag.js b/test/specs/tags/enumtag.js index 44af4543..a7c32a28 100644 --- a/test/specs/tags/enumtag.js +++ b/test/specs/tags/enumtag.js @@ -22,4 +22,10 @@ describe("@enum tag", function() { it('If a @type is given for the property it is reflected in the property value.', function() { expect(tristate.properties[2].type.names.join(', ')).toEqual('boolean'); }); + + it('An enum does not contain any circular references.', function() { + var dump = require("jsdoc/util/dumper").dump; + + expect( dump(tristate) ).not.toMatch(""); + }); }); \ No newline at end of file