diff --git a/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts b/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts index bf282f74d869..7c2a4666aaef 100644 --- a/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts +++ b/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts @@ -32,6 +32,24 @@ export default createRule({ const sourceCode = context.getSourceCode(); const service = getParserServices(context); const checker = service.program.getTypeChecker(); + const compilerOptions = service.program.getCompilerOptions(); + + function requiresQuoting(name: string): boolean { + if (name.length === 0) { + return true; + } + if (!ts.isIdentifierStart(name.charCodeAt(0), compilerOptions.target)) { + return true; + } + + for (let i = 1; i < name.length; i += 1) { + if (!ts.isIdentifierPart(name.charCodeAt(i), compilerOptions.target)) { + return true; + } + } + + return false; + } function getNodeType(node: TSESTree.Node): ts.Type { const tsNode = service.esTreeNodeToTSNodeMap.get(node); @@ -44,7 +62,6 @@ export default createRule({ missingBranchTypes: Array, symbolName?: string, ): TSESLint.RuleFix | null { - const identifierRegex = /^[a-zA-Z_$][0-9a-zA-Z_$]*$/; const lastCase = node.cases.length > 0 ? node.cases[node.cases.length - 1] : null; const caseIndent = lastCase @@ -75,7 +92,7 @@ export default createRule({ if ( symbolName && missingBranchName && - !identifierRegex.test(missingBranchName.toString()) + requiresQuoting(missingBranchName.toString()) ) { caseTest = `${symbolName}['${missingBranchName}']`; }