@gnus.ai/upgrade-safe-transpiler-diamond
Version:
Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe using Diamond Pattern (EIP-2535).
67 lines • 2.83 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");
const ast_resolver_1 = require("../ast-resolver");
const find_all_identifiers_1 = require("./utils/find-all-identifiers");
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 (0, find_all_identifiers_1.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, false);
if (!referencedSourceUnit) {
throw new ast_resolver_1.ASTResolverError('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