Rewrite the lunabuild toolchain with enhanced feature (#60)
[lunaix-os.git] / lunaix-os / scripts / build-tools / lcfg2 / sanitiser.py
1 import ast
2
3 from lib.utils import Schema, ConfigASTVisitor, SourceLogger
4
5 class TreeSanitiser(ConfigASTVisitor):
6     DecoNative = Schema(ast.Name, id="native")
7     DecoName   = Schema(ast.Name)
8     DecoNameE  = Schema(ast.NamedExpr)
9     DecoCall   = Schema(ast.Call)
10     DecoConst  = Schema(ast.Constant)
11
12     def __init__(self):
13         super().__init__()
14         self.logger = SourceLogger(self)
15
16         # TODO
17         self.deco_rules = {}
18
19     def __sanitise_decorator(self, node: ast.FunctionDef):
20         deco_map = {}
21
22         for deco in node.decorator_list:
23             name = ""
24             if TreeSanitiser.DecoNative == deco:
25                 setattr(node, "__builtin", True)
26                 continue
27             elif TreeSanitiser.DecoCall == deco:
28                 name = deco.func
29             elif TreeSanitiser.DecoConst == deco:
30                 name = f"{deco.value}"
31             elif TreeSanitiser.DecoName == deco:
32                 name = f"{deco.id}"
33             elif TreeSanitiser.DecoNameE == deco:
34                 name = f"{ast.unparse(deco)}"
35             else:
36                 self.logger.warn(deco, "invalid modifier type")
37                 continue
38
39             deco_map[name] = deco
40
41         node.decorator_list = [x for x in deco_map.values()]
42         
43         for desc, rule in self.deco_rules.items():
44             if rule(deco_map):
45                 continue
46             self.logger.warn(node, desc)
47
48     def _visit_fndef(self, node):
49         self.__sanitise_decorator(node)
50         super()._visit_fndef(node)