@solvprotocol/upgrade-safe-transpiler
Version:
Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe.
73 lines • 2.9 kB
JavaScript
;
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