@@ -224,44 +224,84 @@ class PythonParser():
def visit_Call(self, node):
name = self.called_node_name(node.func)
- if name and (name.endswith(self.getvars) or name.endswith(self.getvarflags) or name in self.containsfuncs or name in self.containsanyfuncs):
- if isinstance(node.args[0], ast.Constant) and isinstance(node.args[0].value, str):
- varname = node.args[0].value
- if name in self.containsfuncs and isinstance(node.args[1], ast.Constant):
- if varname not in self.contains:
- self.contains[varname] = set()
- self.contains[varname].add(node.args[1].value)
- elif name in self.containsanyfuncs and isinstance(node.args[1], ast.Constant):
- if varname not in self.contains:
- self.contains[varname] = set()
- self.contains[varname].update(node.args[1].value.split())
- elif name.endswith(self.getvarflags):
- if isinstance(node.args[1], ast.Constant):
- self.references.add('%s[%s]' % (varname, node.args[1].value))
+ if sys.version_info[:3] < (3,8,0):
+ if name and (name.endswith(self.getvars) or name.endswith(self.getvarflags) or name in self.containsfuncs or name in self.containsanyfuncs):
+ if isinstance(node.args[0], ast.Str):
+ varname = node.args[0].s
+ if name in self.containsfuncs and isinstance(node.args[1], ast.Str):
+ if varname not in self.contains:
+ self.contains[varname] = set()
+ self.contains[varname].add(node.args[1].s)
+ elif name in self.containsanyfuncs and isinstance(node.args[1], ast.Str):
+ if varname not in self.contains:
+ self.contains[varname] = set()
+ self.contains[varname].update(node.args[1].s.split())
+ elif name.endswith(self.getvarflags):
+ if isinstance(node.args[1], ast.Str):
+ self.references.add('%s[%s]' % (varname, node.args[1].s))
+ else:
+ self.warn(node.func, node.args[1])
else:
- self.warn(node.func, node.args[1])
+ self.references.add(varname)
else:
- self.references.add(varname)
- else:
- self.warn(node.func, node.args[0])
- elif name and name.endswith(".expand"):
- if isinstance(node.args[0], ast.Constant):
- value = node.args[0].value
- d = bb.data.init()
- parser = d.expandWithRefs(value, self.name)
- self.references |= parser.references
- self.execs |= parser.execs
- for varname in parser.contains:
- if varname not in self.contains:
- self.contains[varname] = set()
- self.contains[varname] |= parser.contains[varname]
- elif name in self.execfuncs:
- if isinstance(node.args[0], ast.Constant):
- self.var_execs.add(node.args[0].value)
- else:
- self.warn(node.func, node.args[0])
- elif name and isinstance(node.func, (ast.Name, ast.Attribute)):
- self.execs.add(name)
+ self.warn(node.func, node.args[0])
+ elif name and name.endswith(".expand"):
+ if isinstance(node.args[0], ast.Str):
+ value = node.args[0].s
+ d = bb.data.init()
+ parser = d.expandWithRefs(value, self.name)
+ self.references |= parser.references
+ self.execs |= parser.execs
+ for varname in parser.contains:
+ if varname not in self.contains:
+ self.contains[varname] = set()
+ self.contains[varname] |= parser.contains[varname]
+ elif name in self.execfuncs:
+ if isinstance(node.args[0], ast.Str):
+ self.var_execs.add(node.args[0].s)
+ else:
+ self.warn(node.func, node.args[0])
+ elif name and isinstance(node.func, (ast.Name, ast.Attribute)):
+ self.execs.add(name)
+ else:
+ if name and (name.endswith(self.getvars) or name.endswith(self.getvarflags) or name in self.containsfuncs or name in self.containsanyfuncs):
+ if isinstance(node.args[0], ast.Constant) and isinstance(node.args[0].value, str):
+ varname = node.args[0].value
+ if name in self.containsfuncs and isinstance(node.args[1], ast.Constant):
+ if varname not in self.contains:
+ self.contains[varname] = set()
+ self.contains[varname].add(node.args[1].value)
+ elif name in self.containsanyfuncs and isinstance(node.args[1], ast.Constant):
+ if varname not in self.contains:
+ self.contains[varname] = set()
+ self.contains[varname].update(node.args[1].value.split())
+ elif name.endswith(self.getvarflags):
+ if isinstance(node.args[1], ast.Constant):
+ self.references.add('%s[%s]' % (varname, node.args[1].value))
+ else:
+ self.warn(node.func, node.args[1])
+ else:
+ self.references.add(varname)
+ else:
+ self.warn(node.func, node.args[0])
+ elif name and name.endswith(".expand"):
+ if isinstance(node.args[0], ast.Constant):
+ value = node.args[0].value
+ d = bb.data.init()
+ parser = d.expandWithRefs(value, self.name)
+ self.references |= parser.references
+ self.execs |= parser.execs
+ for varname in parser.contains:
+ if varname not in self.contains:
+ self.contains[varname] = set()
+ self.contains[varname] |= parser.contains[varname]
+ elif name in self.execfuncs:
+ if isinstance(node.args[0], ast.Constant):
+ self.var_execs.add(node.args[0].value)
+ else:
+ self.warn(node.func, node.args[0])
+ elif name and isinstance(node.func, (ast.Name, ast.Attribute)):
+ self.execs.add(name)
def called_node_name(self, node):
"""Given a called node, return its original string form"""