Skip to content

Commit c547e5e

Browse files
Fix crash when used with TypeScript (#379)
Co-authored-by: Michael Schmidt <[email protected]>
1 parent da53314 commit c547e5e

File tree

4 files changed

+29
-12
lines changed

4 files changed

+29
-12
lines changed

lib/rules/prefer-result-array-groups.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ export default createRule("prefer-result-array-groups", {
146146
return "unknown"
147147
}
148148
const tsNode = tsNodeMap.get(node)
149-
const tsType = (tsNode && checker.getTypeAtLocation(tsNode)) || null
149+
const tsType =
150+
(tsNode && checker?.getTypeAtLocation(tsNode)) || null
150151
if (!tsType) {
151152
// The node type cannot be determined.
152153
return "unknown"

lib/utils/ts-utils/index.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,24 @@ type TypeScript = typeof import("typescript")
88
*/
99
export function getTypeScriptTools(context: Rule.RuleContext): {
1010
tsNodeMap: ReadonlyMap<unknown, TS.Node>
11-
checker: TS.TypeChecker
11+
checker: TS.TypeChecker | null
1212
usedTS: boolean
1313
hasFullTypeInformation: boolean
1414
} {
1515
const ts = getTypeScript()
16-
const tsNodeMap: ReadonlyMap<unknown, TS.Node> =
16+
const tsNodeMap: ReadonlyMap<unknown, TS.Node> | undefined =
1717
context.parserServices.esTreeNodeToTSNodeMap
18-
const checker: TS.TypeChecker =
19-
context.parserServices.program &&
20-
context.parserServices.program.getTypeChecker()
21-
const usedTS = Boolean(ts && tsNodeMap && checker)
18+
const usedTS = Boolean(ts && tsNodeMap)
2219
const hasFullTypeInformation =
2320
usedTS && context.parserServices.hasFullTypeInformation !== false
21+
const checker: TS.TypeChecker | null =
22+
(hasFullTypeInformation &&
23+
context.parserServices.program &&
24+
context.parserServices.program.getTypeChecker()) ||
25+
null
2426

2527
return {
26-
tsNodeMap,
28+
tsNodeMap: tsNodeMap || new Map(),
2729
checker,
2830
usedTS,
2931
hasFullTypeInformation,

lib/utils/type-tracker/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ export function createTypeTracker(context: Rule.RuleContext): TypeTracker {
513513
*/
514514
function getTypeByTs(node: ES.Expression): TypeInfo | null {
515515
const tsNode = tsNodeMap.get(node)
516-
const tsType = (tsNode && checker.getTypeAtLocation(tsNode)) || null
516+
const tsType = (tsNode && checker?.getTypeAtLocation(tsNode)) || null
517517
return tsType && getTypeFromTsType(tsType)
518518
}
519519

@@ -575,7 +575,7 @@ export function createTypeTracker(context: Rule.RuleContext): TypeTracker {
575575
if (isObject(tsType)) {
576576
return UNKNOWN_OBJECT
577577
}
578-
return checker.typeToString(tsType) as TypeInfo
578+
return checker ? (checker.typeToString(tsType) as TypeInfo) : null
579579
}
580580

581581
/**
@@ -590,7 +590,7 @@ export function createTypeTracker(context: Rule.RuleContext): TypeTracker {
590590
ts.isTypeParameterDeclaration(declaration) &&
591591
declaration.constraint != null
592592
) {
593-
return checker.getTypeFromTypeNode(declaration.constraint)
593+
return checker?.getTypeFromTypeNode(declaration.constraint)
594594
}
595595
return undefined
596596
}

tests/lib/rules/no-legacy-features.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,21 @@ const STATIC_PROPERTIES: string[] = [
3232
const PROTOTYPE_METHODS: string[] = ["compile"]
3333

3434
tester.run("no-legacy-features", rule as any, {
35-
valid: [`RegExp`, `new RegExp()`, `RegExp.unknown`],
35+
valid: [
36+
`RegExp`,
37+
`new RegExp()`,
38+
`RegExp.unknown`,
39+
{
40+
// https://github.com/ota-meshi/eslint-plugin-regexp/issues/378
41+
filename: "loglevel.d.ts",
42+
code: `
43+
import log from 'loglevel';
44+
export as namespace log;
45+
export = log;
46+
`,
47+
parser: require.resolve("@typescript-eslint/parser"),
48+
},
49+
],
3650
invalid: [
3751
...STATIC_PROPERTIES.map((sp) => {
3852
return {

0 commit comments

Comments
 (0)