mirror of
https://github.com/jsdoc/jsdoc.git
synced 2025-12-08 19:46:11 +00:00
improvements to interface and implements tags
- Change doclet property names - Populate the list of property implementations in augment.js, not in the template - Tone down the presentation of both tags in the default template - Other related cleanup
This commit is contained in:
parent
277d712f3e
commit
2f87fb11dc
@ -145,40 +145,40 @@ exports.addInherited = function(docs) {
|
||||
|
||||
exports.addImplemented = function(docs) {
|
||||
var docMap = {};
|
||||
var interfaces = [];
|
||||
var interfaces = {};
|
||||
var implemented = {};
|
||||
var propertyInfo = {};
|
||||
var memberInfo = {};
|
||||
|
||||
docs.forEach(function(doc) {
|
||||
if (!hasOwnProp.call(docMap, doc.memberof)) {
|
||||
docMap[doc.memberof] = [];
|
||||
var memberof = doc.memberof || doc.name;
|
||||
|
||||
if (!hasOwnProp.call(docMap, memberof)) {
|
||||
docMap[memberof] = [];
|
||||
}
|
||||
docMap[doc.memberof].push(doc);
|
||||
docMap[memberof].push(doc);
|
||||
|
||||
if (doc.kind === 'interface') {
|
||||
interfaces.push(doc);
|
||||
} else if (doc.implements && doc.implements.length) {
|
||||
if (!hasOwnProp.call(implemented, doc.memberof)) {
|
||||
implemented[doc.memberof] = [];
|
||||
interfaces[doc.longname] = doc;
|
||||
}
|
||||
implemented[doc.memberof].push(doc);
|
||||
else if (doc.implements && doc.implements.length) {
|
||||
if (!hasOwnProp.call(implemented, doc.memberof)) {
|
||||
implemented[memberof] = [];
|
||||
}
|
||||
implemented[memberof].push(doc);
|
||||
}
|
||||
});
|
||||
|
||||
// create an array of interface properties/methods, plus a hash of the doclet for each one
|
||||
interfaces.forEach(function(inf) {
|
||||
if (hasOwnProp.call(docMap, inf.name)) {
|
||||
docMap[inf.name].forEach(function(obj) {
|
||||
var members = propertyInfo[obj.memberof];
|
||||
if (!members) {
|
||||
members = propertyInfo[obj.memberof] = {
|
||||
props: [],
|
||||
info: {}
|
||||
};
|
||||
}
|
||||
// create an dictionary of interface doclets
|
||||
Object.keys(interfaces).forEach(function(ifaceName) {
|
||||
var iface = interfaces[ifaceName];
|
||||
if (hasOwnProp.call(docMap, iface.name)) {
|
||||
docMap[iface.name].forEach(function(doc) {
|
||||
var members = memberInfo[doc.memberof];
|
||||
|
||||
members.props.push(obj.name);
|
||||
members.info[obj.name] = obj;
|
||||
if (!members) {
|
||||
members = memberInfo[doc.memberof] = {};
|
||||
}
|
||||
members[doc.name] = doc;
|
||||
});
|
||||
}
|
||||
});
|
||||
@ -187,20 +187,46 @@ exports.addImplemented = function(docs) {
|
||||
// implemented classes namespace.
|
||||
var owner = implemented[key];
|
||||
|
||||
owner.forEach(function(cls) {
|
||||
owner.forEach(function(klass) {
|
||||
// class's interfaces
|
||||
cls.implements.forEach(function(impl) {
|
||||
var implProps = propertyInfo[impl];
|
||||
var props = docMap[cls.longname] || [];
|
||||
klass.implements.forEach(function(impl) {
|
||||
var interfaceMember;
|
||||
var interfaceMembers = memberInfo[impl];
|
||||
var member;
|
||||
var members;
|
||||
|
||||
for (var i = 0, len = props.length; i < len; i++) {
|
||||
var prop = props[i];
|
||||
|
||||
// mark implemented properties by checking the implProps array for each name
|
||||
if (implProps && implProps.props.indexOf(prop.name) > -1) {
|
||||
prop.implemented = true;
|
||||
prop.implementProp = implProps.info[prop.name].longname;
|
||||
// mark the interface as being implemented by the class
|
||||
if (hasOwnProp.call(interfaces, impl)) {
|
||||
interfaces[impl].implementations = interfaces[impl].implementations || [];
|
||||
interfaces[impl].implementations.push(klass.longname);
|
||||
}
|
||||
|
||||
// if the interface has no members, skip to the next owner
|
||||
if (!interfaceMembers) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!hasOwnProp.call(docMap, klass.longname)) {
|
||||
docMap[klass.longname] = [];
|
||||
}
|
||||
members = docMap[klass.longname];
|
||||
|
||||
for (var i = 0, len = members.length; i < len; i++) {
|
||||
member = members[i];
|
||||
interfaceMember = interfaceMembers && interfaceMembers[member.name];
|
||||
|
||||
// if we didn't find the member name in the interface, skip to the next member
|
||||
if (!interfaceMember) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// mark members that implement an interface
|
||||
member.implements = member.implements || [];
|
||||
member.implements.push(interfaceMember.longname);
|
||||
|
||||
// mark interface members that the symbol implements
|
||||
interfaceMember.implementations = interfaceMember.implementations || [];
|
||||
interfaceMember.implementations.push(member.longname);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
@ -334,17 +334,19 @@ var DOCLET_SCHEMA = exports.DOCLET_SCHEMA = {
|
||||
type: BOOLEAN,
|
||||
optional: true
|
||||
},
|
||||
implementations: {
|
||||
type: ARRAY,
|
||||
optional: true,
|
||||
items: {
|
||||
type: STRING
|
||||
}
|
||||
},
|
||||
implements: {
|
||||
type: ARRAY,
|
||||
optional: true
|
||||
},
|
||||
implemented: {
|
||||
type: BOOLEAN,
|
||||
optional: true
|
||||
},
|
||||
implementProp: {
|
||||
type: STRING,
|
||||
optional: true
|
||||
optional: true,
|
||||
items: {
|
||||
type: STRING
|
||||
}
|
||||
},
|
||||
inherited: {
|
||||
type: BOOLEAN,
|
||||
|
||||
@ -195,8 +195,8 @@ h6
|
||||
}
|
||||
|
||||
.details { margin-top: 14px; border-left: 2px solid #DDD; }
|
||||
.details dt { width:100px; float:left; padding-left: 10px; padding-top: 6px; }
|
||||
.details dd { margin-left: 50px; }
|
||||
.details dt { width:120px; float:left; padding-left: 10px; padding-top: 6px; }
|
||||
.details dd { margin-left: 70px; }
|
||||
.details ul { margin: 0; }
|
||||
.details ul { list-style-type: none; }
|
||||
.details li { margin-left: 30px; padding-top: 6px; }
|
||||
|
||||
@ -80,48 +80,6 @@
|
||||
<?js }); ?></dl>
|
||||
<?js } ?>
|
||||
|
||||
<?js
|
||||
/* listing interface list at implemented class documents. */
|
||||
var implements = doc.implements;
|
||||
if (doc.kind === 'class' && implements && implements.length) {
|
||||
?>
|
||||
<h3 class="subsection-title">Implements</h3>
|
||||
<ul>
|
||||
<?js
|
||||
implements.forEach(function(imp) {
|
||||
?>
|
||||
<li> <?js= self.linkto(imp) ?> </li>
|
||||
<?js
|
||||
});
|
||||
?>
|
||||
</ul>
|
||||
|
||||
<?js
|
||||
}
|
||||
?>
|
||||
|
||||
<?js
|
||||
/* listing implemented class with this interface. */
|
||||
var implemented = self.find({ 'implements': { 'isArray': true } });
|
||||
if (doc.kind === 'interface' && implemented && implemented.length) {
|
||||
?>
|
||||
<h3 class="subsection-title">Implementations</h3>
|
||||
<ul>
|
||||
<?js
|
||||
implemented.forEach(function(imp) {
|
||||
if (imp.implements.indexOf(doc.name) > -1) {
|
||||
?>
|
||||
<li> <?js= self.linkto(imp.longname, self.htmlsafe(imp.longname)) ?> </li>
|
||||
<?js
|
||||
}
|
||||
});
|
||||
?>
|
||||
</ul>
|
||||
|
||||
<?js
|
||||
}
|
||||
?>
|
||||
|
||||
<?js
|
||||
var mixins = self.find({kind: 'mixin', memberof: doc.longname});
|
||||
if (doc.kind !== 'globalobj' && mixins && mixins.length) {
|
||||
|
||||
@ -39,11 +39,22 @@ if (data.defaultvalue && (data.defaultvaluetype === 'object' || data.defaultvalu
|
||||
</li></dd>
|
||||
<?js } ?>
|
||||
|
||||
<?js if (data.implemented && data.implementProp) { ?>
|
||||
<dt class="implementes">Implementes:</dt>
|
||||
<dd class="implementes"><ul class="dummy"><li>
|
||||
<?js= this.linkto(data.implementProp, this.htmlsafe(data.implementProp)) ?>
|
||||
</li></dd>
|
||||
<?js if (data.implementations && data.implementations.length) { ?>
|
||||
<dt class="implementations">Implementations:</dt>
|
||||
<dd class="implementations"><ul>
|
||||
<?js data.implementations.forEach(function(impl) { ?>
|
||||
<li><?js= self.linkto(impl, self.htmlsafe(impl)) ?></li>
|
||||
<?js }); ?>
|
||||
</ul></dd>
|
||||
<?js } ?>
|
||||
|
||||
<?js if (data.implements && data.implements.length) { ?>
|
||||
<dt class="implements">Implements:</dt>
|
||||
<dd class="implements"><ul>
|
||||
<?js data.implements.forEach(function(impl) { ?>
|
||||
<li><?js= self.linkto(impl, self.htmlsafe(impl)) ?></li>
|
||||
<?js }); ?>
|
||||
</ul></dd>
|
||||
<?js } ?>
|
||||
|
||||
<?js if (data.mixes && data.mixes.length) { ?>
|
||||
|
||||
@ -12,12 +12,13 @@ describe('@implements tag', function() {
|
||||
it('MyTester has an "implements" array', function() {
|
||||
expect(Array.isArray(myTester.implements)).toBe(true);
|
||||
expect(myTester.implements.length).toBe(1);
|
||||
expect(myTester.implements[0]).toEqual('ITester');
|
||||
expect(myTester.implements[0]).toBe('ITester');
|
||||
});
|
||||
|
||||
it('beforeEach has "implemented" and "implementProp" property', function() {
|
||||
expect(beforeEachMethod.implemented).toBeDefined();
|
||||
expect(beforeEachMethod.implementProp).toBeDefined();
|
||||
it('beforeEach has an "implements" array', function() {
|
||||
expect(Array.isArray(beforeEachMethod.implements)).toBe(true);
|
||||
expect(beforeEachMethod.implements.length).toBe(1);
|
||||
expect(beforeEachMethod.implements[0]).toBe('ITester#beforeEach');
|
||||
});
|
||||
|
||||
it('MyWorker\'s process() method does not implement an interface', function() {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user