@@ -63,47 +63,31 @@ export default createRule({
63
63
return false ;
64
64
}
65
65
66
- // Is like Promise, or a class/interface extending from Promise
67
- function isPromiseClassLike ( program :ts . Program , type :ts . Type ) :boolean {
68
- if ( type . isIntersection ( ) ) {
69
- return type . types . some ( t => isPromiseLike ( program , t ) ) ;
70
- }
71
- if ( type . isUnion ( ) ) {
72
- return type . types . every ( t => isPromiseLike ( program , t ) ) ;
73
- }
74
-
75
- const symbol = type . getSymbol ( ) ;
76
- if ( ! symbol ) {
77
- return false ;
78
- }
79
-
80
- if (
81
- symbol . getName ( ) === 'Promise' &&
82
- isSymbolFromDefaultLibrary ( program , symbol )
83
- ) {
84
- return true ;
85
- }
86
-
87
- if ( symbol . flags & ( ts . SymbolFlags . Class | ts . SymbolFlags . Interface ) ) {
88
- const checker = program . getTypeChecker ( ) ;
89
-
90
- for ( const baseType of checker . getBaseTypes ( type as ts . InterfaceType ) ) {
91
- if ( isPromiseLike ( program , baseType ) ) {
92
- return true ;
93
- }
94
- }
95
- }
66
+ function isPromiseLike ( program :ts . Program , type :ts . Type ) :boolean {
67
+ return isBuiltinSymbolLike ( program , type , 'Promise' ) ;
68
+ }
96
69
97
- return false ;
70
+ function isPromiseConstructorLike (
71
+ program :ts . Program ,
72
+ type :ts . Type ,
73
+ ) :boolean {
74
+ return isBuiltinSymbolLike ( program , type , 'PromiseConstructor' ) ;
98
75
}
99
76
100
- // Is like PromiseConstructor, or a class/interface extending from Promise
101
- function isPromiseLike ( program :ts . Program , type :ts . Type ) :boolean {
77
+ function isBuiltinSymbolLike (
78
+ program :ts . Program ,
79
+ type :ts . Type ,
80
+ symbolName :string ,
81
+ ) :boolean {
102
82
if ( type . isIntersection ( ) ) {
103
- return type . types . some ( t => isPromiseLike ( program , t ) ) ;
83
+ return type . types . some ( t =>
84
+ isBuiltinSymbolLike ( program , t , symbolName ) ,
85
+ ) ;
104
86
}
105
87
if ( type . isUnion ( ) ) {
106
- return type . types . every ( t => isPromiseLike ( program , t ) ) ;
88
+ return type . types . every ( t =>
89
+ isBuiltinSymbolLike ( program , t , symbolName ) ,
90
+ ) ;
107
91
}
108
92
109
93
const symbol = type . getSymbol ( ) ;
@@ -112,7 +96,7 @@ export default createRule({
112
96
}
113
97
114
98
if (
115
- symbol . getName ( ) === 'PromiseConstructor' &&
99
+ symbol . getName ( ) === symbolName &&
116
100
isSymbolFromDefaultLibrary ( program , symbol )
117
101
) {
118
102
return true ;
@@ -122,7 +106,7 @@ export default createRule({
122
106
const checker = program . getTypeChecker ( ) ;
123
107
124
108
for ( const baseType of checker . getBaseTypes ( type as ts . InterfaceType ) ) {
125
- if ( isPromiseClassLike ( program , baseType ) ) {
109
+ if ( isBuiltinSymbolLike ( program , baseType , symbolName ) ) {
126
110
return true ;
127
111
}
128
112
}
@@ -151,7 +135,10 @@ export default createRule({
151
135
}
152
136
153
137
const callerType = services . getTypeAtLocation ( callee . object ) ;
154
- if ( ! isPromiseLike ( services . program , callerType ) ) {
138
+ if (
139
+ ! isPromiseConstructorLike ( services . program , callerType ) &&
140
+ ! isPromiseLike ( services . program , callerType )
141
+ ) {
155
142
return ;
156
143
}
157
144