capnpc-ts
Version:
Cap'n Proto schema compiler for TypeScript.
133 lines • 7.96 kB
JavaScript
;
/**
* @author jdiaz5513
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.createValueExpression = exports.createUnionConstProperty = exports.createNestedNodeProperty = exports.createMethod = exports.createExpressionBlock = exports.createConstProperty = exports.createConcreteListProperty = exports.createClassExtends = void 0;
const tslib_1 = require("tslib");
const s = tslib_1.__importStar(require("capnp-ts/src/std/schema.capnp.js"));
const capnp = tslib_1.__importStar(require("capnp-ts"));
const util_1 = require("capnp-ts/src/util");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const debug_1 = tslib_1.__importDefault(require("debug"));
const constants_1 = require("./constants");
const E = tslib_1.__importStar(require("./errors"));
const file_1 = require("./file");
const util = tslib_1.__importStar(require("./util"));
const trace = debug_1.default("capnpc:ast-creators");
function createClassExtends(identifierText) {
const types = [typescript_1.default.createExpressionWithTypeArguments([], typescript_1.default.createIdentifier(identifierText))];
return typescript_1.default.createHeritageClause(typescript_1.default.SyntaxKind.ExtendsKeyword, types);
}
exports.createClassExtends = createClassExtends;
function createConcreteListProperty(ctx, field) {
const name = `_${util.c2t(field.getName())}`;
const type = typescript_1.default.createTypeReferenceNode(file_1.getJsType(ctx, field.getSlot().getType(), true), constants_1.__);
let u;
return typescript_1.default.createProperty(constants_1.__, [constants_1.STATIC], name, constants_1.__, type, u);
}
exports.createConcreteListProperty = createConcreteListProperty;
function createConstProperty(node) {
const name = util.c2s(file_1.getDisplayNamePrefix(node));
const initializer = createValueExpression(node.getConst().getValue());
return typescript_1.default.createProperty(constants_1.__, [constants_1.STATIC, constants_1.READONLY], name, constants_1.__, constants_1.__, initializer);
}
exports.createConstProperty = createConstProperty;
function createExpressionBlock(expressions, returns, allowSingleLine) {
const statements = expressions.map((e, i) => i === expressions.length - 1 && returns ? typescript_1.default.createReturn(e) : typescript_1.default.createStatement(e));
return typescript_1.default.createBlock(statements, !(allowSingleLine && expressions.length < 2));
}
exports.createExpressionBlock = createExpressionBlock;
function createMethod(name, parameters, type, expressions, allowSingleLine = true) {
return typescript_1.default.createMethod(constants_1.__, constants_1.__, constants_1.__, name, constants_1.__, constants_1.__, parameters, type, createExpressionBlock(expressions, type !== constants_1.VOID_TYPE, allowSingleLine));
}
exports.createMethod = createMethod;
function createNestedNodeProperty(node) {
const name = file_1.getDisplayNamePrefix(node);
const initializer = typescript_1.default.createIdentifier(file_1.getFullClassName(node));
return typescript_1.default.createProperty(constants_1.__, [constants_1.STATIC, constants_1.READONLY], name, constants_1.__, constants_1.__, initializer);
}
exports.createNestedNodeProperty = createNestedNodeProperty;
function createUnionConstProperty(fullClassName, field) {
const name = util.c2s(field.getName());
const initializer = typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier(`${fullClassName}_Which`), name);
return typescript_1.default.createProperty(constants_1.__, [constants_1.STATIC, constants_1.READONLY], name, constants_1.__, constants_1.__, initializer);
}
exports.createUnionConstProperty = createUnionConstProperty;
function createValueExpression(value) {
trace("createValueExpression(%s)", value);
let p;
switch (value.which()) {
case s.Value.BOOL:
return value.getBool() ? typescript_1.default.createTrue() : typescript_1.default.createFalse();
case s.Value.ENUM:
return typescript_1.default.createNumericLiteral(value.getEnum().toString());
case s.Value.FLOAT32:
return typescript_1.default.createNumericLiteral(value.getFloat32().toString());
case s.Value.FLOAT64:
return typescript_1.default.createNumericLiteral(value.getFloat64().toString());
case s.Value.INT16:
return typescript_1.default.createNumericLiteral(value.getInt16().toString());
case s.Value.INT32:
return typescript_1.default.createNumericLiteral(value.getInt32().toString());
case s.Value.INT64: {
const int64 = value.getInt64();
const int64Bytes = [];
for (let i = 0; i < 8; i++) {
int64Bytes.push(`0x${util_1.pad(int64.buffer[i].toString(16), 2)}`);
}
const int64ByteArray = typescript_1.default.createArrayLiteral(int64Bytes.map(typescript_1.default.createNumericLiteral), false);
const int64ArrayBuffer = typescript_1.default.createNew(typescript_1.default.createIdentifier("Uint8Array"), constants_1.__, [int64ByteArray]);
return typescript_1.default.createNew(typescript_1.default.createIdentifier("capnp.Int64"), constants_1.__, [int64ArrayBuffer]);
}
case s.Value.INT8:
return typescript_1.default.createNumericLiteral(value.getInt8().toString());
case s.Value.TEXT:
return typescript_1.default.createLiteral(value.getText());
case s.Value.UINT16:
return typescript_1.default.createNumericLiteral(value.getUint16().toString());
case s.Value.UINT32:
return typescript_1.default.createNumericLiteral(value.getUint32().toString());
case s.Value.UINT64: {
const uint64 = value.getUint64();
const uint64Bytes = [];
for (let i = 0; i < 8; i++) {
uint64Bytes.push(`0x${util_1.pad(uint64.buffer[i].toString(16), 2)}`);
}
const uint64ByteArray = typescript_1.default.createArrayLiteral(uint64Bytes.map(typescript_1.default.createNumericLiteral), false);
const uint64ArrayBuffer = typescript_1.default.createNew(typescript_1.default.createIdentifier("Uint8Array"), constants_1.__, [uint64ByteArray]);
return typescript_1.default.createNew(typescript_1.default.createIdentifier("capnp.Int64"), constants_1.__, [uint64ArrayBuffer]);
}
case s.Value.UINT8:
return typescript_1.default.createNumericLiteral(value.getUint8().toString());
case s.Value.VOID:
return typescript_1.default.createIdentifier("undefined");
case s.Value.ANY_POINTER:
p = value.getAnyPointer();
break;
case s.Value.DATA:
p = value.getData();
break;
case s.Value.LIST:
p = value.getList();
break;
case s.Value.STRUCT:
p = value.getStruct();
break;
case s.Value.INTERFACE:
default:
throw new Error(util_1.format(E.GEN_SERIALIZE_UNKNOWN_VALUE, s.Value_Which[value.which()]));
}
const m = new capnp.Message();
m.setRoot(p);
const buf = new Uint8Array(m.toPackedArrayBuffer());
const bytes = new Array(buf.byteLength);
for (let i = 0; i < buf.byteLength; i++) {
bytes[i] = typescript_1.default.createNumericLiteral(`0x${util_1.pad(buf[i].toString(16), 2)}`);
}
return typescript_1.default.createCall(typescript_1.default.createPropertyAccess(constants_1.CAPNP, "readRawPointer"), constants_1.__, [
typescript_1.default.createPropertyAccess(typescript_1.default.createNew(typescript_1.default.createIdentifier("Uint8Array"), constants_1.__, [typescript_1.default.createArrayLiteral(bytes, false)]), "buffer"),
]);
}
exports.createValueExpression = createValueExpression;
//# sourceMappingURL=ast-creators.js.map