def process(self, ast):
        self._scope_linker.process(ast)

        id_collector = IdentifierClassifier.IdentifierCollector()
        classified_id_group = id_collector.collect_identifiers(ast)
        dec_id_nodes = classified_id_group.statically_declared_identifiers
        ref_id_nodes = classified_id_group.statically_referencing_identifiers

        # Attach a parent_scope accessor to the scope tree
        ReferenceReachabilityTester.TwoWayScopeReferenceAttacher.attach(
            self._scope_linker.scope_tree)

        # Reset REFERENCED_FLAG to False
        for dec_id_node in dec_id_nodes:
            dec_id_node[REFERENCED_FLAG] = False

        for ref_id_node in ref_id_nodes:
            is_reachable = self.check_reachability(ref_id_node)
            ref_id_node[REACHABILITY_FLAG] = is_reachable
Esempio n. 2
0
    def test_bucket(self):
        ast = self.create_ast(Fixtures['LOOP_VAR'])
        collector = IdentifierClassifier.IdentifierCollector()

        bucket = collector.collect_identifiers(ast)

        declaring_id_values = [
            id_node['value']
            for id_node in bucket['static_declaring_identifiers']
        ]

        referencing_id_values = [
            id_node['value']
            for id_node in bucket['static_referencing_identifiers']
        ]

        expected_declaring_id_values = ['implicit_global_loop_var']
        expected_referencing_id_values = ['g:array']

        self.assertEqual(expected_declaring_id_values, declaring_id_values)
        self.assertEqual(expected_referencing_id_values, referencing_id_values)