@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
78 lines (76 loc) • 13 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const constants = tslib_1.__importStar(require("../../constants"));
const NodeCompiler_1 = require("../NodeCompiler");
class SwitchStatementCompiler extends NodeCompiler_1.NodeCompiler {
constructor() {
super(...arguments);
this.kind = typescript_1.default.SyntaxKind.SwitchStatement;
}
visitNode(sb, node, optionsIn) {
const options = sb.pushValueOptions(optionsIn);
sb.withProgramCounter((pc) => {
const switchExpr = ts_utils_1.tsUtils.expression.getExpression(node);
const switchExprType = sb.context.analysis.getType(switchExpr);
const breakOptions = sb.breakPCOptions(sb.noPushValueOptions(options), pc.getLast());
const caseBlock = ts_utils_1.tsUtils.statement.getCaseBlock(node);
const clauses = ts_utils_1.tsUtils.statement.getClauses(caseBlock);
const { found: defaultFound, statements: defaultClauseStatements } = clauses.reduce((acc, clause) => {
const { found, statements } = acc;
if (found) {
return {
found,
statements: statements.concat(ts_utils_1.tsUtils.statement.getStatements(clause)),
};
}
if (typescript_1.default.isDefaultClause(clause)) {
return { found: true, statements: ts_utils_1.tsUtils.statement.getStatements(clause) };
}
return { found: false, statements };
}, { found: false, statements: [] });
const matched = sb.scope.addUnique();
const val = sb.scope.addUnique();
sb.visit(switchExpr, options);
sb.scope.set(sb, node, options, val);
sb.emitPushBoolean(switchExpr, false);
sb.scope.set(sb, node, options, matched);
clauses.forEach((clause) => {
if (typescript_1.default.isDefaultClause(clause)) {
return;
}
sb.emitHelper(clause, options, sb.helpers.if({
condition: () => {
const expr = ts_utils_1.tsUtils.expression.getExpression(clause);
sb.scope.get(sb, node, options, val);
sb.visit(expr, options);
sb.emitHelper(expr, options, sb.helpers.equalsEqualsEquals({
leftType: switchExprType,
rightType: sb.context.analysis.getType(expr),
}));
sb.scope.get(sb, node, options, matched);
sb.emitOp(node, 'BOOLOR');
},
whenTrue: () => {
sb.emitPushBoolean(node, true);
sb.scope.set(sb, node, options, matched);
ts_utils_1.tsUtils.statement.getStatements(clause).forEach((statement) => {
sb.visit(statement, breakOptions);
});
},
}));
});
if (defaultFound) {
defaultClauseStatements.forEach((statement) => {
sb.visit(statement, breakOptions);
});
}
sb.emitPushInt(node, constants.BREAK_COMPLETION);
});
sb.emitOp(node, 'DROP');
}
}
exports.SwitchStatementCompiler = SwitchStatementCompiler;
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlN3aXRjaFN0YXRlbWVudENvbXBpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGdEQUE0QztBQUM1QyxvRUFBNEI7QUFDNUIsbUVBQTZDO0FBQzdDLGtEQUErQztBQVMvQyxNQUFhLHVCQUF3QixTQUFRLDJCQUFnQztJQUE3RTs7UUFDa0IsU0FBSSxHQUFHLG9CQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztJQWtHdkQsQ0FBQztJQWhHUSxTQUFTLENBQUMsRUFBaUIsRUFBRSxJQUF3QixFQUFFLFNBQXVCO1FBQ25GLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMvQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtZQUMzQixNQUFNLFVBQVUsR0FBRyxrQkFBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUQsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRS9ELE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBRXJGLE1BQU0sU0FBUyxHQUFHLGtCQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2RCxNQUFNLE9BQU8sR0FBRyxrQkFBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEQsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FDakYsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ2QsTUFBTSxFQUFFLEtBQUssRUFB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QVMsRUFBRSxFQUFFOzRCQUM1RCxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFDcEMsQ0FBQyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztpQkFDRixDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO29CQUM1QyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztnQkFDcEMsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUVELEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBR0gsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNGO0FBbkdELDBEQW1HQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL3N0YXRlbWVudC9Td2l0Y2hTdGF0ZW1lbnRDb21waWxlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5vZGVDb21waWxlciB9IGZyb20gJy4uL05vZGVDb21waWxlcic7XG5pbXBvcnQgeyBTY3JpcHRCdWlsZGVyIH0gZnJvbSAnLi4vc2InO1xuaW1wb3J0IHsgVmlzaXRPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbnRlcmZhY2UgRGVmYXVsdEFjY3VtIHtcbiAgcmVhZG9ubHkgZm91bmQ6IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0YXRlbWVudHM6IFJlYWRvbmx5QXJyYXk8dHMuU3RhdGVtZW50Pjtcbn1cblxuZXhwb3J0IGNsYXNzIFN3aXRjaFN0YXRlbWVudENvbXBpbGVyIGV4dGVuZHMgTm9kZUNvbXBpbGVyPHRzLlN3aXRjaFN0YXRlbWVudD4ge1xuICBwdWJsaWMgcmVhZG9ubHkga2luZCA9IHRzLlN5bnRheEtpbmQuU3dpdGNoU3RhdGVtZW50O1xuXG4gIHB1YmxpYyB2aXNpdE5vZGUoc2I6IFNjcmlwdEJ1aWxkZXIsIG5vZGU6IHRzLlN3aXRjaFN0YXRlbWVudCwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuICAgIHNiLndpdGhQcm9ncmFtQ291bnRlcigocGMpID0+IHtcbiAgICAgIGNvbnN0IHN3aXRjaEV4cHIgPSB0c1V0aWxzLmV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbihub2RlKTtcbiAgICAgIGNvbnN0IHN3aXRjaEV4cHJUeXBlID0gc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKHN3aXRjaEV4cHIpO1xuXG4gICAgICBjb25zdCBicmVha09wdGlvbnMgPSBzYi5icmVha1BDT3B0aW9ucyhzYi5ub1B1c2hWYWx1ZU9wdGlvbnMob3B0aW9ucyksIHBjLmdldExhc3QoKSk7XG5cbiAgICAgIGNvbnN0IGNhc2VCbG9jayA9IHRzVXRpbHMuc3RhdGVtZW50LmdldENhc2VCbG9jayhub2RlKTtcbiAgICAgIGNvbnN0IGNsYXVzZXMgPSB0c1V0aWxzLnN0YXRlbWVudC5nZXRDbGF1c2VzKGNhc2VCbG9jayk7XG4gICAgICBjb25zdCB7IGZvdW5kOiBkZWZhdWx0Rm91bmQsIHN0YXRlbWVudHM6IGRlZmF1bHRDbGF1c2VTdGF0ZW1lbnRzIH0gPSBjbGF1c2VzLnJlZHVjZTxEZWZhdWx0QWNjdW0+KFxuICAgICAgICAoYWNjLCBjbGF1c2UpID0+IHtcbiAgICAgICAgICBjb25zdCB7IGZvdW5kLCBzdGF0ZW1lbnRzIH0gPSBhY2M7XG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBmb3VuZCxcbiAgICAgICAgICAgICAgc3RhdGVtZW50czogc3RhdGVtZW50cy5jb25jYXQodHNVdGlscy5zdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cyhjbGF1c2UpKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRzLmlzRGVmYXVsdENsYXVzZShjbGF1c2UpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBmb3VuZDogdHJ1ZSwgc3RhdGVtZW50czogdHNVdGlscy5zdGF0ZW1lbnQuZ2V0U3RhdGVtZW50cyhjbGF1c2UpIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHsgZm91bmQ6IGZhbHNlLCBzdGF0ZW1lbnRzIH07XG4gICAgICAgIH0sXG4gICAgICAgIHsgZm91bmQ6IGZhbHNlLCBzdGF0ZW1lbnRzOiBbXSB9LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbWF0Y2hlZCA9IHNiLnNjb3BlLmFkZFVuaXF1ZSgpO1xuICAgICAgY29uc3QgdmFsID0gc2Iuc2NvcGUuYWRkVW5pcXVlKCk7XG5cbiAgICAgIC8vIFt2YWxdXG4gICAgICBzYi52aXNpdChzd2l0Y2hFeHByLCBvcHRpb25zKTtcbiAgICAgIC8vIFtdXG4gICAgICBzYi5zY29wZS5zZXQoc2IsIG5vZGUsIG9wdGlvbnMsIHZhbCk7XG4gICAgICAvLyBbbWF0Y2hlZF1cbiAgICAgIHNiLmVtaXRQdXNoQm9vbGVhbihzd2l0Y2hFeHByLCBmYWxzZSk7XG4gICAgICAvLyBbXVxuICAgICAgc2Iuc2NvcGUuc2V0KHNiLCBub2RlLCBvcHRpb25zLCBtYXRjaGVkKTtcbiAgICAgIC8vIFtdXG4gICAgICBjbGF1c2VzLmZvckVhY2goKGNsYXVzZSkgPT4ge1xuICAgICAgICBpZiAodHMuaXNEZWZhdWx0Q2xhdXNlKGNsYXVzZSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgIGNsYXVzZSxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIHNiLmhlbHBlcnMuaWYoe1xuICAgICAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGV4cHIgPSB0c1V0aWxzLmV4cHJlc3Npb24uZ2V0RXhwcmVzc2lvbihjbGF1c2UpO1xuICAgICAgICAgICAgICAvLyBbdmFsXVxuICAgICAgICAgICAgICBzYi5zY29wZS5nZXQoc2IsIG5vZGUsIG9wdGlvbnMsIHZhbCk7XG4gICAgICAgICAgICAgIC8vIFtjbGF1c2VWYWwsIHZhbF1cbiAgICAgICAgICAgICAgc2IudmlzaXQoZXhwciwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIC8vIFtib29sZWFuXVxuICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgICAgICAgICAgIGV4cHIsXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICBzYi5oZWxwZXJzLmVxdWFsc0VxdWFsc0VxdWFscyh7XG4gICAgICAgICAgICAgICAgICBsZWZ0VHlwZTogc3dpdGNoRXhwclR5cGUsXG4gICAgICAgICAgICAgICAgICByaWdodFR5cGU6IHNiLmNvbnRleHQuYW5hbHlzaXMuZ2V0VHlwZShleHByKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gW2Jvb2xlYW4sIGJvb2xlYW5dXG4gICAgICAgICAgICAgIHNiLnNjb3BlLmdldChzYiwgbm9kZSwgb3B0aW9ucywgbWF0Y2hlZCk7XG4gICAgICAgICAgICAgIC8vIFtib29sZWFuXVxuICAgICAgICAgICAgICBzYi5lbWl0T3Aobm9kZSwgJ0JPT0xPUicpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIFt0cnVlXVxuICAgICAgICAgICAgICBzYi5lbWl0UHVzaEJvb2xlYW4obm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICAgIHNiLnNjb3BlLnNldChzYiwgbm9kZSwgb3B0aW9ucywgbWF0Y2hlZCk7XG4gICAgICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgICAgIHRzVXRpbHMuc3RhdGVtZW50LmdldFN0YXRlbWVudHMoY2xhdXNlKS5mb3JFYWNoKChzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBzYi52aXNpdChzdGF0ZW1lbnQsIGJyZWFrT3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVmYXVsdEZvdW5kKSB7XG4gICAgICAgIGRlZmF1bHRDbGF1c2VTdGF0ZW1lbnRzLmZvckVhY2goKHN0YXRlbWVudCkgPT4ge1xuICAgICAgICAgIHNiLnZpc2l0KHN0YXRlbWVudCwgYnJlYWtPcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHNiLmVtaXRQdXNoSW50KG5vZGUsIGNvbnN0YW50cy5CUkVBS19DT01QTEVUSU9OKTtcbiAgICB9KTtcblxuICAgIC8vIFtdXG4gICAgc2IuZW1pdE9wKG5vZGUsICdEUk9QJyk7XG4gIH1cbn1cbiJdfQ==