UNPKG

@calystral/prettier-plugin-solidity

Version:
131 lines (125 loc) 3.41 kB
const extract = require('extract-comments'); // https://prettier.io/docs/en/plugins.html#parsers const parser = require('@solidity-parser/parser'); const tryHug = (node, operators) => { if (node.type === 'BinaryOperation' && operators.includes(node.operator)) return { type: 'TupleExpression', components: [node], isArray: false }; return node; }; function parse(text, parsers, options) { const parsed = parser.parse(text, { loc: true, range: true }); parsed.comments = extract(text); parser.visit(parsed, { ForStatement(ctx) { if (ctx.initExpression) { ctx.initExpression.omitSemicolon = true; } ctx.loopExpression.omitSemicolon = true; }, HexLiteral(ctx) { ctx.value = options.singleQuote ? `hex'${ctx.value.slice(4, -1)}'` : `hex"${ctx.value.slice(4, -1)}"`; }, ElementaryTypeName(ctx) { if (options.explicitTypes === 'always') { if (ctx.name === 'uint') ctx.name = 'uint256'; if (ctx.name === 'int') ctx.name = 'int256'; if (ctx.name === 'byte') ctx.name = 'bytes1'; } else if (options.explicitTypes === 'never') { if (ctx.name === 'uint256') ctx.name = 'uint'; if (ctx.name === 'int256') ctx.name = 'int'; if (ctx.name === 'bytes1') ctx.name = 'byte'; } }, BinaryOperation(ctx) { switch (ctx.operator) { case '+': case '-': ctx.left = tryHug(ctx.left, ['%']); ctx.right = tryHug(ctx.right, ['%']); break; case '*': ctx.left = tryHug(ctx.left, ['/', '%']); break; case '/': ctx.left = tryHug(ctx.left, ['*', '%']); break; case '%': ctx.left = tryHug(ctx.left, ['*', '/', '%']); break; case '**': ctx.left = tryHug(ctx.left, ['**']); break; case '<<': case '>>': ctx.left = tryHug(ctx.left, ['+', '-', '*', '/', '**', '<<', '>>']); ctx.right = tryHug(ctx.right, ['+', '-', '*', '/', '**']); break; case '&': ctx.left = tryHug(ctx.left, ['+', '-', '*', '/', '**', '<<', '>>']); ctx.right = tryHug(ctx.right, ['+', '-', '*', '/', '**', '<<', '>>']); break; case '|': ctx.left = tryHug(ctx.left, [ '+', '-', '*', '/', '**', '<<', '>>', '&', '^' ]); ctx.right = tryHug(ctx.right, [ '+', '-', '*', '/', '**', '<<', '>>', '&', '^' ]); break; case '^': ctx.left = tryHug(ctx.left, [ '+', '-', '*', '/', '**', '<<', '>>', '&' ]); ctx.right = tryHug(ctx.right, [ '+', '-', '*', '/', '**', '<<', '>>', '&' ]); break; case '||': ctx.left = tryHug(ctx.left, ['&&']); ctx.right = tryHug(ctx.right, ['&&']); break; case '&&': default: break; } } }); return parsed; } module.exports = parse;