@@ -30,14 +30,14 @@ func isPromiseCallback(node *ast.Node) bool {
3030 return isThenOrCatchCall (parent )
3131}
3232
33- // walkIdentifiers calls fn for each identifier name found anywhere in node's
33+ // walkIdentifiers calls fn for each identifier node found anywhere in node's
3434// subtree, stopping early across the whole traversal if fn returns true.
35- func walkIdentifiers (node * ast.Node , fn func (name string ) bool ) bool {
35+ func walkIdentifiers (node * ast.Node , fn func (identNode * ast. Node ) bool ) bool {
3636 if node == nil {
3737 return false
3838 }
3939 if node .Kind == ast .KindIdentifier {
40- return fn (node . AsIdentifier (). Text )
40+ return fn (node )
4141 }
4242 found := false
4343 node .ForEachChild (func (child * ast.Node ) bool {
@@ -61,18 +61,52 @@ func argsContainRef(callNode *ast.Node, fn *ast.Node) bool {
6161 return false
6262 }
6363 body := fn .Body ()
64+ boundary := fn
65+ if body != nil {
66+ boundary = body
67+ }
6468 for _ , arg := range args .Nodes {
6569 found := false
66- walkIdentifiers (arg , func (name string ) bool {
67- if utils .HasShadowingParameter (fn , name ) {
68- found = true
69- return true
70+ walkIdentifiers (arg , func (identNode * ast.Node ) bool {
71+ if utils .IsNonReferenceIdentifier (identNode ) {
72+ return false
73+ }
74+
75+ name := identNode .AsIdentifier ().Text
76+
77+ if name == "arguments" {
78+ if utils .IsNameShadowedBetween (identNode , boundary , name ) {
79+ return false
80+ }
81+ isArgumentsShadowed := false
82+ for curr := identNode .Parent ; curr != nil && curr != fn ; curr = curr .Parent {
83+ if ast .IsFunctionLikeDeclaration (curr ) && curr .Kind != ast .KindArrowFunction {
84+ isArgumentsShadowed = true
85+ break
86+ }
87+ }
88+ if isArgumentsShadowed {
89+ return false
90+ }
91+ if fn .Kind != ast .KindArrowFunction {
92+ found = true
93+ return true
94+ }
95+ return false
96+ }
97+
98+ hasParam := utils .HasShadowingParameter (fn , name )
99+ hasDecl := body != nil && (utils .HasShadowingDeclaration (body , name ) || utils .HasHoistedVarDeclaration (body , name ))
100+ if ! hasParam && ! hasDecl {
101+ return false
70102 }
71- if body != nil && ( utils . HasShadowingDeclaration ( body , name ) || utils . HasHoistedVarDeclaration ( body , name )) {
72- found = true
73- return true
103+
104+ if utils . IsNameShadowedBetween ( identNode , boundary , name ) {
105+ return false
74106 }
75- return false
107+
108+ found = true
109+ return true
76110 })
77111 if found {
78112 return true
0 commit comments