bobflux-gen
Version:
Generator for monkey files in bobflux application.
70 lines (69 loc) • 2.36 kB
JavaScript
;
var ts = require("typescript");
function create(saveCallback) {
return {
accept: function (n) {
return n.kind === ts.SyntaxKind.PropertySignature;
},
visit: function (n) {
var ps = n;
saveCallback({
name: ps.name.getText(),
type: getTypes(ps.type, ps.questionToken)
});
}
};
}
exports.create = create;
function getTypes(type, questionToken) {
var types = getDeclaredTypes(type);
if (!questionToken || types.filter(function (t) { return t.name === 'undefined'; }).length)
return types;
return types.concat([{ name: 'undefined' }]);
}
exports.getTypes = getTypes;
function getDeclaredTypes(type) {
if (type.kind == ts.SyntaxKind.UnionType) {
var unionType = type;
return unionType.types.reduce(function (c, t) { return c.concat(getDeclaredTypes(t)); }, []);
}
else if (type.kind === ts.SyntaxKind.TypeReference) {
var tp = type;
return [{
name: tp.typeName.getText(),
arguments: tp.typeArguments && tp.typeArguments.map(function (tp) { return getDeclaredTypes(tp); })
}];
}
else if (type.kind === ts.SyntaxKind.ArrayType)
return [{
name: type.elementType.getText(),
isArray: true
}];
else if (type.kind === ts.SyntaxKind.TypeLiteral) {
var tlType = type;
if (tlType.members[0].kind === ts.SyntaxKind.IndexSignature) {
var is = tlType.members[0];
if (is.type.kind === ts.SyntaxKind.TypeReference) {
var tr = is.type;
return [{
name: tr.typeName.getText(),
arguments: tr.typeArguments && tr.typeArguments.map(function (tp) { return getDeclaredTypes(tp); }),
indexer: is.parameters[0].getText()
}];
}
else
return [{
name: is.type.getText(),
indexer: is.parameters[0].getText()
}];
}
else
return [{
name: tlType.getText()
}];
}
else
return [{
name: ts.tokenToString(type.kind)
}];
}