@@ -214,19 +214,10 @@ class Parser extends Tapable {
214214 }
215215 }
216216 if ( expr . argument . type === "MemberExpression" ) {
217- let expression = expr . argument ;
218- let exprName = [ ] ;
219- while ( expression . type === "MemberExpression" && ! expression . computed ) {
220- exprName . unshift ( this . scope . renames [ "$" + expression . property . name ] || expression . property . name ) ;
221- expression = expression . object ;
222- }
223- if ( expression . type === "Identifier" ) {
224- exprName . unshift ( this . scope . renames [ "$" + expression . name ] || expression . name ) ;
225- if ( this . scope . definitions . indexOf ( name ) === - 1 ) {
226- exprName = exprName . join ( "." ) ;
227- res = this . applyPluginsBailResult1 ( "evaluate typeof " + exprName , expr ) ;
228- if ( res !== undefined ) return res ;
229- }
217+ const exprName = this . getNameForExpression ( expr . argument ) ;
218+ if ( exprName && exprName . free ) {
219+ res = this . applyPluginsBailResult1 ( "evaluate typeof " + exprName . name , expr ) ;
220+ if ( res !== undefined ) return res ;
230221 }
231222 }
232223 if ( expr . argument . type === "FunctionExpression" ) {
@@ -275,24 +266,14 @@ class Parser extends Tapable {
275266 }
276267 } ) ;
277268 this . plugin ( "evaluate MemberExpression" , function ( expression ) {
278- let expr = expression ;
279- let exprName = [ ] ;
280- while ( expr . type === "MemberExpression" && expr . property . type === ( expr . computed ? "Literal" : "Identifier" ) ) {
281- exprName . unshift ( expr . property . name || expr . property . value ) ;
282- expr = expr . object ;
283- }
284- if ( expr . type === "Identifier" ) {
285- const name = this . scope . renames [ "$" + expr . name ] || expr . name ;
286- if ( this . scope . definitions . indexOf ( name ) === - 1 ) {
287- exprName . unshift ( name ) ;
288- exprName = exprName . join ( "." ) ;
289- if ( this . scope . definitions . indexOf ( expr . name ) === - 1 ) {
290- const result = this . applyPluginsBailResult1 ( "evaluate Identifier " + exprName , expression ) ;
291- if ( result ) return result ;
292- return new BasicEvaluatedExpression ( ) . setIdentifier ( exprName ) . setRange ( expression . range ) ;
293- } else {
294- return this . applyPluginsBailResult1 ( "evaluate defined Identifier " + exprName , expression ) ;
295- }
269+ let exprName = this . getNameForExpression ( expression ) ;
270+ if ( exprName ) {
271+ if ( exprName . free ) {
272+ const result = this . applyPluginsBailResult1 ( "evaluate Identifier " + exprName . name , expression ) ;
273+ if ( result ) return result ;
274+ return new BasicEvaluatedExpression ( ) . setIdentifier ( exprName . name ) . setRange ( expression . range ) ;
275+ } else {
276+ return this . applyPluginsBailResult1 ( "evaluate defined Identifier " + exprName . name , expression ) ;
296277 }
297278 }
298279 } ) ;
@@ -970,16 +951,9 @@ class Parser extends Tapable {
970951
971952 walkUnaryExpression ( expression ) {
972953 if ( expression . operator === "typeof" ) {
973- let expr = expression . argument ;
974- let exprName = [ ] ;
975- while ( expr . type === "MemberExpression" && expr . property . type === ( expr . computed ? "Literal" : "Identifier" ) ) {
976- exprName . unshift ( expr . property . name || expr . property . value ) ;
977- expr = expr . object ;
978- }
979- if ( expr . type === "Identifier" && this . scope . definitions . indexOf ( expr . name ) === - 1 ) {
980- exprName . unshift ( this . scope . renames [ "$" + expr . name ] || expr . name ) ;
981- exprName = exprName . join ( "." ) ;
982- const result = this . applyPluginsBailResult1 ( "typeof " + exprName , expression ) ;
954+ const exprName = this . getNameForExpression ( expression . argument ) ;
955+ if ( exprName && exprName . free ) {
956+ const result = this . applyPluginsBailResult1 ( "typeof " + exprName . name , expression ) ;
983957 if ( result === true )
984958 return ;
985959 }
@@ -1144,24 +1118,12 @@ class Parser extends Tapable {
11441118 }
11451119
11461120 walkMemberExpression ( expression ) {
1147- let expr = expression ;
1148- let exprName = [ ] ;
1149- while ( expr . type === "MemberExpression" && expr . property . type === ( expr . computed ? "Literal" : "Identifier" ) ) {
1150- exprName . unshift ( expr . property . name || expr . property . value ) ;
1151- expr = expr . object ;
1152- }
1153- if ( ( expr . type === "Identifier" && this . scope . definitions . indexOf ( expr . name ) === - 1 ) ||
1154- ( expr . type === "ThisExpression" && this . scope . renames . $this ) ) {
1155- if ( expr . type === "ThisExpression" ) {
1156- exprName . unshift ( this . scope . renames . $this ) ;
1157- } else {
1158- exprName . unshift ( this . scope . renames [ "$" + expr . name ] || expr . name ) ;
1159- }
1160- let result = this . applyPluginsBailResult1 ( "expression " + exprName . join ( "." ) , expression ) ;
1121+ const exprName = this . getNameForExpression ( expression ) ;
1122+ if ( exprName && exprName . free ) {
1123+ let result = this . applyPluginsBailResult1 ( "expression " + exprName . name , expression ) ;
11611124 if ( result === true )
11621125 return ;
1163- exprName [ exprName . length - 1 ] = "*" ;
1164- result = this . applyPluginsBailResult1 ( "expression " + exprName . join ( "." ) , expression ) ;
1126+ result = this . applyPluginsBailResult1 ( "expression " + exprName . nameGeneral , expression ) ;
11651127 if ( result === true )
11661128 return ;
11671129 }
@@ -1430,6 +1392,38 @@ class Parser extends Tapable {
14301392 return options . reduce ( ( o , i ) => Object . assign ( o , i ) , { } ) ;
14311393 }
14321394
1395+ getNameForExpression ( expression ) {
1396+ let expr = expression ;
1397+ const exprName = [ ] ;
1398+ while ( expr . type === "MemberExpression" && expr . property . type === ( expr . computed ? "Literal" : "Identifier" ) ) {
1399+ exprName . push ( expr . computed ? expr . property . value : expr . property . name ) ;
1400+ expr = expr . object ;
1401+ }
1402+ let free ;
1403+ if ( expr . type === "Identifier" ) {
1404+ free = this . scope . definitions . indexOf ( expr . name ) === - 1 ;
1405+ exprName . push ( this . scope . renames [ "$" + expr . name ] || expr . name ) ;
1406+ } else if ( expr . type === "ThisExpression" && this . scope . renames . $this ) {
1407+ free = true ;
1408+ exprName . push ( this . scope . renames . $this ) ;
1409+ } else if ( expr . type === "ThisExpression" ) {
1410+ free = false ;
1411+ exprName . push ( "this" ) ;
1412+ } else {
1413+ return null ;
1414+ }
1415+ let prefix = "" ;
1416+ for ( let i = exprName . length - 1 ; i >= 1 ; i -- )
1417+ prefix += exprName [ i ] + "." ;
1418+ const name = prefix + exprName [ 0 ] ;
1419+ const nameGeneral = prefix + "*" ;
1420+ return {
1421+ name,
1422+ nameGeneral,
1423+ free
1424+ } ;
1425+ }
1426+
14331427}
14341428
14351429Parser . ECMA_VERSION = ECMA_VERSION ;
0 commit comments