def test_apply_transforms(self): ttc = TreeTransformController() ttc.ast_transformer_manager.get_ast_transformers("ctree.transformations") ttc.ast_tree_manager.new_item_from_file("sample.py") new_ast_item = ttc.apply_transform(0, 0) assert_is_instance(new_ast_item, AstTreeItem) assert_equal(new_ast_item, ttc.ast_tree_manager[1]) assert_is_instance(new_ast_item.parent_link, AstLink) assert_equal(new_ast_item.parent_link.parent_ast_tree, ttc.ast_tree_manager[0])
def test_apply_transforms(self): ttc = TreeTransformController() ttc.ast_transformer_manager.get_ast_transformers( "ctree.transformations") ttc.ast_tree_manager.new_item_from_file("sample.py") new_ast_item = ttc.apply_transform(0, 0) assert_is_instance(new_ast_item, AstTreeItem) assert_equal(new_ast_item, ttc.ast_tree_manager[1]) assert_is_instance(new_ast_item.parent_link, AstLink) assert_equal(new_ast_item.parent_link.parent_ast_tree, ttc.ast_tree_manager[0])
def test_load_transforms(self): ttc = TreeTransformController() ttc.ast_transformer_manager.get_ast_transformers( "ctree.transformations") assert_greater(ttc.ast_transformer_manager.count(), 1) assert_is_instance(ttc.ast_transformer_manager[0], AstTransformerItem)
def test_load_ast(self): ttc = TreeTransformController() ttc.ast_tree_manager.new_item_from_file("sample.py") assert_equal(ttc.ast_tree_manager.count(), 1) assert_is_instance(ttc.ast_tree_manager[0], AstTreeItem)
def test_create(self): ttc = TreeTransformController() assert_is_instance(ttc, TreeTransformController) assert_is_instance(ttc.ast_tree_manager, AstTreeManager) assert_is_instance(ttc.ast_transformer_manager, AstTransformerManager)
def __init__(self, file_name=None, mode='exec', packages=None, width=None, height=None): """ Constructor AST browser windows that displays the Abstract Syntax Tree of source_text code. The source_text can be given as text in the source_text parameter, or can be read from a file. The file_name parameter overrides the source_text parameter. The mode argument specifies what kind of code must be compiled; it can be 'exec' if source_text consists of a sequence of statements, 'eval' if it consists of a single expression, or 'single' if it consists of a single interactive statement (in the latter case, expression statements that evaluate to something other than None will be printed). (see http://docs.python.org/2/library/functions.html#compile) """ super(AstToolBox, self).__init__() valid_modes = ['exec', 'eval', 'single'] if mode not in valid_modes: raise ValueError("Mode must be one of: {}".format(valid_modes)) self._mode = 'exec' self.auto_expand_ast = True self.start_packages = packages if packages else [] self.start_packages += [ 'ctree.transformations', 'ctree.c.codegen', 'ctree.ocl.codegen', 'ctree.omp.codegen', ] self.settings = None # Set up the UI self.tree_transform_controller = TreeTransformController() # there is a little trick here so both presenters know about their partner self.code_presenter = CodePresenter( tree_transform_controller=self.tree_transform_controller ) self.transform_presenter = TransformPresenter( tree_transform_controller=self.tree_transform_controller, start_packages=self.start_packages, ) self.code_presenter.set_transform_presenter(self.transform_presenter) self.transform_presenter.set_code_presenter(self.code_presenter) self.code_presenter.new_item_from_file(file_name) self.transform_presenter.load_files(self.start_packages) central_splitter = QtGui.QSplitter(self, orientation=QtCore.Qt.Horizontal) self.setCentralWidget(central_splitter) central_layout = QtGui.QHBoxLayout() central_splitter.setLayout(central_layout) # Create base tree widget central_layout.addWidget(self.code_presenter.code_pane) central_layout.addWidget(self.transform_presenter.transform_pane) # Splitter parameters central_splitter.setCollapsible(0, True) central_splitter.setCollapsible(1, True) central_splitter.setSizes([AstToolBox.default_left_frame_size, 250]) central_splitter.setStretchFactor(0, 0.5) central_splitter.setStretchFactor(1, 0.5) self._setup_menu() self.setWindowTitle('{}'.format(PROGRAM_NAME)) self.read_settings()
def __init__(self, file_name=None, verbose=False): self.verbose = verbose self.controller = TreeTransformController() self.controller.ast_tree_manager.new_item_from_file(file_name) self.controller.ast_transformer_manager.get_ast_transformers("ctree.transformations")
class AstTransformInterpreter(object): def __init__(self, file_name=None, verbose=False): self.verbose = verbose self.controller = TreeTransformController() self.controller.ast_tree_manager.new_item_from_file(file_name) self.controller.ast_transformer_manager.get_ast_transformers("ctree.transformations") def clear(self): """delete all trees and transforms""" self.controller.clear() pass def show_ast(self, index): def show_parents_links(current_ast_item): link = current_ast_item.parent_link if link: show_parents_links(link.parent_ast_tree) print( "derived from item %s transform %s" % (link.parent_ast_tree.name, link.transform_item.name()) ) ast_item = self.controller.ast_tree_manager[index] print("ast[%d]: %s %s" % (index, ast_item.name, ast_item.ast_tree)) show_parents_links(ast_item) def show_asts(self): for index, ast_tree_item in enumerate(self.controller.ast_tree_manager): #print("Ast[%d]: %s" % (index, ast_tree_item)) self.show_ast(index) def delete_ast(self, tree_item): return self.controller.ast_tree_manager.delete(tree_item) def ast_command(self, command): fields = command.split() if len(fields) < 2 or fields[1].startswith("list"): self.show_asts() elif fields[1].startswith("del"): if len(fields) > 2 and self.delete_ast(fields[2]): pass else: print("error: delete command must specify index of tree to delete") elif fields[1].startswith("cle"): self.controller.ast_tree_manager.clear() elif fields[1].startswith("sho"): try: index = int(fields[2]) from ctree.visual.dot_manager import DotManager print("calling open") DotManager.dot_ast_to_browser(self.controller.ast_tree_manager[index].ast_tree, "tree%d.png" % index) except IOError as e: print("ast show requires numeric index of ast, msg %s" % e.message) else: print("unknown ast command") def show_transforms(self): for index, transformer_item in enumerate(self.controller.ast_transformer_manager): print("transform[%d]: %s" % (index, transformer_item.name())) def transform_command(self, command): fields = command.split() if len(fields) < 2 or fields[1].startswith("list"): self.show_transforms() elif fields[1].startswith("cle"): self.controller.ast_transformer_manager.clear() elif fields[1].startswith("load"): if len(fields) > 2: key = fields[2] self.controller.load_transformers(key) else: print("transform load must specify filename") else: print("unknown transform command") def apply_transform(self, command): fields = command.split() if len(fields) > 2: ast_index = self.controller.ast_tree_manager.get_valid_index(fields[1]) transform_index = self.controller.ast_transformer_manager.get_valid_index(fields[2]) name = fields[3] if len(fields) > 3 else "Tree %d" % self.controller.ast_tree_manager.count() print( "ast %s transform %s" % (ast_index, transform_index)) if ast_index is not None and transform_index is not None: self.controller.apply_transform(ast_index, transform_index, name=name) self.show_asts() else: print("apply missing index or index out of range") else: print("apply requires two numeric indices, tree index and transform index") def set_verbose(self, new_value=None): if new_value is None: self.verbose = not self.verbose else: self.verbose = new_value @staticmethod def usage(): print("command must be one of") print("transform [list|delete|load] <arg>") print("ast [list|delete|load] <arg>") print("apply ast_index transform_index") print("quit") print("commands can be abbreviated to first three letters") print("\n") def interactive_mode(self): readline.parse_and_bind('tab: complete') readline.parse_and_bind('set editing-mode vi') while True: # print("Command: ", end="") # user_input = sys.stdin.readline() user_input = raw_input("Command (quit to exit): ") # print("got input %s" % user_input) # if user_input.strip() == '': # user_input = last_input if user_input.startswith('q') or user_input.startswith('Q'): return elif user_input.lower().startswith('cle'): self.clear() elif user_input.lower().startswith('ast'): self.ast_command(user_input) elif user_input.lower().startswith('tra'): self.transform_command(user_input) elif user_input.lower().startswith('app'): self.apply_transform(user_input) elif user_input.lower().startswith('ver'): self.verbose = not self.verbose else: print("unknown command: %s" % user_input)