1""" UsedDefChain build used-define chains analysis for each variable. """
2
3from pythran.passmanager import ModuleAnalysis
4import pythran.metadata as md
5
6import beniget
7
8
9class ExtendedDefUseChains(beniget.DefUseChains):
10
11    def unbound_identifier(self, name, node):
12        # don't warn on unbound identifier
13        pass
14
15    def visit(self, node):
16        # be aware of metadata
17        md.visit(self, node)
18        return super(ExtendedDefUseChains, self).visit(node)
19
20
21class UseDefChains(ModuleAnalysis):
22
23    """
24    Build use-define chains analysis for each variable.
25    """
26
27    def __init__(self):
28        self.result = None
29        super(UseDefChains, self).__init__(DefUseChains)
30
31    def visit_Module(self, node):
32        udc = beniget.UseDefChains(self.def_use_chains)
33        self.result = udc.chains
34
35
36class DefUseChains(ModuleAnalysis):
37
38    """
39    Build define-use-define chains analysis for each variable.
40    """
41
42    def __init__(self):
43        self.result = None
44        super(DefUseChains, self).__init__()
45
46    def visit_Module(self, node):
47        duc = ExtendedDefUseChains()
48        duc.visit(node)
49        self.result = duc
50