Example #1
0
    def _load_expression(self, filename, text_range):
        with open(filename, "rb") as fp:
            whole_source = fp.read()

        root = ast_utils.parse_source(whole_source, filename)
        main_node = ast_utils.find_expression(root, text_range)

        source = ast_utils.extract_text_range(whole_source, text_range)
        logging.debug("EV.load_exp: %s", (text_range, main_node, source))

        self._clear_expression()

        self.insert("1.0", source)

        # create node marks
        def _create_index(lineno, col_offset):
            local_lineno = lineno - main_node.lineno + 1
            if lineno == main_node.lineno:
                local_col_offset = col_offset - main_node.col_offset
            else:
                local_col_offset = col_offset

            return str(local_lineno) + "." + str(local_col_offset)

        for node in ast.walk(main_node):
            if "lineno" in node._attributes:
                index1 = _create_index(node.lineno, node.col_offset)
                index2 = _create_index(node.end_lineno, node.end_col_offset)

                start_mark = self._get_mark_name(node.lineno, node.col_offset)
                if not start_mark in self.mark_names():
                    self.mark_set(start_mark, index1)
                    # print("Creating mark", start_mark, index1)
                    self.mark_gravity(start_mark, tk.LEFT)

                end_mark = self._get_mark_name(node.end_lineno,
                                               node.end_col_offset)
                if not end_mark in self.mark_names():
                    self.mark_set(end_mark, index2)
                    # print("Creating mark", end_mark, index2)
                    self.mark_gravity(end_mark, tk.RIGHT)
Example #2
0
    def _load_expression(self, filename, text_range):
        whole_source, _ = misc_utils.read_python_file(filename)
        root = ast_utils.parse_source(whole_source, filename)
        self._main_range = text_range
        assert self._main_range is not None
        main_node = ast_utils.find_expression(root, text_range)
        
        source = ast_utils.extract_text_range(whole_source, text_range)
        debug("EV.load_exp: %s", (text_range, main_node, source))
        
        self.delete("1.0", "end")
        self.insert("1.0", source)
        
        # create node marks
        def _create_index(lineno, col_offset):
            local_lineno = lineno - main_node.lineno + 1
            if lineno == main_node.lineno:
                local_col_offset = col_offset - main_node.col_offset
            else:
                local_col_offset = col_offset
                
            return str(local_lineno) + "." + str(local_col_offset)

        for node in ast.walk(main_node):
            if "lineno" in node._attributes:
                index1 = _create_index(node.lineno, node.col_offset)
                index2 = _create_index(node.end_lineno, node.end_col_offset)
                
                start_mark = self._get_mark_name(node.lineno, node.col_offset) 
                if not start_mark in self.mark_names():
                    self.mark_set(start_mark, index1)
                    self.mark_gravity(start_mark, tk.LEFT)
                
                end_mark = self._get_mark_name(node.end_lineno, node.end_col_offset) 
                if not end_mark in self.mark_names():
                    self.mark_set(end_mark, index2)
                    self.mark_gravity(end_mark, tk.RIGHT)
Example #3
0
    def _load_expression(self, filename, text_range):
        whole_source, _ = misc_utils.read_python_file(filename)
        root = ast_utils.parse_source(whole_source, filename)
        self._main_range = text_range
        assert self._main_range is not None
        main_node = ast_utils.find_expression(root, text_range)
        
        source = ast_utils.extract_text_range(whole_source, text_range)
        debug("EV.load_exp: %s", (text_range, main_node, source))
        
        self.delete("1.0", "end")
        self.insert("1.0", source)
        
        # create node marks
        def _create_index(lineno, col_offset):
            local_lineno = lineno - main_node.lineno + 1
            if lineno == main_node.lineno:
                local_col_offset = col_offset - main_node.col_offset
            else:
                local_col_offset = col_offset
                
            return str(local_lineno) + "." + str(local_col_offset)

        for node in ast.walk(main_node):
            if "lineno" in node._attributes:
                index1 = _create_index(node.lineno, node.col_offset)
                index2 = _create_index(node.end_lineno, node.end_col_offset)
                
                start_mark = self._get_mark_name(node.lineno, node.col_offset) 
                if not start_mark in self.mark_names():
                    self.mark_set(start_mark, index1)
                    self.mark_gravity(start_mark, tk.LEFT)
                
                end_mark = self._get_mark_name(node.end_lineno, node.end_col_offset) 
                if not end_mark in self.mark_names():
                    self.mark_set(end_mark, index2)
                    self.mark_gravity(end_mark, tk.RIGHT)
Example #4
0
    def _update(self, event):
        editor = get_workbench().get_editor_notebook().get_current_editor()

        if not editor:
            self._current_code_view = None
            return

        self._current_code_view = editor.get_code_view()
        self._current_source = self._current_code_view.get_content()
        selection = self._current_code_view.get_selected_range()

        self._clear_tree()

        try:
            root = ast_utils.parse_source(self._current_source)
            selected_ast_node = ast_utils.find_closest_containing_node(
                root, selection)

        except Exception as e:
            self.tree.insert("", "end", text=str(e), open=True)
            traceback.print_exc()
            return

        def _format(key, node, parent_id):

            if isinstance(node, ast.AST):
                fields = [(key, val) for key, val in ast.iter_fields(node)]

                value_label = node.__class__.__name__

            elif isinstance(node, list):
                fields = list(enumerate(node))
                if len(node) == 0:
                    value_label = "[]"
                else:
                    value_label = "[...]"
            else:
                fields = []
                value_label = repr(node)

            item_text = str(key) + "=" + value_label
            node_id = self.tree.insert(parent_id,
                                       "end",
                                       text=item_text,
                                       open=True)
            if node == selected_ast_node:
                self.tree.see(node_id)
                self.tree.selection_add(node_id)

            if hasattr(node, "lineno") and hasattr(node, "col_offset"):
                self.tree.set(node_id, "lineno", node.lineno)
                self.tree.set(node_id, "col_offset", node.col_offset)

                range_str = str(node.lineno) + '.' + str(node.col_offset)
                if hasattr(node, "end_lineno") and hasattr(
                        node, "end_col_offset"):
                    self.tree.set(node_id, "end_lineno", node.end_lineno)
                    self.tree.set(node_id, "end_col_offset",
                                  node.end_col_offset)
                    range_str += "  -  " + str(node.end_lineno) + '.' + str(
                        node.end_col_offset)
                else:
                    # fallback
                    self.tree.set(node_id, "end_lineno", node.lineno)
                    self.tree.set(node_id, "end_col_offset",
                                  node.col_offset + 1)

                self.tree.set(node_id, "range", range_str)

            for field_key, field_value in fields:
                _format(field_key, field_value, node_id)

        _format("root", root, "")
Example #5
0
 def _copy_to_clipboard(self, event):
     self.clipboard_clear()
     if self._current_source is not None:
         pretty_ast = ast_utils.pretty(
             ast_utils.parse_source(self._current_source))
         self.clipboard_append(pretty_ast)
Example #6
0
    def _update(self, event):
        if not self.winfo_ismapped():
            return

        editor = get_workbench().get_editor_notebook().get_current_editor()

        if not editor:
            self._current_code_view = None
            return

        new_cw = editor.get_code_view()
        new_source = new_cw.get_content_as_bytes()
        if self._current_code_view == new_cw and self._current_source == new_source:
            return

        self._current_code_view = new_cw
        self._current_source = new_source
        selection = self._current_code_view.get_selected_range()

        self._clear_tree()

        if not self._current_source.strip():
            return

        try:
            root = ast_utils.parse_source(self._current_source, fallback_to_one_char=True)
            selected_ast_node = _find_closest_containing_node(root, selection)

        except Exception as e:
            self.tree.insert("", "end", text=str(e), open=True)
            logger.exception("Could not select AST node", exc_info=e)
            return

        def _format(key, node, parent_id):

            if isinstance(node, ast.AST):
                fields = list(ast.iter_fields(node))

                value_label = node.__class__.__name__

            elif isinstance(node, list):
                fields = list(enumerate(node))
                if len(node) == 0:
                    value_label = "[]"
                else:
                    value_label = "[...]"
            else:
                fields = []
                value_label = repr(node)

            item_text = str(key) + "=" + value_label
            node_id = self.tree.insert(parent_id, "end", text=item_text, open=True)
            if node == selected_ast_node:
                self.tree.see(node_id)
                self.tree.selection_add(node_id)

            if hasattr(node, "lineno") and hasattr(node, "col_offset"):
                self.tree.set(node_id, "lineno", node.lineno)
                self.tree.set(node_id, "col_offset", node.col_offset)

                range_str = str(node.lineno) + "." + str(node.col_offset)
                if hasattr(node, "end_lineno") and hasattr(node, "end_col_offset"):
                    self.tree.set(node_id, "end_lineno", node.end_lineno)
                    self.tree.set(node_id, "end_col_offset", node.end_col_offset)
                    range_str += "  -  " + str(node.end_lineno) + "." + str(node.end_col_offset)
                else:
                    # fallback
                    self.tree.set(node_id, "end_lineno", node.lineno)
                    self.tree.set(node_id, "end_col_offset", node.col_offset + 1)

                self.tree.set(node_id, "range", range_str)

            for field_key, field_value in fields:
                _format(field_key, field_value, node_id)

        _format("root", root, "")