コード例 #1
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])
コード例 #2
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])
コード例 #3
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)
コード例 #4
0
    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)
コード例 #5
0
    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)
コード例 #6
0
ファイル: main.py プロジェクト: ucb-sejits/ast_tool_box
    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()
コード例 #7
0
ファイル: shell.py プロジェクト: ucb-sejits/ast_tool_box
 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")
コード例 #8
0
ファイル: shell.py プロジェクト: ucb-sejits/ast_tool_box
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)