Coverage for /pythoncovmergedfiles/medio/medio/src/underscore/underscore/frame.py: 98%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# Copyright (c) 2013 Huan Do, http://huan.do
3import ast
5class Frame(object):
6 def __init__(self, node, parent, env):
7 self.parent = parent
8 self.env = env
9 self._node = node
10 self.declarations = {}
11 self.global_declarations = set()
13 def add(self, name, is_global=False, conditional=False):
14 if is_global or name in self.global_declarations:
15 self.global_declarations.add(name)
16 frame_containing_decl = self.env.global_frame
17 else:
18 frame_containing_decl = self
20 if name not in frame_containing_decl.declarations:
21 frame_containing_decl.declarations[name] = \
22 self.env.generate_new_decl()
24 decl = frame_containing_decl.declarations[name]
26 if decl._conditional is None:
27 decl._conditional = conditional
28 else:
29 decl._conditional &= conditional
31 def get_new_name(self, name):
32 decl = self.get_decl(name)
33 return decl.name if decl else None
35 def get_decl(self, name):
36 frame = self._lookup(name)
37 if frame:
38 declaration = frame.declarations[name]
39 return declaration
41 def _lookup(self, name):
42 """Returns the environment that contains the defintion of name."""
43 current_frame = self
44 while current_frame is not None:
45 if name in current_frame.declarations:
46 return current_frame
47 else:
48 current_frame = current_frame.parent
50 @property
51 def unconditional_decls(self):
52 return [(name, decl) for (name, decl) in self.declarations.items()
53 if not decl.conditional]
55 @property
56 def decl_assignment_node(self):
57 if len(self.unconditional_decls):
58 target_elts = []
59 value_elts = []
60 for name, decl in sorted(self.unconditional_decls):
61 target_elts.append(ast.Name(id=name, ctx=ast.Load()))
62 value_elts.append(ast.Name(id=decl.name, ctx=ast.Store()))
63 return ast.Assign(targets=[ast.Tuple(elts=target_elts)],
64 value=ast.Tuple(elts=value_elts))
66class ModuleFrame(Frame):
67 pass
69class ClassFrame(Frame):
70 pass
72class FunctionFrame(Frame):
73 pass
75class ComprehensionFrame(Frame):
76 pass
78FRAMES = { ast.FunctionDef : FunctionFrame,
79 ast.Lambda : FunctionFrame,
80 ast.ClassDef : ClassFrame,
81 ast.Module : ModuleFrame,
82 ast.comprehension : ComprehensionFrame, }