@@ -84,7 +84,8 @@ def visit_Call(self, node):
8484 # This will not visit Flask in Flask(__name__) but it will visit request in `request.args.get()
8585 if not isinstance (node .func , ast .Name ):
8686 self .visit (node .func )
87- for arg in itertools .chain (node .args , node .keywords ):
87+ for arg_node in itertools .chain (node .args , node .keywords ):
88+ arg = arg_node .value if isinstance (arg_node , ast .keyword ) else arg_node
8889 if isinstance (arg , ast .Call ):
8990 if isinstance (arg .func , ast .Name ):
9091 # We can't just visit because we need to add 'ret_'
@@ -95,12 +96,32 @@ def visit_Call(self, node):
9596 # func.value.id is html
9697 # We want replace
9798 self .result .append ('ret_' + arg .func .attr )
99+ elif isinstance (arg .func , ast .Call ):
100+ self .visit_curried_call_inside_call_args (arg )
98101 else :
99- # Deal with it when we have code that triggers it.
100- raise
102+ raise Exception ('Cannot visit vars of ' + ast .dump (arg ))
101103 else :
102104 self .visit (arg )
103105
106+ def visit_curried_call_inside_call_args (self , inner_call ):
107+ # Curried functions aren't supported really, but we now at least have a defined behaviour.
108+ # In f(g(a)(b)(c)), inner_call is the Call node with argument c
109+ # Try to get the name of curried function g
110+ curried_func = inner_call .func .func
111+ while isinstance (curried_func , ast .Call ):
112+ curried_func = curried_func .func
113+ if isinstance (curried_func , ast .Name ):
114+ self .result .append ('ret_' + curried_func .id )
115+ elif isinstance (curried_func , ast .Attribute ):
116+ self .result .append ('ret_' + curried_func .attr )
117+
118+ # Visit all arguments except a (ignore the curried function g)
119+ not_curried = inner_call
120+ while not_curried .func is not curried_func :
121+ for arg in itertools .chain (not_curried .args , not_curried .keywords ):
122+ self .visit (arg .value if isinstance (arg , ast .keyword ) else arg )
123+ not_curried = not_curried .func
124+
104125 def visit_Attribute (self , node ):
105126 if not isinstance (node .value , ast .Name ):
106127 self .visit (node .value )
0 commit comments