def test_batchable_provider(self) -> None: test = self class ABatchable(BatchableCSTVisitor): METADATA_DEPENDENCIES = (PositionProvider, ) def visit_Pass(self, node: cst.Pass) -> None: test.assertEqual(self.get_metadata(PositionProvider, node), CodeRange((1, 0), (1, 4))) wrapper = MetadataWrapper(parse_module("pass")) wrapper.visit_batched([ABatchable()])
def _visit_cst_rules_with_context( wrapper: MetadataWrapper, rules: Collection[Type[CstLintRule]], context: CstContext ) -> None: # construct the rules with the context rule_instances = [r(context) for r in rules] rule_instances = [r for r in rule_instances if not r.should_skip_file()] # before_visit/after_leave are used to update the context def before_visit(node: cst.CSTNode) -> None: context.node_stack.append(node) def after_leave(node: cst.CSTNode) -> None: context.node_stack.pop() # visit the tree, dispatching to each rule as needed wrapper.visit_batched( rule_instances, before_visit=before_visit, after_leave=after_leave )