Skip to content

Commit b4510d4

Browse files
Use assertNever (#607)
* Use `assertNever` * lint
1 parent f95ecd1 commit b4510d4

9 files changed

+35
-25
lines changed

lib/rules/no-dupe-disjunctions.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import type { NestedAlternative } from "../utils/partial-parser"
4141
import { PartialParser } from "../utils/partial-parser"
4242
import type { Rule } from "eslint"
4343
import { getAllowedCharRanges, inRange } from "../utils/char-ranges"
44+
import { assertNever } from "../utils/util"
4445

4546
type ParentNode = Group | CapturingGroup | Pattern | LookaroundAssertion
4647

@@ -393,7 +394,7 @@ function getPartialSubsetRelation(
393394
return SubsetRelation.leftSupersetOfRight
394395

395396
default:
396-
throw new Error(relation)
397+
return assertNever(relation)
397398
}
398399
}
399400
if (rightIsPartial && !leftIsPartial) {
@@ -406,7 +407,7 @@ function getPartialSubsetRelation(
406407
return SubsetRelation.none
407408

408409
default:
409-
throw new Error(relation)
410+
return assertNever(relation)
410411
}
411412
}
412413

@@ -696,7 +697,7 @@ function* findDuplicationNfa(
696697
}
697698

698699
default:
699-
throw new Error(relation)
700+
throw assertNever(relation)
700701
}
701702
}
702703

@@ -823,10 +824,6 @@ function deduplicateResults(
823824
})
824825
}
825826

826-
function assertNever(value: never): never {
827-
throw new Error(`Invalid value: ${value}`)
828-
}
829-
830827
function mentionNested(nested: NestedAlternative): string {
831828
if (nested.type === "Alternative") {
832829
return mention(nested)
@@ -1338,7 +1335,7 @@ export default createRule("no-dupe-disjunctions", {
13381335
break
13391336

13401337
default:
1341-
throw new Error(result)
1338+
throw assertNever(result)
13421339
}
13431340
}
13441341

lib/rules/no-misleading-capturing-group.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,9 @@ import { canSimplifyQuantifier } from "../utils/regexp-ast/simplify-quantifier"
2525
import { fixSimplifyQuantifier } from "../utils/fix-simplify-quantifier"
2626
import { joinEnglishList, mention } from "../utils/mention"
2727
import { getParser } from "../utils/regexp-ast"
28+
import { assertNever } from "../utils/util"
2829
import { CharSet } from "refa"
2930

30-
function assertNever(value: never): never {
31-
throw new Error(`Invalid value: ${value}`)
32-
}
33-
3431
/**
3532
* Returns an iterator that goes through all elements in the given array in
3633
* reverse order.

lib/rules/no-useless-assertions.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
FirstConsumedChars,
2626
} from "regexp-ast-analysis"
2727
import { mention } from "../utils/mention"
28+
import { assertNever } from "../utils/util"
2829

2930
/**
3031
* Combines 2 look chars such that the result is equivalent to 2 adjacent
@@ -414,6 +415,7 @@ export default createRule("no-useless-assertions", {
414415
verifyLookaround(assertion, getFirstCharAfterFn)
415416
break
416417
default:
418+
throw assertNever(assertion)
417419
}
418420
}
419421

lib/rules/optimal-quantifier-concatenation.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import type { CharSet } from "refa"
2626
import { joinEnglishList, mention } from "../utils/mention"
2727
import { canSimplifyQuantifier } from "../utils/regexp-ast/simplify-quantifier"
2828
import { fixSimplifyQuantifier } from "../utils/fix-simplify-quantifier"
29+
import { assertNever } from "../utils/util"
2930

3031
/**
3132
* Returns whether the given node is or contains a capturing group.
@@ -75,6 +76,7 @@ function getSingleConsumedChar(
7576
case "Character":
7677
case "CharacterSet":
7778
case "CharacterClass":
79+
case "ExpressionCharacterClass":
7880
return {
7981
// FIXME: TS Error
8082
// @ts-expect-error -- FIXME
@@ -94,8 +96,13 @@ function getSingleConsumedChar(
9496
}
9597
}
9698

97-
default:
99+
case "Assertion":
100+
case "Backreference":
101+
case "Quantifier":
98102
return empty
103+
104+
default:
105+
return assertNever(element)
99106
}
100107
}
101108

@@ -140,9 +147,14 @@ function isGroupOrCharacter(element: Element): element is GroupOrCharacter {
140147
case "Character":
141148
case "CharacterClass":
142149
case "CharacterSet":
150+
case "ExpressionCharacterClass":
143151
return true
144-
default:
152+
case "Assertion":
153+
case "Backreference":
154+
case "Quantifier":
145155
return false
156+
default:
157+
return assertNever(element)
146158
}
147159
}
148160

lib/rules/prefer-character-class.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
getMatchingDirection,
2323
} from "regexp-ast-analysis"
2424
import type { Position, SourceLocation } from "estree"
25+
import { assertNever } from "../utils/util"
2526

2627
/**
2728
* Find the first index of an element that satisfies the given condition.
@@ -126,7 +127,7 @@ function elementsToCharacterClass(elements: CharElementArray): string {
126127
default:
127128
// FIXME: TS Error
128129
// @ts-expect-error -- FIXME
129-
throw new Error(e)
130+
throw assertNever(e)
130131
}
131132
})
132133

@@ -397,7 +398,7 @@ function getParentPrefixAndSuffix(
397398
return ["", ""]
398399

399400
default:
400-
throw new Error(parent)
401+
return assertNever(parent)
401402
}
402403
}
403404

lib/utils/partial-parser.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,10 @@ import type {
77
} from "refa"
88
import { JS } from "refa"
99
import type { AST } from "@eslint-community/regexpp"
10+
import { assertNever } from "./util"
1011

1112
export type NestedAlternative = AST.Alternative | AST.CharacterClassElement
1213

13-
function assertNever(value: never): never {
14-
throw new Error(`Invalid value: ${value}`)
15-
}
16-
1714
class Context {
1815
public readonly ancestors: ReadonlySet<AST.Node>
1916

lib/utils/regexp-ast/case-variation.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
Element,
1616
Pattern,
1717
} from "@eslint-community/regexpp/ast"
18+
import { assertNever } from "../util"
1819

1920
const ignoreCaseFlagsCache = new WeakMap<ReadonlyFlags, ReadonlyFlags>()
2021
const caseSensitiveFlagsCache = new WeakMap<ReadonlyFlags, ReadonlyFlags>()
@@ -103,7 +104,7 @@ export function isCaseVariant(
103104
}
104105

105106
default:
106-
throw new Error(`Unknown type: ${e}`)
107+
return assertNever(e)
107108
}
108109
}
109110

lib/utils/regexp-ast/simplify-quantifier.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import type {
1616
QuantifiableElement,
1717
Quantifier,
1818
} from "@eslint-community/regexpp/ast"
19+
import { assertNever } from "../util"
1920

2021
/**
2122
* Wraps the given function to be cached by a `WeakMap`.
@@ -339,10 +340,6 @@ function removeTargetQuantifier(
339340
return result
340341
}
341342

342-
function assertNever(value: never): never {
343-
throw new Error(`Invalid value: ${value}`)
344-
}
345-
346343
/**
347344
* Returns an iterator that goes through all elements in the given array in
348345
* reverse order.

lib/utils/util.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/**
2+
* Throws if the function is called. This is useful for ensuring that a switch statement is exhaustive.
3+
*/
4+
export function assertNever(value: never): never {
5+
throw new Error(`Invalid value: ${value}`)
6+
}

0 commit comments

Comments
 (0)