12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- 'use strict';
- const isSameReference = require('../utils/is-same-reference.js');
- const {getParenthesizedRange} = require('../utils/parentheses.js');
- const {isNumberLiteral} = require('../ast/index.js');
- const isLengthMemberExpression = node =>
- node.type === 'MemberExpression'
- && !node.computed
- && !node.optional
- && node.property.type === 'Identifier'
- && node.property.name === 'length';
- const isLiteralPositiveNumber = node =>
- isNumberLiteral(node)
- && node.value > 0;
- function getNegativeIndexLengthNode(node, objectNode) {
- if (!node) {
- return;
- }
- const {type, operator, left, right} = node;
- if (type !== 'BinaryExpression' || operator !== '-' || !isLiteralPositiveNumber(right)) {
- return;
- }
- if (isLengthMemberExpression(left) && isSameReference(left.object, objectNode)) {
- return left;
- }
- // Nested BinaryExpression
- return getNegativeIndexLengthNode(left, objectNode);
- }
- function removeLengthNode(node, fixer, sourceCode) {
- const [start, end] = getParenthesizedRange(node, sourceCode);
- return fixer.removeRange([
- start,
- end + sourceCode.text.slice(end).match(/\S|$/).index,
- ]);
- }
- module.exports = {
- getNegativeIndexLengthNode,
- removeLengthNode,
- };
|