3 from lib.utils import Schema
5 from .common import NodeProperty
7 class ConfigNodeASTRewriter(ast.NodeTransformer):
10 func=Schema(ast.Name, id='require'),
13 def __init__(self, cfg_node):
16 self.__cfg_node = cfg_node
18 def __gen_accessor(self, orig):
19 key = Lazy.from_astn(self.__cfg_node, orig)
21 return self.generic_visit(orig)
24 value=ast.Name("__lzLut__", ctx=ast.Load()),
25 slice=ast.Constant(key),
28 col_offset=orig.col_offset
31 def __gen_dependency(self, node):
32 cfgn = self.__cfg_node
33 dep_expr = NodeProperty.Dependency[cfgn]
35 NodeProperty.Dependency[cfgn] = node
38 if not isinstance(dep_expr, ast.expr):
39 raise cfgn.config_error(
40 f"invalid dependency state: {dep_expr}")
42 dep_expr = ast.BoolOp(ast.And(), [dep_expr, node])
43 NodeProperty.Dependency[cfgn] = dep_expr
45 def visit_Attribute(self, node):
46 return self.__gen_accessor(node)
48 def visit_Expr(self, node):
51 if ConfigNodeASTRewriter.Depend != val:
52 return self.generic_visit(node)
54 # Process marker functions
57 self.__gen_dependency(val.args[0])
59 return self.generic_visit(node)