@@ -38,24 +38,35 @@ function isTimedFunction(node) {
3838 )
3939}
4040
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+
4152/**
4253 * Get the root object name from a member expression chain
4354 * @param {MemberExpression } memberExpr
4455 * @returns {string|null }
4556 */
4657function getRootObjectName ( memberExpr ) {
47- let current = memberExpr . object
58+ let current = skipWrapper ( memberExpr . object )
4859
4960 while ( current ) {
5061 switch ( current . type ) {
5162 case 'MemberExpression' : {
52- current = utils . skipChainExpression ( current . object )
63+ current = skipWrapper ( current . object )
5364 break
5465 }
5566 case 'CallExpression' : {
56- const calleeExpr = utils . skipChainExpression ( current . callee )
67+ const calleeExpr = skipWrapper ( current . callee )
5768 if ( calleeExpr . type === 'MemberExpression' ) {
58- current = calleeExpr . object
69+ current = skipWrapper ( calleeExpr . object )
5970 } else if ( calleeExpr . type === 'Identifier' ) {
6071 return calleeExpr . name
6172 } else {
@@ -75,6 +86,22 @@ function getRootObjectName(memberExpr) {
7586 return null
7687}
7788
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+
78105/**
79106 * @param {CallExpression } node
80107 * @param {Set<string> } ignoredObjectNames
@@ -83,15 +110,7 @@ function isPromise(node, ignoredObjectNames) {
83110 const callee = utils . skipChainExpression ( node . callee )
84111 if ( callee . type === 'MemberExpression' ) {
85112 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 ) ) {
95114 return false
96115 }
97116
0 commit comments