@@ -549,17 +549,40 @@ Parser.prototype.walkExpression = function walkExpression(expression) {
549549 this . walkExpressions ( expression . arguments ) ;
550550 break ;
551551 case "CallExpression" :
552- var callee = this . evaluateExpression ( expression . callee ) ;
553- if ( callee . isIdentifier ( ) ) {
554- var result = this . applyPluginsBailResult ( "call " + callee . identifier , expression ) ;
555- if ( result === true )
556- break ;
557- }
552+ if ( expression . callee . type === "FunctionExpression" && expression . arguments ) {
553+ // (function(...) { }(...))
554+ var args = expression . arguments . map ( function ( arg ) {
555+ var result = this . evaluateExpression ( arg ) ;
556+ if ( ! result . isIdentifier ( ) ) result = undefined ;
557+ if ( ! result ) {
558+ this . walkExpression ( arg ) ;
559+ return ;
560+ }
561+ return result . identifier ;
562+ } , this ) ;
563+ this . inScope ( expression . callee . params . filter ( function ( identifier , idx ) {
564+ return identifier . name !== args [ idx ] ;
565+ } ) , function ( ) {
566+ if ( expression . callee . body . type === "BlockStatement" )
567+ this . walkStatement ( expression . callee . body ) ;
568+ else
569+ this . walkExpression ( expression . callee . body ) ;
570+ } . bind ( this ) ) ;
558571
559- if ( expression . callee )
560- this . walkExpression ( expression . callee ) ;
561- if ( expression . arguments )
562- this . walkExpressions ( expression . arguments ) ;
572+ } else {
573+
574+ var callee = this . evaluateExpression ( expression . callee ) ;
575+ if ( callee . isIdentifier ( ) ) {
576+ var result = this . applyPluginsBailResult ( "call " + callee . identifier , expression ) ;
577+ if ( result === true )
578+ break ;
579+ }
580+
581+ if ( expression . callee )
582+ this . walkExpression ( expression . callee ) ;
583+ if ( expression . arguments )
584+ this . walkExpressions ( expression . arguments ) ;
585+ }
563586 break ;
564587 case "MemberExpression" :
565588 var expr = expression ;
0 commit comments