@maniascript/mslint
Version:
ManiaScript linter
43 lines (42 loc) • 1.57 kB
JavaScript
import {} from '../linter/rule.js';
import { IntegerLiteral, UnaryExpression, UnaryOperator } from '@maniascript/parser';
export const noIntegerOverflow = {
meta: {
id: 'no-integer-overflow',
description: 'Forbid integer literal overflow',
recommended: true
},
create(context) {
let isNegative = false;
let unaryNode = null;
return {
'UnaryExpression:enter': (node) => {
if (node instanceof UnaryExpression &&
node.operator === UnaryOperator['-'] &&
node.argument instanceof IntegerLiteral) {
isNegative = true;
unaryNode = node;
}
},
'UnaryExpression:exit': () => {
isNegative = false;
unaryNode = null;
},
'IntegerLiteral:exit': (node) => {
if (node instanceof IntegerLiteral) {
if (isNegative && node.value > 2147483648) {
if (unaryNode != null) {
context.report(unaryNode, 'This integer will overflow');
}
else {
context.report(node, 'This integer will overflow');
}
}
else if (!isNegative && node.value > 2147483647) {
context.report(node, 'This integer will overflow');
}
}
}
};
}
};