Skip to content

Commit

Permalink
Add quick fix for S6326: Regular expressions should not contain multi…
Browse files Browse the repository at this point in the history
…ple spaces (#4096)
  • Loading branch information
yassin-kammoun-sonarsource committed Aug 24, 2023
1 parent f754391 commit 781954d
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 26 deletions.
68 changes: 42 additions & 26 deletions packages/jsts/src/rules/S6326/rule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,38 +19,54 @@
*/
// https://sonarsource.github.io/rspec/#/rspec/S6326/javascript

import { Rule } from 'eslint';
import { AST, Rule } from 'eslint';
import * as regexpp from '@eslint-community/regexpp';
import { createRegExpRule } from '../helpers/regex';
import { createRegExpRule, getRegexpRange } from '../helpers/regex';

export const rule: Rule.RuleModule = createRegExpRule(context => {
let rawPattern: string;
export const rule: Rule.RuleModule = createRegExpRule(
context => {
let rawPattern: string;

return {
onRegExpLiteralEnter: (node: regexpp.AST.RegExpLiteral) => {
rawPattern = node.raw;
},
onCharacterEnter: (node: regexpp.AST.Character) => {
if (node.raw !== ' ' || node.parent.type === 'CharacterClass') {
return;
}
return {
onRegExpLiteralEnter: (node: regexpp.AST.RegExpLiteral) => {
rawPattern = node.raw;
},
onCharacterEnter: (node: regexpp.AST.Character) => {
if (node.raw !== ' ' || node.parent.type === 'CharacterClass') {
return;
}

const nextChar = rawPattern[node.start + 1];
if (nextChar !== ' ') {
const spacesBefore = countSpacesBefore(rawPattern, node.start);
if (spacesBefore > 0) {
const spacesNumber = spacesBefore + 1;
context.reportRegExpNode({
message: `If multiple spaces are required here, use number quantifier ({${spacesNumber}}).`,
regexpNode: node,
offset: [-spacesNumber + 1, 0],
node: context.node,
});
const nextChar = rawPattern[node.start + 1];
if (nextChar !== ' ') {
const spacesBefore = countSpacesBefore(rawPattern, node.start);
if (spacesBefore > 0) {
const spacesNumber = spacesBefore + 1;
const quantifier = `{${spacesNumber}}`;
const [start, end] = getRegexpRange(context.node, node);
const range: AST.Range = [start - spacesNumber + 1, end];
context.reportRegExpNode({
message: `If multiple spaces are required here, use number quantifier (${quantifier}).`,
regexpNode: node,
offset: [-spacesNumber + 1, 0],
node: context.node,
suggest: [
{
desc: `Use quantifier ${quantifier}`,
fix: fixer => fixer.replaceTextRange(range, ` ${quantifier}`),
},
],
});
}
}
}
},
};
},
{
meta: {
hasSuggestions: true,
},
};
});
},
);

function countSpacesBefore(pattern: string, index: number) {
let counter = 0;
Expand Down
6 changes: 6 additions & 0 deletions packages/jsts/src/rules/S6326/unit.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ ruleTester.run('Regex with multiple spaces', rule, {
endLine: 1,
column: 3,
endColumn: 6,
suggestions: [
{
desc: 'Use quantifier {3}',
output: `/a {3}b /`,
},
],
},
],
},
Expand Down

0 comments on commit 781954d

Please sign in to comment.