Simplify the way we annotate observable properties
We no longer add observable annotations to the constructor. Instead, we just mark getters (and for read/write properties also setters) with an observable annotation.
This commit is contained in:
@@ -1,29 +1,67 @@
|
||||
var util = require('util');
|
||||
|
||||
var classes = {};
|
||||
var observables = {};
|
||||
|
||||
exports.handlers = {
|
||||
|
||||
newDoclet: function(e) {
|
||||
var doclet = e.doclet;
|
||||
if (doclet.kind == 'class') {
|
||||
classes[doclet.longname] = doclet;
|
||||
}
|
||||
},
|
||||
|
||||
parseComplete: function(e) {
|
||||
var doclets = e.doclets;
|
||||
var cls, doclet, i, ii, observable;
|
||||
for (i = 0, ii = doclets.length - 1; i < ii; ++i) {
|
||||
doclet = doclets[i];
|
||||
cls = classes[doclet.longname.split('#')[0]];
|
||||
if (typeof doclet.observable == 'string' && cls) {
|
||||
var name = doclet.name.replace(/^[sg]et/, '');
|
||||
name = name.substr(0, 1).toLowerCase() + name.substr(1);
|
||||
var key = doclet.longname.split('#')[0] + '#' + name;
|
||||
doclet.observable = key;
|
||||
if (!observables[key]) {
|
||||
observables[key] = {};
|
||||
}
|
||||
observable = observables[key];
|
||||
observable.name = name;
|
||||
observable.readonly = typeof observable.readonly == 'boolean' ?
|
||||
observable.readonly : true;
|
||||
if (doclet.name.indexOf('get') === 0) {
|
||||
observable.type = doclet.returns[0].type;
|
||||
observable.description = doclet.returns[0].description;
|
||||
} else if (doclet.name.indexOf('set') === 0) {
|
||||
observable.readonly = false;
|
||||
}
|
||||
if (!cls.observables) {
|
||||
cls.observables = [];
|
||||
}
|
||||
observable = observables[doclet.observable];
|
||||
if (cls.observables.indexOf(observable) == -1) {
|
||||
cls.observables.push(observable);
|
||||
}
|
||||
if (!cls.fires) {
|
||||
cls.fires = [];
|
||||
}
|
||||
if (cls.fires.indexOf('ol.ObjectEvent') === -1) {
|
||||
cls.fires.push('ol.ObjectEvent');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
exports.defineTags = function(dictionary) {
|
||||
dictionary.defineTag('observable', {
|
||||
mustHaveValue: true,
|
||||
canHaveType: true,
|
||||
canHaveName: true,
|
||||
mustNotHaveValue: true,
|
||||
canHaveType: false,
|
||||
canHaveName: false,
|
||||
onTagged: function(doclet, tag) {
|
||||
if (!doclet.observables) {
|
||||
doclet.observables = [];
|
||||
}
|
||||
var description = tag.value.description;
|
||||
var readonly = description.split(' ').shift() === 'readonly';
|
||||
if (readonly) {
|
||||
description = description.split(' ').slice(1).join(' ');
|
||||
}
|
||||
doclet.observables.push({
|
||||
name: tag.value.name,
|
||||
type: {
|
||||
names: tag.value.type.names
|
||||
},
|
||||
description: description,
|
||||
readonly: readonly
|
||||
});
|
||||
if (!doclet.fires) {
|
||||
doclet.fires = [];
|
||||
}
|
||||
doclet.observable = '';
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
@@ -9,22 +9,7 @@ exports.defineTags = function(dictionary) {
|
||||
if (parts[0] === 'api') {
|
||||
doclet.stability = parts.slice(1).join(' ') || 'experimental';
|
||||
} else if (parts[0] === 'observable') {
|
||||
if (!doclet.observables) {
|
||||
doclet.observables = [];
|
||||
}
|
||||
var readonly = parts.length > 3 && parts[3] === 'readonly';
|
||||
var description = (readonly ? parts.slice(4) : parts.slice(3)).join(' ');
|
||||
doclet.observables.push({
|
||||
name: parts[1],
|
||||
type: {
|
||||
names: tag.value.type.names
|
||||
},
|
||||
description: description,
|
||||
readonly: readonly
|
||||
});
|
||||
if (!doclet.fires) {
|
||||
doclet.fires = [];
|
||||
}
|
||||
doclet.observable = '';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user