UNPKG

@newos/upgradeability-transpiler

Version:

Transpiles Solidity contracts to updgradable versions compatible with NewOs.

64 lines 3.18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const ast_utils_1 = require("../solc/ast-utils"); const get_var_inits_1 = require("./get-var-inits"); const build_super_calls_for_chain_1 = require("./build-super-calls-for-chain"); function getVarInitsPart(contractNode, source) { return get_var_inits_1.getVarInits(contractNode, source) .map(([vr, , match]) => `\n ${vr.name} ${match[2]};`) .join(''); } function transformConstructor(contractNode, source, contracts, contractsToArtifactsMap) { const superCalls = build_super_calls_for_chain_1.buildSuperCallsForChain(contractNode, source, contracts, contractsToArtifactsMap); const declarationInserts = getVarInitsPart(contractNode, source); const constructorNode = ast_utils_1.getConstructor(contractNode); const isFullyImplemented = contractNode.fullyImplemented; let removeConstructor = null; let constructorBodySource = null; let constructorParameterList = null; let constructorArgsList = null; if (constructorNode) { constructorBodySource = ast_utils_1.stripBraces(ast_utils_1.getNodeSources(constructorNode.body, source)[2]); constructorParameterList = ast_utils_1.stripBraces(ast_utils_1.getNodeSources(constructorNode.parameters, source)[2]); const [start, len] = ast_utils_1.getNodeSources(constructorNode, source); removeConstructor = { start: start, end: start + len, text: '', }; constructorArgsList = constructorNode.parameters.parameters.map(par => par.name).join(','); } constructorParameterList = (constructorParameterList !== null && constructorParameterList !== void 0 ? constructorParameterList : ''); const constructorParameterListWithComma = constructorParameterList ? `, ${constructorParameterList}` : ''; constructorBodySource = (constructorBodySource !== null && constructorBodySource !== void 0 ? constructorBodySource : ''); constructorArgsList = constructorArgsList ? `, ${constructorArgsList}` : ''; const initializeFuncText = isFullyImplemented ? ` function initialize(${constructorParameterList.replace('string memory', 'string calldata')}) external initializer { __init(true${constructorArgsList}); }` : ''; const superCallsBlock = superCalls ? `if(callChain) {${superCalls} }` : ''; const [start, , contractSource] = ast_utils_1.getNodeSources(contractNode, source); const match = /\bcontract[^\{]*{/.exec(contractSource); if (!match) throw new Error(`Can't find contract pattern in ${contractSource}`); return [ removeConstructor, { start: start + match[0].length, end: start + match[0].length, text: `${initializeFuncText}\n function __init(bool callChain${constructorParameterListWithComma}) internal { ${superCallsBlock} ${declarationInserts} ${constructorBodySource} }\n`, }, ].filter(tran => tran !== null); } exports.transformConstructor = transformConstructor; //# sourceMappingURL=transform-constructor.js.map