3 from lib.utils import Schema, ConfigASTVisitor, SourceLogger
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)
14 self.logger = SourceLogger(self)
19 def __sanitise_decorator(self, node: ast.FunctionDef):
22 for deco in node.decorator_list:
24 if TreeSanitiser.DecoNative == deco:
25 setattr(node, "__builtin", True)
27 elif TreeSanitiser.DecoCall == deco:
29 elif TreeSanitiser.DecoConst == deco:
30 name = f"{deco.value}"
31 elif TreeSanitiser.DecoName == deco:
33 elif TreeSanitiser.DecoNameE == deco:
34 name = f"{ast.unparse(deco)}"
36 self.logger.warn(deco, "invalid modifier type")
41 node.decorator_list = [x for x in deco_map.values()]
43 for desc, rule in self.deco_rules.items():
46 self.logger.warn(node, desc)
48 def _visit_fndef(self, node):
49 self.__sanitise_decorator(node)
50 super()._visit_fndef(node)