prettier-plugin-solidity
Version:
A Prettier Plugin for automatically formatting your Solidity code.
89 lines • 3.59 kB
JavaScript
import { doc } from 'prettier';
import { getNextNonSpaceNonCommentCharacter } from '../common/backward-compatibility.js';
import { printComments, printSeparatedItem, printSeparatedList } from '../common/printer-helpers.js';
const { dedent, group, indent, join, line } = doc.builders;
const functionName = (node, options) => {
if (node.isConstructor && !node.name)
return 'constructor';
if (node.name)
return `function ${node.name}`;
if (node.isReceiveEther)
return 'receive';
// The parser doesn't give us any information about the keyword used for the
// fallback.
// Using the originalText is the next best option.
// A neat idea would be to rely on the pragma and enforce it but for the
// moment this will do.
const names = { fallback: 'fallback', function: 'function' };
const name = options.originalText.slice(options.locStart(node), options.locStart(node) + 8);
return names[name];
};
const parameters = (parametersType, node, path, print, options) => {
var _a, _b;
if (((_a = node[parametersType]) === null || _a === void 0 ? void 0 : _a.length) > 0) {
return printSeparatedList(path.map(print, parametersType), {
grouped: false
});
}
if (((_b = node.comments) === null || _b === void 0 ? void 0 : _b.length) > 0) {
// we add a check to see if the comment is inside the parentheses
const parameterComments = printComments(node, path, options, (comment) => getNextNonSpaceNonCommentCharacter(options.originalText, comment, options.locEnd) === ')');
return parameterComments.length > 0
? printSeparatedItem(parameterComments)
: '';
}
return '';
};
const visibility = (node) => node.visibility && node.visibility !== 'default'
? [line, node.visibility]
: '';
const virtual = (node) => (node.isVirtual ? [line, 'virtual'] : '');
const override = (node, path, print) => {
if (!node.override)
return '';
if (node.override.length === 0)
return [line, 'override'];
return [
line,
'override(',
printSeparatedList(path.map(print, 'override')),
')'
];
};
const stateMutability = (node) => node.stateMutability ? [line, node.stateMutability] : '';
const modifiers = (node, path, print) => node.modifiers.length > 0
? [line, join(line, path.map(print, 'modifiers'))]
: '';
const returnParameters = (node, path, print, options) => node.returnParameters
? [
line,
'returns (',
group(parameters('returnParameters', node, path, print, options)),
')'
]
: '';
const signatureEnd = (node) => (node.body ? dedent(line) : ';');
const body = (node, path, print) => (node.body ? path.call(print, 'body') : '');
export const FunctionDefinition = {
print: ({ node, path, print, options }) => [
group([
functionName(node, options),
'(',
parameters('parameters', node, path, print, options),
')',
indent(group([
// TODO: sort comments for modifiers and return parameters
printComments(node, path, options),
visibility(node),
stateMutability(node),
virtual(node),
override(node, path, print),
modifiers(node, path, print),
returnParameters(node, path, print, options),
signatureEnd(node)
]))
]),
body(node, path, print)
]
};
//# sourceMappingURL=FunctionDefinition.js.map