UNPKG

@solvprotocol/upgrade-safe-transpiler

Version:

Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe.

73 lines 2.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.renameIdentifiers = void 0; const utils_1 = require("solidity-ast/utils"); const ast_utils_1 = require("../solc/ast-utils"); const rename_1 = require("../rename"); function* findAllIdentifiers(node) { const seen = new Set(); for (const id of (0, utils_1.findAll)(['UserDefinedTypeName', 'IdentifierPath', 'Identifier'], node)) { if ('pathNode' in id && id.pathNode !== undefined) { seen.add(id.pathNode); } if (!seen.has(id)) { yield id; } } } function* renameIdentifiers(sourceUnit, { resolver }) { var _a; const candidates = getTransitiveRenameCandidates(sourceUnit, resolver); const rename = new Set(Object.keys(candidates).filter(name => resolver.resolveContract(candidates[name]))); for (const ident of findAllIdentifiers(sourceUnit)) { const ref = ident.referencedDeclaration; const contract = ref != null ? resolver.resolveContract(ref) : undefined; const identName = 'pathNode' in ident ? (_a = ident.pathNode) === null || _a === void 0 ? void 0 : _a.name : ident.name; if (identName === undefined) { throw new Error('Unrecognized AST'); } if (contract && rename.has(contract.name)) { yield { kind: 'rename-identifiers', text: (0, rename_1.renameContract)(identName), ...(0, ast_utils_1.getNodeBounds)(ident), }; } else if (identName.includes('.')) { const [ns] = identName.split('.', 1); if (rename.has(ns)) { yield { kind: 'rename-identifiers', transform: s => s.replace(ns, (0, rename_1.renameContract)(ns)), ...(0, ast_utils_1.getNodeBounds)(ident), }; } } } } exports.renameIdentifiers = renameIdentifiers; function getTransitiveRenameCandidates(sourceUnit, resolver) { const ex = {}; for (const sym in sourceUnit.exportedSymbols) { const ids = sourceUnit.exportedSymbols[sym]; if (ids) { ex[sym] = ids[0]; } } for (const imp of (0, utils_1.findAll)('ImportDirective', sourceUnit)) { const referencedSourceUnit = resolver.resolveNode('SourceUnit', imp.sourceUnit); const subexports = getTransitiveRenameCandidates(referencedSourceUnit, resolver); if (imp.symbolAliases.length === 0) { Object.assign(ex, subexports); } else { for (const { foreign, local } of imp.symbolAliases) { if (local == null || foreign.name === local) { ex[foreign.name] = subexports[foreign.name]; } } } } return ex; } //# sourceMappingURL=rename-identifiers.js.map