clean up redundant lines
[lunaix-os.git] / lunaix-os / scripts / build-tools / lcfg2 / rewriter.py
1 import ast
2
3 from lib.utils  import Schema
4 from .lazy       import Lazy
5 from .common     import NodeProperty
6
7 class ConfigNodeASTRewriter(ast.NodeTransformer):
8     Depend = Schema(
9                 ast.Call, 
10                     func=Schema(ast.Name, id='require'),
11                     args=[ast.expr])
12
13     def __init__(self, cfg_node):
14         super().__init__()
15
16         self.__cfg_node = cfg_node
17
18     def __gen_accessor(self, orig):
19         key = Lazy.from_astn(self.__cfg_node, orig)
20         if not key:
21             return self.generic_visit(orig)
22         
23         return ast.Subscript(
24             value=ast.Name("__lzLut__", ctx=ast.Load()),
25             slice=ast.Constant(key),
26             ctx=orig.ctx,
27             lineno=orig.lineno,
28             col_offset=orig.col_offset
29         )
30     
31     def __gen_dependency(self, node):
32         cfgn = self.__cfg_node
33         dep_expr = NodeProperty.Dependency[cfgn]
34         if dep_expr is None:
35             NodeProperty.Dependency[cfgn] = node
36             return
37
38         if not isinstance(dep_expr, ast.expr):
39             raise cfgn.config_error(
40                 f"invalid dependency state: {dep_expr}")
41         
42         dep_expr = ast.BoolOp(ast.And(), [dep_expr, node])
43         NodeProperty.Dependency[cfgn] = dep_expr
44
45     def visit_Attribute(self, node):
46         return self.__gen_accessor(node)
47     
48     def visit_Expr(self, node):
49         val = node.value
50         
51         if ConfigNodeASTRewriter.Depend != val:
52             return self.generic_visit(node)
53         
54         # Process marker functions
55         name = val.func.id
56         if name == "require":
57             self.__gen_dependency(val.args[0])
58         else:
59             return self.generic_visit(node)
60         
61         return None