From 869f63113ff3c4086804de2919c8ac84e17c21a6 Mon Sep 17 00:00:00 2001 From: Jeff Williams Date: Thu, 18 Dec 2014 16:41:51 -0800 Subject: [PATCH] allow `interface` tag to have a name in the JSDoc tag dictionary (#828) --- lib/jsdoc/tag/dictionary/definitions.js | 10 ++++- test/fixtures/interfacetag2.js | 5 +++ test/specs/tags/interfacetag.js | 51 ++++++++++++++++++++++++- 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 test/fixtures/interfacetag2.js diff --git a/lib/jsdoc/tag/dictionary/definitions.js b/lib/jsdoc/tag/dictionary/definitions.js index 6c3cf454..f4cab60b 100644 --- a/lib/jsdoc/tag/dictionary/definitions.js +++ b/lib/jsdoc/tag/dictionary/definitions.js @@ -467,9 +467,12 @@ var baseTags = exports.baseTags = { } }, interface: { - mustNotHaveValue: true, + canHaveName: true, onTagged: function(doclet, tag) { doclet.addTag('kind', 'interface'); + if (tag.value) { + setDocletNameToValueName(doclet, tag); + } } }, kind: { @@ -779,7 +782,10 @@ var closureTags = exports.closureTags = { extends: cloneTagDef(baseTags.augments), final: cloneTagDef(baseTags.readonly), implements: cloneTagDef(baseTags.implements), - interface: cloneTagDef(baseTags.interface), + interface: cloneTagDef(baseTags.interface, { + canHaveName: false, + mustNotHaveValue: true + }), lends: cloneTagDef(baseTags.lends), license: cloneTagDef(baseTags.license), param: cloneTagDef(baseTags.param), diff --git a/test/fixtures/interfacetag2.js b/test/fixtures/interfacetag2.js new file mode 100644 index 00000000..c8885b7d --- /dev/null +++ b/test/fixtures/interfacetag2.js @@ -0,0 +1,5 @@ +/** + * Virtual doclet for an interface. + * + * @interface VirtualInterface + */ diff --git a/test/specs/tags/interfacetag.js b/test/specs/tags/interfacetag.js index 094f79d4..6162b252 100644 --- a/test/specs/tags/interfacetag.js +++ b/test/specs/tags/interfacetag.js @@ -1,8 +1,12 @@ 'use strict'; describe('@interface tag', function() { - var docSet = jasmine.getDocSetFromFile('test/fixtures/interface-implements.js'); + var definitions = require('jsdoc/tag/dictionary/definitions'); + var Dictionary = require('jsdoc/tag/dictionary').Dictionary; + var doclet = require('jsdoc/doclet'); + var logger = require('jsdoc/util/logger'); + var docSet = jasmine.getDocSetFromFile('test/fixtures/interface-implements.js'); var testerInterface = docSet.getByLongname('ITester')[0]; var testerImplementation = docSet.getByLongname('MyTester')[0]; @@ -13,4 +17,49 @@ describe('@interface tag', function() { it('MyTester class has its kind set to "class" (not "interface")', function() { expect(testerImplementation.kind).toBe('class'); }); + + describe('virtual doclets', function() { + var tagDict; + + beforeEach(function() { + spyOn(logger, 'warn'); + }); + + afterEach(function() { + tagDict = new Dictionary(); + definitions.defineTags(tagDict); + doclet._replaceDictionary(tagDict); + }); + + it('should support virtual doclets with the JSDoc tag dictionary', function() { + var docSet2; + var virtualInterface; + + tagDict = new Dictionary(); + definitions.defineTags(tagDict, definitions.jsdocTags); + doclet._replaceDictionary(tagDict); + + docSet2 = jasmine.getDocSetFromFile('test/fixtures/interfacetag2.js'); + virtualInterface = docSet2.getByLongname('VirtualInterface')[0]; + + expect(logger.warn).not.toHaveBeenCalled(); + expect(virtualInterface).toBeDefined(); + expect(virtualInterface.longname).toBe('VirtualInterface'); + }); + + it('should not support virtual doclets with the Closure tag dictionary', function() { + var docSet2; + var virtualInterface; + + tagDict = new Dictionary(); + definitions.defineTags(tagDict, definitions.closureTags); + doclet._replaceDictionary(tagDict); + + docSet2 = jasmine.getDocSetFromFile('test/fixtures/interfacetag2.js'); + virtualInterface = docSet2.getByLongname('VirtualInterface')[0]; + + expect(logger.warn).toHaveBeenCalled(); + expect(virtualInterface).not.toBeDefined(); + }); + }); });