UNPKG

capnpc-ts

Version:

Cap'n Proto schema compiler for TypeScript.

133 lines 7.96 kB
"use strict"; /** * @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