diff options
author | 2023-10-23 12:46:12 -0400 | |
---|---|---|
committer | 2023-10-27 10:02:38 +0200 | |
commit | f3fb0f7499d44bcf3b3dd37293ed90db69340d3f (patch) | |
tree | e51bfc21ad6c6d1f442b55a98be5dd5e5c32b192 | |
parent | 41008f76b0baee5853c5b7e78d05cbcade8b7a4c (diff) | |
download | bitbake-contrib-f3fb0f7499d44bcf3b3dd37293ed90db69340d3f.tar.gz |
codeparser/utils: clean up more deprecated AST usages
Also introduces bb.utils.ast_node_str_value method to simplify handling
of AST str nodes.
Signed-off-by: Chris Laplante <chris.laplante@agilent.com>
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
-rw-r--r-- | lib/bb/codeparser.py | 22 | ||||
-rw-r--r-- | lib/bb/utils.py | 10 |
2 files changed, 20 insertions, 12 deletions
diff --git a/lib/bb/codeparser.py b/lib/bb/codeparser.py index cd3940943..92ed31fa5 100644 --- a/lib/bb/codeparser.py +++ b/lib/bb/codeparser.py @@ -256,19 +256,18 @@ 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.Str): + if (varname := bb.utils.ast_node_str_value(node.args[0])) is not None: + if name in self.containsfuncs and bb.utils.ast_node_str_value(node.args[1]) is not None: 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): + self.contains[varname].add(node.args[1].value) + elif name in self.containsanyfuncs and bb.utils.ast_node_str_value(node.args[1]) is not None: if varname not in self.contains: self.contains[varname] = set() - self.contains[varname].update(node.args[1].s.split()) + self.contains[varname].update(node.args[1].value.split()) elif name.endswith(self.getvarflags): - if isinstance(node.args[1], ast.Str): - self.references.add('%s[%s]' % (varname, node.args[1].s)) + if bb.utils.ast_node_str_value(node.args[1]) is not None: + self.references.add('%s[%s]' % (varname, node.args[1].value)) else: self.warn(node.func, node.args[1]) else: @@ -276,8 +275,7 @@ class PythonParser(): else: 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 + if (value := bb.utils.ast_node_str_value(node.args[0])) is not None: d = bb.data.init() parser = d.expandWithRefs(value, self.name) self.references |= parser.references @@ -287,8 +285,8 @@ class PythonParser(): 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) + if bb.utils.ast_node_str_value(node.args[0]) is not None: + 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)): diff --git a/lib/bb/utils.py b/lib/bb/utils.py index b401fa5ec..0ac304163 100644 --- a/lib/bb/utils.py +++ b/lib/bb/utils.py @@ -11,6 +11,7 @@ import re, fcntl, os, string, stat, shutil, time import sys import errno import logging +import ast import bb import bb.msg import locale @@ -33,6 +34,7 @@ import random import socket import struct import tempfile +from typing import Optional from subprocess import getstatusoutput from contextlib import contextmanager from ctypes import cdll @@ -1863,3 +1865,11 @@ def lock_timeout(lock): yield held finally: lock.release() + +def ast_node_str_value(node: ast.AST) -> Optional[str]: + """ + Returns node value if it is an `ast.Constant` str; None otherwise + """ + if isinstance(node, ast.Constant) and isinstance(node.value, str): + return node.value + return None |