mirror of
https://github.com/eclipse/upm.git
synced 2025-03-15 04:57:30 +03:00
yuidoc: updated generators and templates to fix IE sidebar issue
Signed-off-by: Mihai Tudor Panu <mihai.tudor.panu@intel.com>
This commit is contained in:
parent
d493c015fd
commit
0c46dd28be
@ -43,20 +43,17 @@ opts
|
|||||||
|
|
||||||
// use promise-style programming rather than spaghetti callbacks
|
// use promise-style programming rather than spaghetti callbacks
|
||||||
Promise.promisifyAll(fs);
|
Promise.promisifyAll(fs);
|
||||||
|
Promise.promisifyAll(mkdirp);
|
||||||
|
|
||||||
// TODO: create directory structure if doesn't exist
|
|
||||||
var formats = opts.formats.split(',');
|
|
||||||
formats.forEach(function(format){
|
|
||||||
mkdirp('jsdoc/' + format + '/' + opts.module);
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// main
|
// main
|
||||||
xml2js.parse().then(function(specjs) {
|
xml2js.parse().then(function(specjs) {
|
||||||
|
var formats = opts.formats.split(',');
|
||||||
Promise.all(_.map(formats, function(format) {
|
Promise.all(_.map(formats, function(format) {
|
||||||
var generateDocs = require(__dirname + '/generators/' + format + '/generator');
|
var generateDocs = require(__dirname + '/generators/' + format + '/generator');
|
||||||
var outFile = opts.outdir + '/' + format + '/' + specjs.MODULE + '/doc.js';
|
var dir = opts.outdir + '/' + format + '/' + specjs.MODULE;
|
||||||
return fs.writeFileAsync(outFile, generateDocs(specjs));
|
return mkdirp.mkdirpAsync(dir).then(function() {
|
||||||
|
return fs.writeFileAsync(dir + '/doc.js', generateDocs(specjs));
|
||||||
|
});
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
@ -58,6 +58,7 @@ function GENERATE_MODULE(module) {
|
|||||||
|
|
||||||
// generate method spec with parent module/class
|
// generate method spec with parent module/class
|
||||||
function GENERATE_METHOD(name, spec, parent) {
|
function GENERATE_METHOD(name, spec, parent) {
|
||||||
|
name = name.replace(/!+$/, '');
|
||||||
return GENERATE_DOC(spec.description + '\n'
|
return GENERATE_DOC(spec.description + '\n'
|
||||||
+ '@method ' + name + '\n'
|
+ '@method ' + name + '\n'
|
||||||
+ '@instance\n'
|
+ '@instance\n'
|
||||||
|
@ -28,44 +28,66 @@ var _ = require('lodash');
|
|||||||
|
|
||||||
// generate json for ternjs input
|
// generate json for ternjs input
|
||||||
function generateDocs(specjs) {
|
function generateDocs(specjs) {
|
||||||
var docs = GENERATE_MODULE(specjs.MODULE);
|
|
||||||
GENERATE_TYPE = (function(enums) {
|
GENERATE_TYPE = (function(enums) {
|
||||||
return function(type) {
|
return function(type) {
|
||||||
return (_.contains(enums, type) ? ('Enum ' + type) : type);
|
return (_.contains(enums, type) ? ('Enum ' + type) : type);
|
||||||
}
|
}
|
||||||
})(_.keys(specjs.ENUMS_BY_GROUP));
|
})(_.keys(specjs.ENUMS_BY_GROUP));
|
||||||
|
var docs = { '!name': specjs.MODULE + 'library' };
|
||||||
|
_.extend(docs, GENERATE_MODULE(specjs.MODULE));
|
||||||
_.each(specjs.ENUMS, function(enumSpec, enumName) {
|
_.each(specjs.ENUMS, function(enumSpec, enumName) {
|
||||||
_.extend(docs[specjs.MODULE], GENERATE_ENUM(enumName, enumSpec));
|
_.extend(docs[specjs.MODULE], GENERATE_ENUM(enumName, enumSpec));
|
||||||
});
|
});
|
||||||
_.each(specjs.METHODS, function(methodSpec, methodName) {
|
_.each(specjs.METHODS, function(methodSpec, methodName) {
|
||||||
_.extend(docs[specjs.MODULE], GENERATE_METHOD(methodName, methodSpec));
|
_.extend(docs[specjs.MODULE], GENERATE_METHOD(methodName, methodSpec));
|
||||||
});
|
});
|
||||||
_.each(specjs.CLASSES, function(classSpec, parentClass) {
|
|
||||||
var constructor = classSpec.methods[parentClass];
|
if (_.isEmpty(specjs.CLASSGROUPS)) {
|
||||||
_.extend(docs[specjs.MODULE], GENERATE_METHOD(parentClass, constructor ? constructor : { params: {}, return: {}, description: '' } ));
|
_.extend(docs[specjs.MODULE], GENERATE_CLASSES(specjs.CLASSES));
|
||||||
_.each(classSpec.enums, function(enumSpec, enumName) {
|
} else {
|
||||||
_.extend(docs[specjs.MODULE][parentClass], GENERATE_ENUM(enumName, enumSpec));
|
var grouped = _.flatten(_.pluck(_.values(specjs.CLASSGROUPS), 'classes'));
|
||||||
|
var ungrouped = _.difference(_.keys(specjs.CLASSES), grouped);
|
||||||
|
_.extend(docs[specjs.MODULE], GENERATE_CLASSES(_.pick(specjs.CLASSES, ungrouped)));
|
||||||
|
_.each(specjs.CLASSGROUPS, function(groupSpec, groupName) {
|
||||||
|
_.extend(docs, GENERATE_MODULE(groupName));
|
||||||
|
_.extend(docs[groupName], GENERATE_CLASSES(_.pick(specjs.CLASSES, groupSpec.classes), groupName));
|
||||||
});
|
});
|
||||||
docs[specjs.MODULE][parentClass].prototype = {};
|
}
|
||||||
_.each(_.omit(classSpec.methods, parentClass), function(methodSpec, methodName) {
|
|
||||||
_.extend(docs[specjs.MODULE][parentClass].prototype, GENERATE_METHOD(methodName, methodSpec));
|
|
||||||
});
|
|
||||||
_.each(classSpec.variables, function(variableSpec, variableName) {
|
|
||||||
_.extend(docs[specjs.MODULE][parentClass].prototype, GENERATE_VARIABLE(variableName, variableSpec));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return JSON.stringify(docs, null, 2);
|
return JSON.stringify(docs, null, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// generate module spec
|
// generate module spec
|
||||||
function GENERATE_MODULE(module) {
|
function GENERATE_MODULE(module) {
|
||||||
var docs = { '!name': module + 'library' };
|
var docs = {};
|
||||||
docs[module] = {};
|
docs[module] = {};
|
||||||
return docs;
|
return docs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// generate the spec for the given list of classes
|
||||||
|
function GENERATE_CLASSES(classes) {
|
||||||
|
var docs = {};
|
||||||
|
_.each(classes, function(classSpec, parentClass) {
|
||||||
|
var constructor = classSpec.methods[parentClass];
|
||||||
|
_.extend(docs, GENERATE_METHOD(parentClass, constructor ? constructor : { params: {}, return: {}, description: '' } ));
|
||||||
|
if (_.has(docs, parentClass)) {
|
||||||
|
_.each(classSpec.enums, function(enumSpec, enumName) {
|
||||||
|
_.extend(docs[parentClass], GENERATE_ENUM(enumName, enumSpec));
|
||||||
|
});
|
||||||
|
docs[parentClass].prototype = {};
|
||||||
|
_.each(_.omit(classSpec.methods, parentClass), function(methodSpec, methodName) {
|
||||||
|
_.extend(docs[parentClass].prototype, GENERATE_METHOD(methodName, methodSpec));
|
||||||
|
});
|
||||||
|
_.each(classSpec.variables, function(variableSpec, variableName) {
|
||||||
|
_.extend(docs[parentClass].prototype, GENERATE_VARIABLE(variableName, variableSpec));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return docs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// generate method spec
|
// generate method spec
|
||||||
function GENERATE_METHOD(name, spec) {
|
function GENERATE_METHOD(name, spec) {
|
||||||
var doc = {};
|
var doc = {};
|
||||||
|
14
doxy/node/generators/yuidoc/generator.js
vendored
14
doxy/node/generators/yuidoc/generator.js
vendored
@ -46,7 +46,7 @@ function generateDocs(specjs) {
|
|||||||
docs += GENERATE_MODULE('common', '');
|
docs += GENERATE_MODULE('common', '');
|
||||||
var grouped = _.flatten(_.pluck(_.values(specjs.CLASSGROUPS), 'classes'));
|
var grouped = _.flatten(_.pluck(_.values(specjs.CLASSGROUPS), 'classes'));
|
||||||
var ungrouped = _.difference(_.keys(specjs.CLASSES), grouped);
|
var ungrouped = _.difference(_.keys(specjs.CLASSES), grouped);
|
||||||
docs += GENERATE_CLASSES(_.pick(specjs.CLASSES, ungrouped), 'common');
|
docs += GENERATE_CLASSES(_.pick(specjs.CLASSES, ungrouped), 'common');
|
||||||
_.each(specjs.CLASSGROUPS, function(groupSpec, groupName) {
|
_.each(specjs.CLASSGROUPS, function(groupSpec, groupName) {
|
||||||
docs += GENERATE_CLASSES(_.pick(specjs.CLASSES, groupSpec.classes), groupName);
|
docs += GENERATE_CLASSES(_.pick(specjs.CLASSES, groupSpec.classes), groupName);
|
||||||
});
|
});
|
||||||
@ -76,7 +76,7 @@ function GENERATE_MODULE(name, description) {
|
|||||||
function GENERATE_CLASSES(classes, parent) {
|
function GENERATE_CLASSES(classes, parent) {
|
||||||
return _.reduce(classes, function(memo, classSpec, className) {
|
return _.reduce(classes, function(memo, classSpec, className) {
|
||||||
return memo
|
return memo
|
||||||
+ GENERATE_CLASS(className, classSpec.description, parent)
|
+ GENERATE_CLASS(className, classSpec.description, parent, classSpec.parent)
|
||||||
+ _.reduce(classSpec.methods, function(memo, methodSpec, methodName) {
|
+ _.reduce(classSpec.methods, function(memo, methodSpec, methodName) {
|
||||||
return memo += GENERATE_METHOD(methodName, methodSpec, className);
|
return memo += GENERATE_METHOD(methodName, methodSpec, className);
|
||||||
}, '')
|
}, '')
|
||||||
@ -91,15 +91,21 @@ function GENERATE_CLASSES(classes, parent) {
|
|||||||
|
|
||||||
|
|
||||||
// generate class spec
|
// generate class spec
|
||||||
function GENERATE_CLASS(name, description, parent) {
|
function GENERATE_CLASS(name, description, namespace, parent) {
|
||||||
return GENERATE_DOC(description + '\n'
|
return GENERATE_DOC(description + '\n'
|
||||||
+ '@class ' + name + '\n'
|
+ '@class ' + name + '\n'
|
||||||
+ (parent ? ('@module ' + parent + '\n') : ''));
|
+ (namespace ? ('@module ' + namespace + '\n') : '')
|
||||||
|
/*
|
||||||
|
TODO: leave out until figure out what swig does with inheritance
|
||||||
|
+ (parent ? ('@extends ' + parent + '\n') : '')
|
||||||
|
*/
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// generate method spec with parent module/class
|
// generate method spec with parent module/class
|
||||||
function GENERATE_METHOD(name, spec, parent) {
|
function GENERATE_METHOD(name, spec, parent) {
|
||||||
|
name = name.replace(/!+$/, '');
|
||||||
return GENERATE_DOC(spec.description + '\n'
|
return GENERATE_DOC(spec.description + '\n'
|
||||||
+ '@method ' + name + '\n'
|
+ '@method ' + name + '\n'
|
||||||
+ (parent ? ('@for ' + parent + '\n') : '@for common\n')
|
+ (parent ? ('@for ' + parent + '\n') : '@for common\n')
|
||||||
|
10
doxy/node/generators/yuidoc/helper.js
vendored
10
doxy/node/generators/yuidoc/helper.js
vendored
@ -77,17 +77,15 @@ function listByGroup(modules, classes, field, projectRoot) {
|
|||||||
var groups = Object.keys(modulesByGroup).sort();
|
var groups = Object.keys(modulesByGroup).sort();
|
||||||
var html = '';
|
var html = '';
|
||||||
var pfx = projectRoot + 'modules/';
|
var pfx = projectRoot + 'modules/';
|
||||||
var first = true;
|
|
||||||
for (i = 0; i < groups.length; i++) {
|
for (i = 0; i < groups.length; i++) {
|
||||||
var group = groups[i];
|
var group = groups[i];
|
||||||
html += (first ? '' : '</span>');
|
|
||||||
html += '<div class="upmGroup"><div class="right-arrow"></div>' + group + '</div><span class="upmModules" style="display:none">';
|
html += '<div class="upmGroup"><div class="right-arrow"></div>' + group + '</div><span class="upmModules" style="display:none">';
|
||||||
var moduleNames = modulesByGroup[group];
|
var moduleNames = modulesByGroup[group];
|
||||||
for (j = 0; j < moduleNames.length; j++) {
|
for (j = 0; j < moduleNames.length; j++) {
|
||||||
var moduleName = moduleNames[j];
|
var moduleName = moduleNames[j];
|
||||||
html += '<a href="' + pfx + moduleName + '.html">' + moduleName + '</a>';
|
html += '<a href="' + pfx + moduleName + '.html">' + moduleName + '</a>';
|
||||||
}
|
}
|
||||||
first = false;
|
html += '</span>';
|
||||||
}
|
}
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
@ -117,7 +115,7 @@ var insertStyles = "Y.one(document.head).append('<style> \
|
|||||||
font-size: 0; \
|
font-size: 0; \
|
||||||
margin-right: 5px; \
|
margin-right: 5px; \
|
||||||
vertical-align: 5px; \
|
vertical-align: 5px; \
|
||||||
display: inline; \
|
float: left \
|
||||||
} \
|
} \
|
||||||
div.down-arrow { \
|
div.down-arrow { \
|
||||||
width: 0; \
|
width: 0; \
|
||||||
@ -127,7 +125,7 @@ var insertStyles = "Y.one(document.head).append('<style> \
|
|||||||
border-top: 5px solid #356de4; \
|
border-top: 5px solid #356de4; \
|
||||||
font-size: 0; \
|
font-size: 0; \
|
||||||
margin-right: 5px; \
|
margin-right: 5px; \
|
||||||
display: inline; \
|
float: left \
|
||||||
} \
|
} \
|
||||||
div.upmGroup { \
|
div.upmGroup { \
|
||||||
font-weight: bold; \
|
font-weight: bold; \
|
||||||
@ -137,7 +135,7 @@ var insertStyles = "Y.one(document.head).append('<style> \
|
|||||||
|
|
||||||
var scripts = "YUI().use('node', 'event', function (Y) {"
|
var scripts = "YUI().use('node', 'event', function (Y) {"
|
||||||
+ onClickHandler
|
+ onClickHandler
|
||||||
+ insertStyles
|
// + insertStyles
|
||||||
+ "});";
|
+ "});";
|
||||||
|
|
||||||
|
|
||||||
|
@ -787,3 +787,28 @@ kbd .cmd { font-family: Monaco, Helvetica; }
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.right-arrow {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-bottom: 5px solid transparent;
|
||||||
|
border-top: 5px solid transparent;
|
||||||
|
border-left: 5px solid #356de4;
|
||||||
|
font-size: 0;
|
||||||
|
margin-right: 5px;
|
||||||
|
float: left
|
||||||
|
}
|
||||||
|
|
||||||
|
div.down-arrow {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-left: 5px solid transparent;
|
||||||
|
border-right: 5px solid transparent;
|
||||||
|
border-top: 5px solid #356de4;
|
||||||
|
font-size: 0;
|
||||||
|
margin-right: 5px;
|
||||||
|
float: left
|
||||||
|
}
|
||||||
|
|
||||||
|
div.upmGroup {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
@ -69,6 +69,8 @@ var xml2js = {
|
|||||||
// CLASSES: {
|
// CLASSES: {
|
||||||
// <class name>: {
|
// <class name>: {
|
||||||
// description: <class description>,
|
// description: <class description>,
|
||||||
|
// parent: <parent class name>,
|
||||||
|
// group: <group name>,
|
||||||
// methods: { ... },
|
// methods: { ... },
|
||||||
// variables: {
|
// variables: {
|
||||||
// <variable name>: {
|
// <variable name>: {
|
||||||
@ -83,7 +85,9 @@ var xml2js = {
|
|||||||
// CLASSGROUPS: {
|
// CLASSGROUPS: {
|
||||||
// <group name>: {
|
// <group name>: {
|
||||||
// description: <group description>,
|
// description: <group description>,
|
||||||
// classes: [ <class name>, ... ]
|
// classes: [ <class name>, ... ],
|
||||||
|
// enums: { ... },
|
||||||
|
// enums_by_group: { ... }
|
||||||
// }, ...
|
// }, ...
|
||||||
// }
|
// }
|
||||||
MODULE: '',
|
MODULE: '',
|
||||||
@ -98,7 +102,8 @@ var xml2js = {
|
|||||||
TYPEMAPS: {
|
TYPEMAPS: {
|
||||||
'^(const)?\\s*(unsigned|signed)?\\s*(int|short|long|float|double|size_t|u?int\\d{1,2}_t)?$': 'Number',
|
'^(const)?\\s*(unsigned|signed)?\\s*(int|short|long|float|double|size_t|u?int\\d{1,2}_t)?$': 'Number',
|
||||||
'^bool$': 'Boolean',
|
'^bool$': 'Boolean',
|
||||||
'^(const)?\\s*(unsigned|signed)?\\s*(char|char\\s*\\*|std::string)$': 'String' // TODO: verify that swig does this mapping
|
'^(const)?\\s*(unsigned|signed)?\\s*(char|char\\s*\\*|std::string)$': 'String', // TODO: verify that swig does this mapping
|
||||||
|
'^void\\s*\\(\\s*\\*\\s*\\)\\s*\\(\\s*void\\s*\\*\\)\\s*$': 'Function'
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
@ -157,13 +162,14 @@ var xml2js = {
|
|||||||
try {
|
try {
|
||||||
var spec_c = xmlparser.parse(xml)[0];
|
var spec_c = xmlparser.parse(xml)[0];
|
||||||
var className = getName(spec_c);
|
var className = getName(spec_c);
|
||||||
xml2js.CLASSES[className] = {
|
_.extend(xml2js.CLASSES[className], {
|
||||||
description: getDescription(spec_c),
|
description: getDescription(spec_c),
|
||||||
|
parent: getParent(spec_c, className),
|
||||||
enums: getEnums(spec_c, false, className),
|
enums: getEnums(spec_c, false, className),
|
||||||
enums_by_group: getEnums(spec_c, true, className),
|
enums_by_group: getEnums(spec_c, true, className),
|
||||||
variables: getVariables(spec_c, className),
|
variables: getVariables(spec_c, className),
|
||||||
methods: getMethods(spec_c, className)
|
methods: getMethods(spec_c, className)
|
||||||
};
|
});
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
console.log(e.toString() + ': class ' + className + ' was not parsed correctly.');
|
console.log(e.toString() + ': class ' + className + ' was not parsed correctly.');
|
||||||
}
|
}
|
||||||
@ -177,15 +183,48 @@ var xml2js = {
|
|||||||
return fs.readFileAsync(xml2js.opts.inputdir + '/' + fn, 'utf8').then(function(xml) {
|
return fs.readFileAsync(xml2js.opts.inputdir + '/' + fn, 'utf8').then(function(xml) {
|
||||||
var spec_c = xmlparser.parse(xml)[0];
|
var spec_c = xmlparser.parse(xml)[0];
|
||||||
if (_.isEmpty(getSubmodules(spec_c))) {
|
if (_.isEmpty(getSubmodules(spec_c))) {
|
||||||
xml2js.CLASSGROUPS[getName(spec_c)] = {
|
var group = getName(spec_c);
|
||||||
|
var classes = getSubclassNames(spec_c);
|
||||||
|
xml2js.CLASSGROUPS[group] = {
|
||||||
description: getDescription(spec_c),
|
description: getDescription(spec_c),
|
||||||
classes: getSubclassNames(spec_c)
|
classes: classes
|
||||||
}
|
};
|
||||||
|
_.each(classes, function(c) {
|
||||||
|
if (_.has(xml2js.CLASSES, c)) {
|
||||||
|
xml2js.CLASSES[c].group = group;
|
||||||
|
} else {
|
||||||
|
console.log('Warning: Group ' + group + ' has unknown class ' + c);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
return Promise.all(parseClasses.concat(parseGroups));
|
return Promise.all(parseClasses.concat(parseGroups));
|
||||||
|
}).then(function() {
|
||||||
|
if (!_.isEmpty(xml2js.CLASSGROUPS)) {
|
||||||
|
// try to categorize ungrouped classes, if any
|
||||||
|
var grouped = _.flatten(_.pluck(_.values(xml2js.CLASSGROUPS), 'classes'));
|
||||||
|
var ungrouped = _.difference(_.keys(xml2js.CLASSES), grouped);
|
||||||
|
_.each(ungrouped, function(c) {
|
||||||
|
_.each(findUsage(c), function(group) {
|
||||||
|
xml2js.CLASSGROUPS[group].classes.push(c);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
grouped = _.flatten(_.pluck(_.values(xml2js.CLASSGROUPS), 'classes'));
|
||||||
|
ungrouped = _.difference(_.keys(xml2js.CLASSES), grouped);
|
||||||
|
// try to categorize ungrouped enums, if any
|
||||||
|
_.each(xml2js.ENUMS_BY_GROUP, function(enumGroupSpec, enumGroupName) {
|
||||||
|
_.each(findUsage(enumGroupName, true), function(c) {
|
||||||
|
xml2js.CLASSES[c].enums_by_group[enumGroupName] = enumGroupSpec;
|
||||||
|
_.each(enumGroupSpec.members, function(enumName) {
|
||||||
|
xml2js.CLASSES[c].enums[enumName] = xml2js.ENUMS[enumName];
|
||||||
|
delete xml2js.ENUMS[enumName];
|
||||||
|
});
|
||||||
|
delete xml2js.ENUMS_BY_GROUP[enumGroupName];
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
if (xml2js.opts.custom && fs.existsSync(xml2js.opts.custom)) {
|
if (xml2js.opts.custom && fs.existsSync(xml2js.opts.custom)) {
|
||||||
return fs.readFileAsync(xml2js.opts.custom, 'utf8').then(function(custom) {
|
return fs.readFileAsync(xml2js.opts.custom, 'utf8').then(function(custom) {
|
||||||
@ -199,9 +238,9 @@ var xml2js = {
|
|||||||
console.log(xml2js.opts.custom ? ('Error: No such customization file exists: ' + xml2js.opts.custom) : 'No customizations given.');
|
console.log(xml2js.opts.custom ? ('Error: No such customization file exists: ' + xml2js.opts.custom) : 'No customizations given.');
|
||||||
}
|
}
|
||||||
}).then(function() {
|
}).then(function() {
|
||||||
|
generateCustomPointerClasses();
|
||||||
validateMethods();
|
validateMethods();
|
||||||
validateVars();
|
validateVars();
|
||||||
generateCustomPointerClasses();
|
|
||||||
return _.pick(xml2js, 'MODULE', 'ENUMS', 'ENUMS_BY_GROUP', 'METHODS', 'CLASSES', 'CLASSGROUPS');
|
return _.pick(xml2js, 'MODULE', 'ENUMS', 'ENUMS_BY_GROUP', 'METHODS', 'CLASSES', 'CLASSGROUPS');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -391,7 +430,30 @@ function generateCustomPointerClasses() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// override autogenerated methods with custom configuration
|
// search for usage of a type
|
||||||
|
function findUsage(type, classOnly) {
|
||||||
|
var filterClasses = function(fn) { return _.without(_.map(xml2js.CLASSES, fn), undefined); };
|
||||||
|
var usesType = function(classSpec, className) {
|
||||||
|
var methodsOfType = (_.find(classSpec.methods, function(methodSpec, methodName) {
|
||||||
|
return ((!_.isEmpty(methodSpec.return) && methodSpec.return.type == type) ||
|
||||||
|
(_.contains(_.pluck(methodSpec.params, 'type'), type)));
|
||||||
|
}) != undefined);
|
||||||
|
var variablesOfType = _.contains(_.pluck(classSpec.variable, 'type'), type);
|
||||||
|
return ((methodsOfType || variablesOfType) ? className : undefined);
|
||||||
|
};
|
||||||
|
var extendsType = function(classSpec, className) {
|
||||||
|
return ((classSpec.parent == type) ? className : undefined);
|
||||||
|
};
|
||||||
|
var classes = _.union(filterClasses(usesType), filterClasses(extendsType));
|
||||||
|
if (classOnly) {
|
||||||
|
return classes;
|
||||||
|
} else {
|
||||||
|
return _.without(_.uniq(_.pluck(_.pick(xml2js.CLASSES, classes), 'group')), undefined);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// override autogenerated methods with custom configuration
|
||||||
function customizeMethods(custom) {
|
function customizeMethods(custom) {
|
||||||
_.each(custom, function(classMethods, className) {
|
_.each(custom, function(classMethods, className) {
|
||||||
_.extend(xml2js.CLASSES[className].methods, _.pick(classMethods, function(methodSpec, methodName) {
|
_.extend(xml2js.CLASSES[className].methods, _.pick(classMethods, function(methodSpec, methodName) {
|
||||||
@ -527,6 +589,19 @@ function getSubmodules(spec_c) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// get parent class, if any
|
||||||
|
function getParent(spec_c, className) {
|
||||||
|
var parent = getChild(spec_c, 'basecompoundref');
|
||||||
|
if (parent) {
|
||||||
|
parent = getText(parent);
|
||||||
|
if (!_.has(xml2js.CLASSES, parent)) {
|
||||||
|
console.log('WARNING: Class ' + className + ' has unknown parent class ' + parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function hasParams(paramsSpec) {
|
function hasParams(paramsSpec) {
|
||||||
return !(_.isEmpty(paramsSpec) ||
|
return !(_.isEmpty(paramsSpec) ||
|
||||||
((_.size(paramsSpec) == 1) && getText(getChild(paramsSpec[0], 'type')) == 'void'));
|
((_.size(paramsSpec) == 1) && getText(getChild(paramsSpec[0], 'type')) == 'void'));
|
||||||
@ -559,6 +634,7 @@ function getMethods(spec_c, parent) {
|
|||||||
if (!_.isEmpty(returnSpec)) {
|
if (!_.isEmpty(returnSpec)) {
|
||||||
retval = getReturn(returnSpec, getReturnDetails(description), methodName, parent);
|
retval = getReturn(returnSpec, getReturnDetails(description), methodName, parent);
|
||||||
}
|
}
|
||||||
|
methodName = getUniqueMethodName(methodName, spec_js, parent);
|
||||||
spec_js[methodName] = {
|
spec_js[methodName] = {
|
||||||
description: methodDescription,
|
description: methodDescription,
|
||||||
params: params,
|
params: params,
|
||||||
@ -575,6 +651,17 @@ function getMethods(spec_c, parent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// get a unique string to represent the name of an overloaded method
|
||||||
|
function getUniqueMethodName(methodName, module, parent) {
|
||||||
|
if (methodName in module) {
|
||||||
|
do {
|
||||||
|
methodName += '!';
|
||||||
|
} while (methodName in module);
|
||||||
|
}
|
||||||
|
return methodName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// get variable specifications for a class
|
// get variable specifications for a class
|
||||||
function getVariables(spec_c, parent) {
|
function getVariables(spec_c, parent) {
|
||||||
var spec_js = {};
|
var spec_js = {};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user