Ox.doc: parse inherited properties
This commit is contained in:
parent
ac82c3b30e
commit
4221d437ce
1 changed files with 104 additions and 12 deletions
|
@ -13,11 +13,16 @@ Ox.doc <f> Generates documentation for annotated JavaScript
|
||||||
arguments <[o]|u> Arguments (array of doc objects)
|
arguments <[o]|u> Arguments (array of doc objects)
|
||||||
Present if the <code>type</code> of the item is
|
Present if the <code>type</code> of the item is
|
||||||
<code>"function"</code>.
|
<code>"function"</code>.
|
||||||
description <s|u> Multi-line description with optional markup
|
class <s|u> Class of the item
|
||||||
See Ox.sanitizeHTML for details
|
default <s|u> Default value of the item
|
||||||
|
description <s|u> Multi-line description with some Markdown
|
||||||
|
See Ox.parseMarkdown for details
|
||||||
events <[o]|u> Events (array of doc objects)
|
events <[o]|u> Events (array of doc objects)
|
||||||
Present if the item fires any events
|
Present if the item fires any events
|
||||||
file <s> File name
|
file <s> File name
|
||||||
|
inherited <[o]|u> Inherited properties (array of doc objects)
|
||||||
|
Present if the item has a class, and any item in its inheritance
|
||||||
|
chain has (unshadowed) properties
|
||||||
line <n> Line number
|
line <n> Line number
|
||||||
name <s> Name of the item
|
name <s> Name of the item
|
||||||
order <[s]> Order of returns, arguments, properties
|
order <[s]> Order of returns, arguments, properties
|
||||||
|
@ -35,11 +40,12 @@ Ox.doc <f> Generates documentation for annotated JavaScript
|
||||||
returns <[o]> Return values (array of doc objects)
|
returns <[o]> Return values (array of doc objects)
|
||||||
Present if the <code>type</code> of the item is
|
Present if the <code>type</code> of the item is
|
||||||
<code>"function"</code>.
|
<code>"function"</code>.
|
||||||
summary <s> One-line summary
|
summary <s> One-line summary, with some Markdown
|
||||||
|
See Ox.parseMarkdown for details
|
||||||
tests <[o]> Tests (array of test objects)
|
tests <[o]> Tests (array of test objects)
|
||||||
expected <s> Expected result
|
expected <s> Expected result
|
||||||
statement <s> Statement
|
statement <s> Statement
|
||||||
type <s> Type of the item
|
types <[s]> Types of the item
|
||||||
<script>
|
<script>
|
||||||
Ox.test.doc = Ox.doc([
|
Ox.test.doc = Ox.doc([
|
||||||
'//@ My.FOO <n> Magic constant',
|
'//@ My.FOO <n> Magic constant',
|
||||||
|
@ -85,17 +91,99 @@ Ox.doc = (function() {
|
||||||
test: /\n(\s*> .+\n.+?)/g,
|
test: /\n(\s*> .+\n.+?)/g,
|
||||||
},
|
},
|
||||||
types = {
|
types = {
|
||||||
a: 'array', b: 'boolean', d: 'date',
|
a: 'array', b: 'boolean', d: 'date', e: 'error', f: 'function',
|
||||||
e: 'element', f: 'function', n: 'number',
|
g: 'arguments', h: 'htmlelement', 'l': 'nodelist', n: 'number',
|
||||||
o: 'object', r: 'regexp', s: 'string',
|
o: 'object', r: 'regexp', s: 'string', u: 'undefined',
|
||||||
u: 'undefined', '*': 'value', '!': 'event'
|
'w': 'window', '*': 'any', '+': 'other', '!': 'event'
|
||||||
};
|
};
|
||||||
|
function addInheritedProperties(items) {
|
||||||
|
var constructors = getConstructors(items), instances = {}, nodes = {};
|
||||||
|
function hasProperty(item, property) {
|
||||||
|
var properties = item.properties || [],
|
||||||
|
inherited = item.inherited ? item.inherited.map(function(v) {
|
||||||
|
return v.properties;
|
||||||
|
}) : [];
|
||||||
|
return Ox.contains(properties.concat(inherited), property);
|
||||||
|
}
|
||||||
|
var foo = {};
|
||||||
|
constructors.forEach(function(constructor) {
|
||||||
|
var instance = Ox.last(constructor.returns);
|
||||||
|
instances[constructor.name] = instance;
|
||||||
|
nodes[constructor.name] = instance['class'];
|
||||||
|
});
|
||||||
|
Ox.print('CHAINS', getChains(nodes))
|
||||||
|
Ox.forEach(getChains(nodes), function(chain, childName) {
|
||||||
|
var child = instances[childName];
|
||||||
|
chain.forEach(function(parentName) {
|
||||||
|
var parent = instances[parentName] || null;
|
||||||
|
parent && parent.properties && parent.properties.forEach(function(property) {
|
||||||
|
if (!hasProperty(child, property)) {
|
||||||
|
if (!child.inherited) {
|
||||||
|
child.inherited = [];
|
||||||
|
}
|
||||||
|
if (!child.inherited.some(function(v) {
|
||||||
|
return v.name == parentName;
|
||||||
|
})) {
|
||||||
|
child.inherited.push({name: parentName, properties: []});
|
||||||
|
}
|
||||||
|
Ox.last(child.inherited).properties.push(property);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return items;
|
||||||
|
}
|
||||||
function decodeLinebreaks(match, submatch) {
|
function decodeLinebreaks(match, submatch) {
|
||||||
return (submatch || match).replace(/\u21A9/g, '\n');
|
return (submatch || match).replace(/\u21A9/g, '\n');
|
||||||
}
|
}
|
||||||
function encodeLinebreaks(match, submatch) {
|
function encodeLinebreaks(match, submatch) {
|
||||||
return '\n' + (submatch || match).replace(/\n/g, '\u21A9');
|
return '\n' + (submatch || match).replace(/\n/g, '\u21A9');
|
||||||
}
|
}
|
||||||
|
function getChains(nodes) {
|
||||||
|
var chains = {}, sorted = [], visited = [];
|
||||||
|
function visit(name, stack) {
|
||||||
|
stack = stack || [];
|
||||||
|
if (Ox.contains(stack, name)) {
|
||||||
|
throw new Error(
|
||||||
|
'Circular dependency: ' + name + ' <-> ' + Ox.last(stack)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (!Ox.contains(visited, name)) {
|
||||||
|
visited.push(name);
|
||||||
|
stack.push(name)
|
||||||
|
Ox.forEach(nodes, function(parent, name_) {
|
||||||
|
parent == name && visit(name_, stack);
|
||||||
|
});
|
||||||
|
sorted.unshift(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ox.forEach(nodes, function(parent, name) {
|
||||||
|
visit(name);
|
||||||
|
});
|
||||||
|
sorted.forEach(function(name) {
|
||||||
|
chains[name] = [nodes[name]].concat(chains[nodes[name]] || [])
|
||||||
|
});
|
||||||
|
return chains;
|
||||||
|
}
|
||||||
|
function getConstructors(items) {
|
||||||
|
var constructors = [];
|
||||||
|
items.forEach(function(item) {
|
||||||
|
if (item.returns) {
|
||||||
|
Ox.forEach(item.returns, function(v) {
|
||||||
|
if (v['class']) {
|
||||||
|
constructors.push(item);
|
||||||
|
Ox.Break();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
['arguments', 'properties', 'returns'].forEach(function(key) {
|
||||||
|
if (item[key]) {
|
||||||
|
constructors.concat(getConstructors(item[key]));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
return constructors;
|
||||||
|
}
|
||||||
function getIndent(string) {
|
function getIndent(string) {
|
||||||
var indent = -1;
|
var indent = -1;
|
||||||
while (string[++indent] == ' ') {}
|
while (string[++indent] == ' ') {}
|
||||||
|
@ -312,7 +400,7 @@ Ox.doc = (function() {
|
||||||
function parseTypes(string) {
|
function parseTypes(string) {
|
||||||
// returns {types: [""]}
|
// returns {types: [""]}
|
||||||
// or {types: [""], default: ""}
|
// or {types: [""], default: ""}
|
||||||
// or {types: [""], super: ""}
|
// or {types: [""], class: ""}
|
||||||
var array,
|
var array,
|
||||||
isArray,
|
isArray,
|
||||||
ret = {types: []},
|
ret = {types: []},
|
||||||
|
@ -322,7 +410,7 @@ Ox.doc = (function() {
|
||||||
array = string.split(':');
|
array = string.split(':');
|
||||||
string = array[0];
|
string = array[0];
|
||||||
if (array.length == 2) {
|
if (array.length == 2) {
|
||||||
ret['super'] = array[1];
|
ret['class'] = array[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
string.split('|').forEach(function(string) {
|
string.split('|').forEach(function(string) {
|
||||||
|
@ -351,15 +439,19 @@ Ox.doc = (function() {
|
||||||
return function(argument, callback) {
|
return function(argument, callback) {
|
||||||
var counter = 0, items = [], ret;
|
var counter = 0, items = [], ret;
|
||||||
if (arguments.length == 1) {
|
if (arguments.length == 1) {
|
||||||
ret = parseSource(argument);
|
// source
|
||||||
|
ret = addInheritedProperties(parseSource(argument));
|
||||||
} else {
|
} else {
|
||||||
|
// file(s)
|
||||||
argument = Ox.makeArray(argument);
|
argument = Ox.makeArray(argument);
|
||||||
argument.forEach(function(file) {
|
argument.forEach(function(file) {
|
||||||
Ox.get(file, function(source) {
|
Ox.get(file, function(source) {
|
||||||
items = items.concat(
|
items = items.concat(
|
||||||
parseSource(source, file.split('?')[0])
|
parseSource(source, file.split('?')[0])
|
||||||
);
|
);
|
||||||
++counter == argument.length && callback(items);
|
if (++counter == argument.length) {
|
||||||
|
callback(addInheritedProperties(items));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue