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