def new_item_from_source(self, source_text): new_code_item = code_model.FileItem(code=source_text) parser_item = transform_model.AstParseItem() new_tree_item = code_model.AstTreeItem( ast.parse(source_text), name=parser_item.name(), parent_link=code_model.CodeTransformLink(new_code_item, parser_item)) self.add_code_item(new_code_item) self.add_code_item(new_tree_item)
def new_item_from_file(self, file_name): with open(file_name, "r") as file_handle: source_text = file_handle.read() new_code_item = code_model.FileItem(code=source_text, file_name=file_name) parser_item = transform_model.AstParseItem() new_tree_item = code_model.AstTreeItem( ast.parse(source_text), name=parser_item.name(), parent_link=code_model.CodeTransformLink( new_code_item, parser_item)) self.add_code_item(new_code_item) self.add_code_item(new_tree_item)
def apply_transform(self, code_item, transform_item): """ transform some kind of code thing into another kind of code thing using some kind of transform thing, update views accordingly """ if isinstance(code_item, ast.AST): code_item = code_model.AstTreeItem(code_item) assert isinstance(code_item, code_model.CodeItem) if transform_item is not None: assert isinstance( transform_item, transform_model.TransformThing), "bad type %s" % transform_item def apply_codegen_transform(ast_root, argument_list): """ Code generates each file in the project """ import ctree.nodes # assert isinstance(ast_root, ctree.nodes.Project), \ # "apply_code_gen root of tree not Project is a %s" % ast_root # TODO: stay more in line with ctree and use ResolveGeneratedPathRefs # transform all files a combined source_text string combined_source = "" from ast_tool_box.transformers.NonCtreeNodeConverter import NonCtreeNodeConverter converter = NonCtreeNodeConverter() ast_root = converter.visit(ast_root) if isinstance(ast_root, ctree.nodes.Project) and ast_root.files and len( ast_root.files) > 0: for f in ast_root.files: combined_source += "File %s\n" % f.name combined_source += f.codegen() return combined_source else: return ast_root.codegen() if isinstance(code_item, code_model.FileItem): self.show_error( "Transformation cannot be applied to source_text code") elif isinstance(code_item, code_model.AstTreeItem): if isinstance(transform_item, transform_model.AstTransformItem): argument_values = [] if transform_item.has_args(): argument_values = self.resolve_transform_args( transform_item) if not argument_values: return for a in argument_values: print("got arg %s" % a) argument_values = [eval(x) for x in argument_values] tree_copy = copy.deepcopy(code_item.ast_tree) new_tree = transform_item.get_instance(argument_values).visit( tree_copy) new_ast_tree_item = code_model.AstTreeItem( new_tree, name=transform_item.name(), parent_link=code_model.CodeTransformLink( code_item=code_item, transform_item=transform_item), ) self.add_code_item(new_ast_tree_item) elif isinstance(transform_item, transform_model.CodeGeneratorItem): # new_code = transform_item.get_instance().visit(code_item.ast_tree) argument_values = [] if transform_item.has_args(): argument_values = self.resolve_transform_args( transform_item) if not argument_values: return for a in argument_values: print("got arg %s" % a) argument_values = [eval(x) for x in argument_values] tree_copy = copy.deepcopy(code_item.ast_tree) new_code = apply_codegen_transform(tree_copy, argument_values) new_code_item = code_model.GeneratedCodeItem( new_code, parent_link=code_model.CodeTransformLink( code_item=code_item, transform_item=transform_item), ) self.add_code_item(new_code_item) elif transform_item is None: new_tree = code_item.ast_tree new_ast_tree_item = code_model.AstTreeItem( new_tree, name="SubTree", parent_link=code_model.CodeTransformLink( code_item=code_item, transform_item=None), ) self.add_code_item(new_ast_tree_item) else: self.show_error("Cannot transform\n%s\n with\n%s" % (code_item, transform_item)) raise Exception() else: self.show_error("Unknown transform of\n%s\n with\n%s" % (code_item, transform_item))