@@ -38,24 +38,35 @@ function isTimedFunction(node) {
38
38
)
39
39
}
40
40
41
+ /**
42
+ * @param {* } node
43
+ * @returns {* }
44
+ */
45
+ function skipWrapper ( node ) {
46
+ while ( node && node . expression ) {
47
+ node = node . expression
48
+ }
49
+ return node
50
+ }
51
+
41
52
/**
42
53
* Get the root object name from a member expression chain
43
54
* @param {MemberExpression } memberExpr
44
55
* @returns {string|null }
45
56
*/
46
57
function getRootObjectName ( memberExpr ) {
47
- let current = memberExpr . object
58
+ let current = skipWrapper ( memberExpr . object )
48
59
49
60
while ( current ) {
50
61
switch ( current . type ) {
51
62
case 'MemberExpression' : {
52
- current = utils . skipChainExpression ( current . object )
63
+ current = skipWrapper ( current . object )
53
64
break
54
65
}
55
66
case 'CallExpression' : {
56
- const calleeExpr = utils . skipChainExpression ( current . callee )
67
+ const calleeExpr = skipWrapper ( current . callee )
57
68
if ( calleeExpr . type === 'MemberExpression' ) {
58
- current = calleeExpr . object
69
+ current = skipWrapper ( calleeExpr . object )
59
70
} else if ( calleeExpr . type === 'Identifier' ) {
60
71
return calleeExpr . name
61
72
} else {
@@ -75,6 +86,22 @@ function getRootObjectName(memberExpr) {
75
86
return null
76
87
}
77
88
89
+ /**
90
+ * @param {string } name
91
+ * @param {* } callee
92
+ * @returns {boolean }
93
+ */
94
+ function isPromiseMethod ( name , callee ) {
95
+ return (
96
+ // hello.PROMISE_FUNCTION()
97
+ PROMISE_FUNCTIONS . has ( name ) ||
98
+ // Promise.PROMISE_METHOD()
99
+ ( callee . object . type === 'Identifier' &&
100
+ callee . object . name === 'Promise' &&
101
+ PROMISE_METHODS . has ( name ) )
102
+ )
103
+ }
104
+
78
105
/**
79
106
* @param {CallExpression } node
80
107
* @param {Set<string> } ignoredObjectNames
@@ -83,15 +110,7 @@ function isPromise(node, ignoredObjectNames) {
83
110
const callee = utils . skipChainExpression ( node . callee )
84
111
if ( callee . type === 'MemberExpression' ) {
85
112
const name = utils . getStaticPropertyName ( callee )
86
- if (
87
- ! name ||
88
- ( ! PROMISE_FUNCTIONS . has ( name ) &&
89
- ! (
90
- callee . object . type === 'Identifier' &&
91
- callee . object . name === 'Promise' &&
92
- PROMISE_METHODS . has ( name )
93
- ) )
94
- ) {
113
+ if ( ! name || ! isPromiseMethod ( name , callee ) ) {
95
114
return false
96
115
}
97
116
0 commit comments