"use strict"
const { getSourceCode } = require("eslint-compat-utils")
const { defineRegExpHandler } = require("../util/define-regexp-handler")
module.exports = {
meta: {
docs: {
description: "disallow RegExp duplicate named capturing groups.",
category: "ES2025",
recommended: false,
url: "http://eslint-community.github.io/eslint-plugin-es-x/rules/no-regexp-duplicate-named-capturing-groups.html",
},
fixable: null,
messages: {
forbidden:
"ES2025 RegExp duplicate named capturing groups are forbidden.",
},
schema: [],
type: "problem",
},
create(context) {
return defineRegExpHandler(context, (node) => {
const found = new Map()
return {
onPatternEnter() {
found.clear()
},
onCapturingGroupLeave(start, end, name) {
if (!name) {
return
}
const list = found.get(name)
if (list) {
list.push({ start, end })
} else {
found.set(name, [{ start, end }])
}
},
onExit() {
for (const [, dupe] of found.values()) {
if (!dupe) {
continue
}
const { start, end } = dupe
const sourceCode = getSourceCode(context)
context.report({
node,
loc:
node.type === "Literal"
? {
start: sourceCode.getLocFromIndex(
node.range[0] +
1 /* slash */ +
start,
),
end: sourceCode.getLocFromIndex(
node.range[0] +
1 /* slash */ +
end,
),
}
: null,
messageId: "forbidden",
})
}
},
}
})
},
}