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

55 statements  

1# Copyright (c) 2013 Huan Do, http://huan.do 

2 

3import ast 

4 

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() 

12 

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 

19 

20 if name not in frame_containing_decl.declarations: 

21 frame_containing_decl.declarations[name] = \ 

22 self.env.generate_new_decl() 

23 

24 decl = frame_containing_decl.declarations[name] 

25 

26 if decl._conditional is None: 

27 decl._conditional = conditional 

28 else: 

29 decl._conditional &= conditional 

30 

31 def get_new_name(self, name): 

32 decl = self.get_decl(name) 

33 return decl.name if decl else None 

34 

35 def get_decl(self, name): 

36 frame = self._lookup(name) 

37 if frame: 

38 declaration = frame.declarations[name] 

39 return declaration 

40 

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 

49 

50 @property 

51 def unconditional_decls(self): 

52 return [(name, decl) for (name, decl) in self.declarations.items() 

53 if not decl.conditional] 

54 

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)) 

65 

66class ModuleFrame(Frame): 

67 pass 

68 

69class ClassFrame(Frame): 

70 pass 

71 

72class FunctionFrame(Frame): 

73 pass 

74 

75class ComprehensionFrame(Frame): 

76 pass 

77 

78FRAMES = { ast.FunctionDef : FunctionFrame, 

79 ast.Lambda : FunctionFrame, 

80 ast.ClassDef : ClassFrame, 

81 ast.Module : ModuleFrame, 

82 ast.comprehension : ComprehensionFrame, }